如何在图像控件中获取位图图像的x和y坐标?

7
我在image-view控件中有一张图片。用户可以对这张图片进行平移和缩放,因此图片的x和y坐标会不断变化。有没有办法找出图像控件内当前设置的x和y坐标?任何相关代码都将更加有益。

1
请查看此链接,可能会有帮助:https://dev59.com/QXE95IYBdhLWcg3wHqQV - Uttam
1个回答

13
ImageView使用Matrix类进行缩放(放大)和平移(pan)。如果您可以获取矩阵,那么您可以从中检索缩放/平移视图的(左,上)坐标。
可在stackoverflow的一个帖子中找到可缩放和可平移的扩展ImageView的代码posts 在该帖子中,您将看到扩展的ImageView类具有作为成员变量用于缩放/平移的矩阵。
您可以使用以下代码从矩阵中获取缩放/平移后的ImageView(实际上是位图)的边界。
RectF r = new RectF(); 
matrix.mapRect(r);
Log.i(TAG, "Rect " + r.left + " " + r.top + " " + r.right + " " + r.bottom + " " + mOverAllScale + " ");

新添加的答案

要理解下面的代码,您需要查看此链接并理解。

翻译

当用户拖动图像时,屏幕坐标(绝对)和位图坐标不同步。 [您在位图上写入的任何内容都通过canvas(在onDraw()中)显示] 如果应用颜色,则用户会看到它应用于位图图像的不同区域。为了纠正这个问题,您需要进行翻译。翻译将更改用户输入坐标(即屏幕坐标)以使其成为位图坐标(由用户打算的) 以下代码片段将帮助您进行翻译。

假设用户输入坐标为(x,y),则:

RectF r = new RectF(); 
matrix.mapRect(r);
Log.i(TAG, "Rect " + r.left + " " + r.top + " " + r.right + " " + r.bottom + " " + mOverAllScale + " ");
float newX =  x - r.left;
float newY =  y - r.top;

您需要使用新的坐标代替(x,y)。

缩放

当用户捏合/拉伸时,位图会缩小/放大。您必须注意到原始位图不会发生变化,缩放仅从显示角度进行。 这再次导致屏幕和位图之间的同步丢失。应该在屏幕上应用的着色应反映在显示的图像中。 以下代码片段将帮助您进行缩放。

// mScalingFactor shall contain the scale/zoom factor
float scaledX = (event.getX() - r.left);
float scaledY = (event.getY() - r.top);

scaledX /= mScalingFactor;
scaledY /= mScalingFactor;

Shash


嗨@Shash316,这对我只在翻译和缩放方面有效。旋转怎么样,你能帮我吗?这是我最后的问题了。非常感谢。 - donmj
@Shash316 Log.i(TAG, "矩形 " + r.left + " " + r.top + " " + r.right + " " + r.bottom + " " + mOverAllScale + " "); - r.left / r.top / r.right / r.bottom 这些值是以像素为单位的吗? - Aniruddha

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