Android缩放后的Bitmap/Canvas偏移

5
如果我有一个画布,在上面绘制一个位图,就像这样:
canvas.drawBitmap(bmLargeImage, srcRect, destRect, paint);

我会按比例缩放位图:

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

我希望能够获取Bitmap缩放后的位置。如果在缩放之前的位置是(0, 0),那么在缩放后就会产生偏移,我需要知道这个偏移量。有什么方法可以获得它吗?

谢谢,对于这个简单的问题感到抱歉,我是新手...


你需要计算它,这里有一个提示:https://dev59.com/o1nUa4cB1Zd3GeqPZ2TO#6750631 - Lumis
如果我有一个 objectOldX = 0,并且 pivotX 是 360,scaleX 是 1.3,那么新的对象将是 0 + (0 - 360)*1.3,这给出了-468... 嗯...现在要检查一下。 - Sunne Rotterz
3个回答

15

好的,让我们试着找出这个问题的最佳计算公式。

canvas.scale(scaleX, scaleY, pivotX, pivotY);  

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

对于objectNewY同样适用。位图的新宽度和高度当然将是旧尺寸和比例的倍数。


这太棒了!你能给我一个关于如何在其他角落做到这一点的例子吗?我是新手,我知道,我缺乏数学知识 :( 非常感谢你! - Sunne Rotterz
有两种方法。一种是使用相同的公式计算对角线的另一个角落,另一种是计算新的尺寸并将其添加到上述代码生成的左上位置的新坐标中。 - Lumis
2
我不能给你点赞,因为我是新手,否则会给你世界上所有的声望。:) 谢谢。 - Sunne Rotterz
有其他角落的示例吗...:( 我无法处理它们...请。 - Awais Tariq
1
我本来要发布关于画布限制的问题,但是我找到了你的公式。我该怎么感谢你呢?:)你真的帮了我很大的忙。 非常感谢你,谢谢你,谢谢你,谢谢你! - Bhavesh Hirpara

4
我认为最干净的解决方案是使用您正在操作的画布的基础变换矩阵。
在Android中,有可用的canvas.getMatrix(Matrix cmt)方法来获取它。变换矩阵将把您投掷到屏幕坐标中的任何世界空间点进行转换。只需使用matrix.mapPoints(float[] points),您就可以做到这一点。
FYI,您也可以轻松地反过来做。如果您想知道哪个屏幕坐标映射到哪个世界空间点,例如点击; 反向矩阵可用于此。它可以通过matrix.invert(Matrix out)方法获得。然后使用它的mapPoints()进行坐标映射。

这里是官方文档:mapPoints()invert()getMatrix()


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接