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

Tho*_* H. 8 java android imageview

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

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

正如您在第二张图片中看到的那样,就我观察到的ImageView而言getX(),getY()当图像位于左上角时,就像图像的左上角位于DISPLAY的左上角一样返回坐标ACTIVITY WINDOW.

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


图片:

第一张图片

第二张照片

Tho*_* H. 14

我还是不知道到底为什么getX(),getY(),setX(),并setY()不能代表在屏幕上查看的位置,但我想通了,如何让屏幕上的视图对象的实际位置:getLocationOnScreen(coordinates).coordinates2位int数组在哪里(int [2]).

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

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

image.getLocationOnScreen(img_coordinates);
Run Code Online (Sandbox Code Playgroud)

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

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

x_center = (double)img_coordinates[0] + image.getWidth()/2.0;
y_center = (double)img_coordinates[1] + image.getHeight()/2.0;
Run Code Online (Sandbox Code Playgroud)

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