如何在android中获得触控位置?

如何在android中获得触控位置?,android,Android,我需要在android中获得触摸开始位置(X,Y)、触摸移动位置和触摸结束位置 @Override public boolean onTouch(View v, MotionEvent event) { float x = event.getX(); float y = event.getY(); return true; } 这三种情况下,您可以对不同类型的事件做出反应,在本例中,再次轻敲、拖动或抬起手指。补充答案 给定一个OnTou

我需要在android中获得触摸开始位置(X,Y)、触摸移动位置和触摸结束位置

@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }
这三种情况下,您可以对不同类型的事件做出反应,在本例中,再次轻敲、拖动或抬起手指。

补充答案 给定一个
OnTouchListener

private View.OnTouchListener handleTouch = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.i("TAG", "touched down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i("TAG", "moving: (" + x + ", " + y + ")");
                break;
            case MotionEvent.ACTION_UP:
                Log.i("TAG", "touched up");
                break;
        }

        return true;
    }
};
在某些视图上设置:

myView.setOnTouchListener(handleTouch);
这将为您提供相对于指定了触摸侦听器的视图的触摸事件坐标。视图的左上角是
(0,0)
。如果将手指移到视图上方,则
y
将为负数。如果将手指移到视图左侧,则
x
将为负数

int x = (int)event.getX();
int y = (int)event.getY();
如果需要相对于设备屏幕左上角的坐标,请使用原始值

int x = (int)event.getRawX();
int y = (int)event.getRawY();
相关的

    • 这是Koltin风格,我在我的项目中使用了它,效果非常好:

      this.yourview.setOnTouchListener(View.OnTouchListener { _, event ->
              val x = event.x
              val y = event.y
      
              when(event.action) {
                  MotionEvent.ACTION_DOWN -> {
                      Log.d(TAG, "ACTION_DOWN \nx: $x\ny: $y")
                  }
                  MotionEvent.ACTION_MOVE -> {
                      Log.d(TAG, "ACTION_MOVE \nx: $x\ny: $y")
                  }
                  MotionEvent.ACTION_UP -> {
                      Log.d(TAG, "ACTION_UP \nx: $x\ny: $y")
                  }
              }
              return@OnTouchListener  true
          })
      

      这是可行的,但是在我的测试中,添加了侦听器的视图不应该被其他视图覆盖。为了获得屏幕上触摸位置的绝对坐标,我添加了一个framelayout作为基本视图,并在其顶部添加了带有侦听器的视图。不要忘记
      返回false
      ,否则它将消耗触控。@lenooh,
      getRawX()
      getRawY()
      应返回添加侦听器的任何视图上触控位置的绝对坐标。但是你是对的,如果上面有另一个视图返回
      true
      ,那么就不会有较低的视图收到触摸事件的通知。苏拉奇:没错。由于我使用框架布局,我将视图设置为“matchParent”,因此
      getX()
      getY()
      工作正常(无需
      getRawX/Y()
      )。@Suragch是否可以录制触摸,即使触摸被其他视图覆盖或有类似按钮的子对象?@vigneshkumar,从下到上都会通知视图触摸事件(请参阅我答案底部的链接),这样您就可以在InterceptTouchEvent中记录事件,然后返回
      false
      ,这样事件就可以正常处理。为什么返回false?返回值true意味着触摸事件已被处理,这将阻止事件传播,反之亦然。
      this.yourview.setOnTouchListener(View.OnTouchListener { _, event ->
              val x = event.x
              val y = event.y
      
              when(event.action) {
                  MotionEvent.ACTION_DOWN -> {
                      Log.d(TAG, "ACTION_DOWN \nx: $x\ny: $y")
                  }
                  MotionEvent.ACTION_MOVE -> {
                      Log.d(TAG, "ACTION_MOVE \nx: $x\ny: $y")
                  }
                  MotionEvent.ACTION_UP -> {
                      Log.d(TAG, "ACTION_UP \nx: $x\ny: $y")
                  }
              }
              return@OnTouchListener  true
          })