【问题标题】:Get real x and y coordinates of users touch获取用户触摸的真实 x 和 y 坐标
【发布时间】:2015-07-31 17:15:25
【问题描述】:

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

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

【问题讨论】:

  • 您从哪里接收事件?事件是来自图像视图父级的触摸事件,还是来自图像视图本身?
  • 我认为你应该参考这个链接:How to get actionbar height。这将有助于计算正确的触摸 X 和 Y 坐标。我也遇到过这个问题。
  • 所以您从屏幕上的绝对坐标开始,需要转换为相对于图像左上角的坐标?
  • @GilMoshayof 事件是从 onTouch 监听器接收到的。
  • @Joey 没有正确映射点,似乎坐标绑定到 ImageView,它填满了整个布局,从 ActionBar 下方开始。

标签: android bitmap imageview ontouchlistener


【解决方案1】:

我使用这段代码来获取屏幕上的实际触摸轴:

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

希望这对你也有用

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        试试这个方法

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

        【讨论】:

          【解决方案5】:

          重写 onTouchEvent(MotionEvent event) 然后调用 event.getX() 和 event.getY() 来获取用户触摸位置的坐标位置[它们将是浮动]。 (作者:@antonyt)

          【讨论】:

          • 不是我要找的。​​span>
          【解决方案6】:

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

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

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

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

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

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

          希望这会奏效!


          制作演示需要更长的时间,宁愿发表评论但仍作为答案发表,以便有一天我可以通过一些示例代码进行改进。

          【讨论】:

          • 我不确定这如何帮助我获得正确的坐标。
          猜你喜欢
          • 2017-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-25
          • 2013-03-19
          • 1970-01-01
          • 2016-02-06
          • 1970-01-01
          相关资源
          最近更新 更多