2012-05-04 129 views
5

我试图展示一张图片,该图片可以放大和平移,并且可以随着指南针读数旋转。通过下面的代码,所有这三种行为都是有用的,但它们相互影响。在Android画布中同时旋转,平移和缩放位图

这里是我想达到的目标:
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

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

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| 

而是让你需要首先使用预翻译()函数像这样,这将周围图像的角旋转:

Mt.preTranslate(-centerX,-centerY); 

并应用Mt之前应用M,然后在您需要申请之后,图片-Mt

+0

旋转翻译似乎只是抵消旋转,但我也有这种感觉,这就是我需要d。 Android矩阵是3x3,所以我猜他们已经是仿射变换? – modemuser

+0

那么也许尝试直接设置矩阵,而不是使用preRotate,preScale方法?所以你的矩阵应该像 – Dan

+0

以上的帖子中的编辑一样。使用此矩阵,平移可以工作,但缩放也会旋转图片,旋转也会缩放图片,旋转发生在图片的一角。这就像whac-a-mole,但是感谢你的输入。 – modemuser

相关问题