为什么在相对布局中,ImageView的getX、getY、setX和setY方法不代表实际值?

9
我正在尝试制作一个简单的应用程序,以更好地理解如何在Android上使用触摸事件。现在,我的Activity只是将ImageView移动到屏幕上触摸的坐标(MotionEvent的坐标)。我可以通过应用一个简单的技巧来设置图像的新位置,该值由相对于图像位置的触摸坐标组成(getX()getY())。 dxdy变量负责存储这些相对值,使触摸保持在图像内。

现在,我想在Activity中放置2个ImageView,并仅为ImageView设置两个固定点。一旦用户将一个ImageView拖动到另一个ImageView的中心,两个图像就会交换位置,但要正确执行此操作,我希望获取图像中心的实际坐标。我已经注释了代码的某些部分,以显示问题。如您在第一张图片中所见,当视图创建时,图像坐标只是(0, 0),无论它在哪里(只要初始位置被定义为布局参数,例如CENTER_IN_PARENT)。

如您所见在第二张图片中,就我所观察到的,ImageView的getX()和getY()方法返回的坐标好像是该图片位于ACTIVITY WINDOW左上角时,以DISPLAY的左上角为原点计算出来的。我想了解这种情况发生的原因,并且是否有人知道如何获得ImageView的坐标,可以直接与MotionEvent的坐标进行比较。

图片:

第一张图片

第二张图片

1个回答

14

我仍然不确定为什么getX(), getY(), setX(), 和 setY()方法不能代表视图在屏幕上的位置,但我找到了如何获取视图对象在屏幕上实际位置的方法:getLocationOnScreen(coordinates)。这里的coordinates是一个2位整数数组(int[2])。

例如,要获取我的ImageView image 左上角的真实值,只需要执行以下操作:

int[] img_coordinates = new int[2];
ImageView image = (ImageView) findViewById(R.id.myImage);

image.getLocationOnScreen(img_coordinates);

然后我可以将这些坐标与Touch事件的getRawXgetRawY进行比较。

如果我想要获得我的视图的中心点,我只需要这样做:

x_center = (double)img_coordinates[0] + image.getWidth()/2.0;
y_center = (double)img_coordinates[1] + image.getHeight()/2.0;

我希望这也能对其他人有所帮助,我花了一些时间才找到这种方法,但实际上我不确定它是否是最好的方法,但对我来说已经足够。


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