Android画布中位图的同时旋转,平移和缩放

时间:2012-05-04 09:24:49

标签: android matrix android-canvas

我正在尝试显示一张可以缩放和平移的图片,并使用指南针读取旋转。使用下面的代码,所有三种操作都有效,但它们相互影响。

这是我想要实现的目标:
1.围绕屏幕中心旋转
2.缩放将图片的相同部分留在中心
3.平移到图片中所需的位置

以下是以下代码实际发生的情况:
1.旋转按预期工作,围绕屏幕中心
2.缩放有效,但它会围绕图片的中心缩放 3.如果angle为零,翻译只能按预期工作,否则它会向错误的方向移动

// the center of the view port
float centerX = screen.right/2;
float centerY = screen.bottom/2;

Matrix m = new Matrix();
m.preRotate(angle, centerX, centerY);
m.preScale(mScaleFactor, mScaleFactor, centerX, centerY);

// scaling the amount of translation, 
// rotating the translation here gave crazy results
float x = mPosX / mScaleFactor;
float y = mPosY / mScaleFactor;
m.preTranslate(x, y);

canvas.drawBitmap(pic, m, null);

如果我先翻译,然后再翻转,则翻译会按预期工作,但旋转不再是视口的中心。

如何在不相互影响的情况下应用所有三种转换?

1 个答案:

答案 0 :(得分:1)

我不确定图像中心周围的缩放,但是如果翻译方向错误,是不是因为你旋转图像而不是翻译?也许尝试这样的事情:

float x = (mPosX*(cos(angle) + sin(angle)) / mScaleFactor;
float y = (mPosY*(cos(angle) - sin(angle)) / mScaleFactor;
m.preTranslate(x, y);

矩阵对象也有直接应用affine transformation的方法吗?因为那时你不需要考虑操作的顺序。

仿射变换可能看起来像这样:

M = |mScaleFactor*cos(angle)       sin(angle)            x|
    |     -sin(angle)          mScaleFactor*cos(angle)   y|
    |          0                         0               1|

但是这会围绕图像的一角旋转,所以你需要首先使用preTranslate()函数:

Mt.preTranslate(-centerX,-centerY);

在应用M之前应用Mt to pic,然后在需要应用-Mt

之后