Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 获取用户触摸的真实x和y坐标_Android_Bitmap_Imageview_Ontouchlistener - Fatal编程技术网

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

Android 获取用户触摸的真实x和y坐标,android,bitmap,imageview,ontouchlistener,Android,Bitmap,Imageview,Ontouchlistener,我需要将onTouch事件的X,Y坐标映射到ImageView中的位图X,Y坐标。为此,我使用以下方法 然而,这种方法似乎只在以下情况下起作用: a) 完全放大图像(一直放大) b) 在任何情况下,如果我使我的应用程序全屏运行 final int index = event.getActionIndex(); touchLocation = new float[] { event.getX(index), event.getY(index) }; Matrix matr

我需要将onTouch事件的X,Y坐标映射到ImageView中的位图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的高度,但这并不总是有效


奇怪的是,在全屏上,无论我是否完全放大或缩小我的图像,我都会得到正确的坐标计算,但对于任何其他活动类型,这都不会正确映射点

我无法从粘贴的代码中分辨出确切的问题是什么,但看起来您应该使用:并在计算时考虑到这一点。

试试这种方法

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坐标

覆盖onTouchEvent(MotionEvent事件),然后调用event.getX()和event.getY()以获得用户触摸的坐标位置[它们将是浮动的]。(by:@antonyt)

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

步骤2:写入/重写onInterceptTouchEvent方法

步骤3:制作一个接口来发送/接收所需参数

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

步骤5:在活动/片段中,使用implement接口创建
CustomFrameLayout
的对象

步骤6:在自定义布局的重写方法中,通过接口将值传递给activity

希望这能奏效



制作一个演示会花费更长的时间,我更愿意以评论的形式发布,但仍然以答案的形式发布,以便有一天我可以使用一些示例代码进行改进。

我使用此代码获得屏幕上的实际触摸轴:

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();
}

希望这也适用于您

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

您从哪里接收事件?事件是来自图像视图父级的触摸事件,还是来自图像视图本身?我认为您应该参考以下链接:。这将有助于计算正确的触摸X和Y坐标。我也遇到了这个问题。所以您从屏幕上的绝对坐标开始,需要转换为相对于图像左上角的坐标吗?@GilMoshayof事件是从onTouch侦听器接收的。@Joey没有正确映射点,似乎坐标绑定到ImageView,这填充了整个布局开始对,下面是动作条。不是我要找的。我不知道这如何帮助我获得正确的坐标。