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

如果我有一个canvas,我在上面绘制一个像这样的位图:

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

我缩放位图:

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

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

谢谢,抱歉这个简单的问题,新手在这里……

好吧,让我们尝试找出最好的配方

 canvas.scale(scaleX, scaleY, pivotX, pivotY); if (scaleX >= 1){ objectNewX = objectOldX + (objectOldX - pivotX)*(scaleX - 1); }else{ objectNewX = objectOldX - (objectOldX - pivotX)*(1 - scaleX); } 

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

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

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

仅供参考,您也可以通过其他方式轻松完成。 如果您想知道哪个屏幕坐标映射到世界空间中的哪个点,例如用于点击; 逆矩阵可以用于此。 它可以通过matrix.invert(Matrix out)方法获得。 然后使用其mapPoints()进行坐标映射。

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

如果您想知道屏幕相对于原始canvas的角落,可以使用canvas.getClipBounds() 。 这将返回一个Rect ,其边缘坐标相对于原始canvas。 例如,如果你开始使用320 x 480的canvas大小并打电话

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

接着

 canvas.getClipBounds(); 

你将有一个Rect (称之为rect )在哪里

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