比例尺后的Android Bitmap / Canvas偏移量

时间:2011-07-26 19:10:55

标签: java android graphics android-canvas

如果我有画布,我会在其上绘制这样的位图:

canvas.drawBitmap(bmLargeImage, srcRect, destRect, paint);

我缩放位图:

canvas.scale(1.5f, 1.5f, 450, 250);

我希望在比例后得到位图的位置。如果比例前的位置是(0,0),那么在比例之后有一个偏移,我需要那个偏移..我怎么能得到它?

感谢和抱歉这个简单的问题,新手在这里...

3 个答案:

答案 0 :(得分:14)

好的,让我们试着找出这个

的最佳公式
canvas.scale(scaleX, scaleY, pivotX, pivotY);  

if (scaleX >= 1){    
  objectNewX = objectOldX + (objectOldX - pivotX)*(scaleX - 1); 
}else{   
  objectNewX = objectOldX - (objectOldX - pivotX)*(1 - scaleX); 
}

对于objectNewY也一样。位图的新宽度和高度当然是旧尺寸和比例的倍数。

答案 1 :(得分:4)

我相信最干净的解决方案是使用您正在操作的Canvas底层转换矩阵。

在Android中,有canvas.getMatrix(Matrix cmt)方法可以产生它。变换矩阵将您投射的世界空间中的任何点变换为屏幕坐标。只需使用matrix.mapPoints(float[] points)就可以了。

仅供参考,你也可以轻松地做到这一点。如果您想知道哪个屏幕坐标映射到世界空间中的哪个点,例如用于攻丝;逆矩阵可以用于此。它可以通过matrix.invert(Matrix out)方法获得。然后使用其mapPoints()作为坐标映射。

以下是官方文档: mapPoints()invert()getMatrix()

答案 2 :(得分:2)

如果您想知道屏幕相对于原始画布的角落,可以使用canvas.getClipBounds()。这将返回一个Rect,其边缘坐标相对于原始画布。例如,如果您从画布尺寸为320 x 480开始并调用

canvas.scale(2, 2, getWidth()/2, getHeight()/2);

然后

canvas.getClipBounds();

您将拥有Rect(称之为rect

rect.top == 120
rect.bottom == 360
rect.left == 80
rect.right == 240