Android - 点击图片以使其缩放,并可选择旋转以填充屏幕

时间:2012-02-28 07:49:25

标签: android android-layout android-animation

我有一个包含ImageViews的滚动视图。我希望用户能够点击其中一个图像来设置它的动画,以便按比例放大以填充整个屏幕(顶部的状态栏除外)。如果图像具有横向比率,我希望图像在动画期间旋转90度。滚动视图中的图像不会被裁剪,但是一旦它们按比例放大,我就会裁剪图像以填充可用的屏幕。

我已尝试将第二个ImageView直接添加到原始图像上。这个新视图会覆盖onDraw方法来处理canvas.rotate(rotation, canvas.getWidth() / 2, canvas.getHeight() / 2);的旋转,然后是一个自定义动画类,它通过计算新的LayoutParams来进行缩放。它适用于肖像图像,几乎适用于景观图像,但过于扩展。

我无法理解ImageView的边界与我正在旋转的底层Canvas之间的关系。请注意,我的目标是Android 2.2,否则我会使用view.setRotation()方法。

以下是一些代码:

public class ImageZoom extends ImageView
{
  float rotation = 0;

  // Constructors here...

  @Override
  protected void onDraw(Canvas canvas) {
    canvas.save();
    if(rotation != 0)
    {
      canvas.rotate(rotation, canvas.getWidth() / 2, canvas.getHeight() / 2);
    }
    super.onDraw(canvas);
    canvas.restore();
  }
}

动画:

public class ImageZoomAnimation extends Animation {
    public ImageZoomAnimation(View view, View parent) {
        this.view = (ImageZoom)view;
        this.parent = parent;

        RelativeLayout.LayoutParams initParams = (RelativeLayout.LayoutParams)view.getLayoutParams();
        this.startWidth = initParams.width;
        this.startHeight = initParams.height;
        isRotate = startWidth > startHeight;
        this.startLeftMargin = initParams.leftMargin;
        this.startTopMargin = initParams.topMargin;;
        this.endWidth = parent.getWidth();
        this.endHeight = parent.getHeight();
        this.setInterpolator(new LinearInterpolator());
        this.setDuration(2000);
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        int newWidth = (int) (startWidth + ((endWidth - startWidth) * interpolatedTime));
        int newHeight = (int) (startHeight + ((endHeight - startHeight) * interpolatedTime));
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(newWidth, newHeight);
        params.leftMargin = (int)(startLeftMargin * (1 - interpolatedTime));
        params.topMargin = (int)(startTopMargin * (1 - interpolatedTime));
        if(isRotate)
        {
            view.setRotation(90 * interpolatedTime);
        }
        view.setLayoutParams(params);
    }
}

我有一种感觉我会以错误的方式解决这个问题。让画布在一个类中旋转并且在另一个类中使用布局参数进行捣乱似乎是错误的。提前感谢您的帮助......

0 个答案:

没有答案