获取用户触摸的实际x和y坐标

12

我需要将onTouch事件的X、Y坐标映射到ImageView内Bitmap的X、Y坐标上,为此我采用以下方法。

然而,这种方法似乎只在以下情况下有效:
a)完全缩放图像(全部放大)
b)如果我将应用程序设置为全屏,则在任何情况下都有效。

  final int index = event.getActionIndex();
  touchLocation = new float[] {
    event.getX(index), event.getY(index)
  };

  Matrix matrix = new Matrix();
  ImageView view = getImageView();
  view.getImageMatrix().invert(matrix);

  matrix.postTranslate(view.getScrollX(), view.getScrollY());
  matrix.mapPoints(touchLocation);
  // touchLocation[0] is real x and [1] is real y  

然而,我的活动是一个ActionBar活动,因此在Y轴上会有一点错误的位置。我尝试减去ActionBar和StatusBar的高度,但这并不总是有效。

奇怪的是,在全屏状态下,无论我将图像完全放大还是缩小,我始终能够正确地计算出坐标,但在任何其他类型的Activity中,这都无法正确地映射点。


你从哪里接收到该事件的?该事件来自于ImageView的父容器的触摸事件,还是来自于ImageView本身的触摸事件? - Gil Moshayof
我认为你应该参考这个链接:如何获取ActionBar的高度。它将有助于计算正确的触摸X和Y坐标。我也遇到了这个问题。 - Joey
所以你从屏幕上的绝对坐标开始,需要将其转换为相对于图像左上角的坐标? - Jacob Phillips
@GilMoshayof 事件从 onTouch 监听器中接收到。 - Sterling Duchess
@Joey似乎无法正确映射点,坐标似乎绑定到填充整个布局并从ActionBar正下方开始的ImageView上。 - Sterling Duchess
抱歉,我已经搜索了之前的问题,并找到了这个如何将坐标转换。希望现在能对你有所帮助 :) - Joey
6个回答

6
我使用这段代码来获取屏幕上触摸的实际轴:
PointF p = new PointF(event.getX(), event.getY());
View v = this;// your view
View root = v.getRootView();
while (v.getParent() instanceof View && v.getParent() != root) {
  p.y += v.getTop();
  p.x += v.getLeft();
  v = (View) v.getParent();
}

希望这对您也有用


4

3

请确保您的Actionbar和状态栏高度以像素为单位而不是dp为单位,并且您还可以尝试使用getRawX()和 getRawY()而不是getX(),getY()。


2

重写 onTouchEvent(MotionEvent event) 方法,然后调用 event.getX() 和 event.getY() 方法获取用户触摸的坐标位置(它们将是浮点数)。 (by:@antonyt)


不是我要找的。 - Sterling Duchess

2

步骤1:在您的应用程序中创建一个自定义的CustomFrameLayout,扩展 FrameLayout ,可以在构造函数中使用一个接口对象。(接口将在步骤3中创建)

步骤2:编写/覆盖 onInterceptTouchEvent 方法。

步骤3:创建一个接口以发送/接收所需参数。

步骤4:在您的活动/片段中实现在步骤3中创建的接口和方法

步骤5:在您的活动/片段中创建带有实现接口的 CustomFrameLayout 的对象。

步骤6:在自定义布局的覆盖方法中,通过接口将值传递到活动中

希望这能够起作用!


制作演示需要一些时间,本来想作为评论发布,但仍然作为答案发布,以便有一天我可以通过一些示例代码进行改进。


我不确定这如何帮助我获取正确的坐标。 - Sterling Duchess

2

试试这个方法

int[] viewCoords = new int[2];
imageView.getLocationOnScreen(viewCoords);
int touchX = (int) event.getX();
int touchY = (int) event.getY();

int imageX = touchX - viewCoords[0]; // viewCoords[0] is the X coordinate
int imageY = touchY - viewCoords[1]; // viewCoords[1] is the y coordinate

你可以通过这种方式获取x和y坐标。

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