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

我正在尝试创建一个简单的应用程序,以便更好地了解如何在Android上使用Touch事件。 现在,我的Activity只是将ImageView移动到屏幕上触摸的坐标(MotionEvent的坐标)。 我可以设法通过应用一个简单的技巧将图像的新位置设置为由相对于图像位置的触摸坐标( getX()getY() )组成的值来实现。 dxdyvariables负责存储此相对值,因此触摸在图像中保持不变。

现在我想在Activity中放置2个ImageViews并且只有两个固定的ImageViews点,一旦用户在另一个ImageView的中心拖动一个ImageView,这两个图像会切换位置,但为了正确地做到这一点,我想获得真实的坐标图像中心。 我评论了代码中使其正常工作以显示问题的部分。 正如您在创建视图时在第一张图片中看到的那样,无论图像坐标位于何处(只要初始位置定义为像CENTER_IN_PARENT这样的布局参数(0, 0) ,图像坐标就是(0, 0) CENTER_IN_PARENT )。

正如你在第二张图片中看到的那样,就我观察到的ImageView的getX()getY()返回坐标,好像图像的左上角位于DISPLAY的左上角,当图像被定位时在ACTIVITY WINDOW的左上角。

我想了解为什么会发生这种情况,如果有人知道如何实际获得ImageView的坐标,可以直接与MotionEvent的坐标进行比较。


图片:

第一张图片

第二张照片

我仍然不知道为什么getX()getY()setX()setY()不代表屏幕上View的位置,但我想出了如何获取视图对象的实际位置在屏幕上: getLocationOnScreen(coordinates) 。 其中coordinates是2位int数组( int [2] )。

例如,要获得与ImageView image左上角相对应的实际值,我只需要执行以下操作:

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

然后我可以将这些坐标与Touch-event的getRawXgetRawY

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

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

我希望这对其他人也有帮助,我花了一段时间才find这种方法,我实际上不确定它是否是最好的方法,但它对我有用。