如何在Android中获得Touch位置?


92

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

Answers:


169
@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;
}

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


7
为什么返回假?
Daniel Reyhanian

1
返回值true表示已处理触摸事件,并且将阻止该事件传播,反之亦然。
整日

27

补充答案

给定一个 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();

有关


这有效,但是在我的测试中,添加了侦听器的视图不应被其他视图覆盖。为了获得屏幕上触摸位置的绝对坐标,我添加了一个框架布局作为基本视图,并在其顶部添加了带有侦听器的视图。不要忘记这样做,return false否则会消耗触摸效果。
lenooh

@lenooh,getRawX()并且getRawY()应该在添加了侦听器的任何视图上返回触摸位置的绝对坐标。但是您是对的,如果在其之上还有另一个视图返回true,则不会向任何较低的视图通知触摸事件。
Suragch

苏拉奇:完全正确。由于我使用的FrameLayout,我认为设置为“matchParent”所以getX()getY()工作就好了(不需要getRawX/Y())。
lenooh

@Suragch无论是否有其他视图覆盖或有类似按钮的子项,是否仍要记录触摸?
vignesh kumar,

@vigneshkumar,从下至上将触摸事件通知视图(请参阅我答案底部的链接),因此您可以记录该事件onInterceptTouchEvent,然后返回该事件,false以便按正常方式处理该事件。
Suragch

10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }

0

这是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
    })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.