如果我有画布,我会在其上绘制这样的位图:
canvas.drawBitmap(bmLargeImage, srcRect, destRect, paint);
我缩放位图:
canvas.scale(1.5f, 1.5f, 450, 250);
我希望在比例后得到位图的位置。如果比例前的位置是(0,0),那么在比例之后有一个偏移,我需要那个偏移..我怎么能得到它?
感谢和抱歉这个简单的问题,新手在这里...
答案 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