在Android中使用旋转角度缩放自定义视图内的图像

时间:2014-07-06 19:54:21

标签: android matrix rotation scale android-custom-view

嗯,这可能有点难以解释,但这是交易:我有一个自定义视图,其中有一个背景图像和一些其他较小的图像。当用户选择保存选项时,整个视图将缩放到某个分辨率,例如900x900px。因此,如果手机是720p,则图像将按比例放大,而如果屏幕为1080p则将按比例缩小。

如何完成缩放:

  • 我使用视图的布局参数并将宽度更改为900px。
  • 背景存储的图像完全是900px,所以当准备保存视图时,我只需重新加载背景图像 质量。
  • 所有其他小图片,以及它们的尺寸和在屏幕上的位置都会缩放。

因此,如果最初屏幕尺寸为720px宽度,当尺寸更改为900px时,我会在onMeasure

内计算比例因子
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, widthMeasureSpec);

        if (MeasureSpec.getSize(widthMeasureSpec) == 900) {
                scale = (900 - viewWidth) * 100.2f / viewWidth;
                prepareSaving();
        }
}

然后我在绘图时使用这个比例编号:

canvas.drawBitmap(myCachedImage, x + addScale(x), y + addScale(y), imagePaint);

,其中

private float addScale(float value) {
        if (scale == 0) {
            return 0;
        } else {
            return (value * scale / 100.2f);
        }
    }

这允许我在缩放的坐标处绘制位图,这可以按预期工作。 用户旋转图像时出现问题。在旋转我做:

public void rotateSticker(float degrees) {
     imageMatrix.setRotate(degrees, imageCenterX + addScale(imageCenterX), imageCenterY +imageCenterY ));
}

在onDraw中我做:

if (angle!=0{
   canvas.save(Canvas.MATRIX_SAVE_FLAG);
   canvas.setMatrix(imageMatrix);
   canvas.drawBitmap(myCachedImage, x + addScale(x), y + addScale(y), imagePaint);
   canvas.retore()
}else
{
   canvas.drawBitmap(myCachedImage, x + addScale(x), y + addScale(y), imagePaint);
}

这是我的问题:如果用户没有旋转,则所有缩放都正确完成,并且保存的图像看起来很好。如果有一个角度,在缩放时,图像不会在右边坐标中绘制,它会被移动,就像在下面的图像中一样 http://i.imgur.com/bFBHVF1.png

1 个答案:

答案 0 :(得分:0)

缩放和旋转的所有问题都是由图像矩阵引起的。当我切换到仅使用视图的canvas.rotate()时,一切都按预期工作。

相关问题