如何在Android中获得Touch位置?

How to get the Touch position in android?

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public boolean onTouchEvent(MotionEvent event)
{
    int x = (int)event.getX();
    int y = (int)event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
    }

    return false;
}

这三种情况是您可以对不同类型的事件做出反应,在此示例中再次点击或拖动或抬起手指。


补充答案

给定OnTouchListener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
    }
};

设置一些视图:

1
myView.setOnTouchListener(handleTouch);

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

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

如果您想要相对于设备屏幕左上角的坐标,请使用原始值。

1
2
int x = (int)event.getRawX();
int y = (int)event.getRawY();

有关

  • Android触摸事件是如何传递的?


1
2
3
4
5
6
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }

这是Koltin风格,我在我的项目中使用它并且它非常有效:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
x: $x
y: $y")
            }
            MotionEvent.ACTION_MOVE -> {
                Log.d(TAG,"ACTION_MOVE
x: $x
y: $y")
            }
            MotionEvent.ACTION_UP -> {
                Log.d(TAG,"ACTION_UP
x: $x
y: $y")
            }
        }
        return@OnTouchListener  true
    })

您可以实现一个Gesture演绎器,并在其onfling事件中从MotionEvent类中获取两个参数。您可以从中获取x和y坐标。请留意这篇文章了解更多详情

网格布局上的手势检测