我正在尝试显示一张可以缩放和平移的图片,并使用指南针读取旋转。使用下面的代码,所有三种操作都有效,但它们相互影响。
这是我想要实现的目标:
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);
如果我先翻译,然后再翻转,则翻译会按预期工作,但旋转不再是视口的中心。
如何在不相互影响的情况下应用所有三种转换?
答案 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
之后