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

时间:2015-07-16 17:16:39

标签: android bitmap imageview ontouchlistener

我需要将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的高度,但这并不总是有效。

奇怪的是,在全屏幕上无论我是否完全缩放我的图像都无关紧要我总是得到正确的坐标,但是对于任何其他活动类型,这都不会正确地映射点。

6 个答案:

答案 0 :(得分: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();
}

希望这对你也有用

答案 1 :(得分:4)

我无法从粘贴的代码中判断出确切的问题是什么,但看起来您应该使用:http://developer.android.com/reference/android/view/View.html#getLocationOnScreen(int[])并将其考虑在内进行计算。

答案 2 :(得分:3)

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

答案 3 :(得分: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坐标

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

第2步:写入/覆盖onInterceptTouchEvent方法。

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

步骤4:在您的活动/片段

中实施步骤3中创建的界面和方法

步骤5:在您的activity / fragment中创建具有实现接口的CustomFrameLayout对象。

步骤6:在自定义布局的重写方法中,通过界面将值传递给活动

希望这会奏效!

制作一个演示会花费更长的时间,而不是发布评论但仍然发布作为答案,这样我有一天可以通过一些示例代码进行改进。