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

Posted

技术标签:

【中文标题】如何在android中获得触摸位置?【英文标题】:How to get the Touch position in android? 【发布时间】:2011-03-29 10:53:01 【问题描述】:

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

【问题讨论】:

【参考方案1】:
@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;

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

【讨论】:

为什么返回false? true 的返回值意味着触摸事件已被处理,这将阻止事件传播,反之亦然。【参考方案2】:

补充答案

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

相关

How are Android touch events delivered?

【讨论】:

这可行,但是在我的测试中,添加侦听器的视图不应被其他视图覆盖。为了获得屏幕上触摸位置的绝对坐标,我添加了一个框架布局作为基本视图,并在其之上添加了带有监听器的视图。不要忘记return false,否则会消耗触摸。 @lenooh、getRawX()getRawY() 应该返回添加侦听器的任何视图上的触摸位置的绝对坐标。但是你是对的,如果它上面有另一个视图返回true,那么就不会通知较低的视图触摸事件。 Suragch:完全正确。因为我使用 FrameLayout,所以我将视图设置为“matchParent”,所以 getX()getY() 工作得很好(不需要 getRawX/Y())。 @Suragch 无论如何都可以记录触摸,即使它被其他视图覆盖或有孩子喜欢的按钮? @vigneshkumar,从底部向上通知视图触摸事件(请参阅我的答案底部的链接),因此您可以在onInterceptTouchEvent 中记录事件,然后返回false 所以事件被正常处理。【参考方案3】:
@Override
    public boolean onTouch(View v, MotionEvent event) 
       float x = event.getX();
       float y = event.getY();
       return true;
    

【讨论】:

【参考方案4】:

这是 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
    )

【讨论】:

以上是关于如何在android中获得触摸位置?的主要内容,如果未能解决你的问题,请参考以下文章

当所需的触摸次数超过一次时,如何获得 UILongPressGestureRecognizer 的触摸位置?

如何获得 SKShapeNode 的准确触摸位置?

在Android中如何获取手指触摸屏幕的多少?

在 Android 中使用谷歌地图在触摸位置添加标记

如何在视图内的特定位置触发 Android Lollipop 的涟漪效应,而不触发触摸事件?

Android 悬浮窗如何能让它和他的的下层一起响应触摸事件?