Android - 如何处理双指触控

8
文档对此有如下说明:
引导手势的动作事件是 ACTION_DOWN,它提供了第一个指针按下的位置。每当有额外的指针按下或抬起时,框架都会生成带有相应的 ACTION_POINTER_DOWN 或 ACTION_POINTER_UP 的动作事件。
因此,我在我的活动中重写了 onTouchEvent 函数:
@Override
public boolean onTouchEvent(MotionEvent MEvent) 
{

    motionaction = MEvent.getAction();

    if(motionaction == MotionEvent.ACTION_DOWN)
    {
        System.out.println("DEBUG MESSAGE POINTER1 " + MEvent.getActionIndex() );
    }

    if(motionaction == MotionEvent.ACTION_POINTER_DOWN)
    {
        System.out.println("DEBUG MESSAGE POINTER2 "  + MEvent.getActionIndex() );
    }

}

很遗憾,第二个if语句从未被执行。该活动包含2个视图和2个OnTouchListener,我知道只有在活动的视图不消耗事件时才会调用onTouchEvent,所以我尝试在侦听器中返回false,这样我就可以仅识别第一个手指触摸,但这会防止侦听器接收ACTION_UP事件,并且不允许我识别第二个手指触摸。我还尝试在侦听器中返回true,但在手动调用onTouchEvent函数后,这也只能让我识别第一个手指触摸。我的代码出了什么问题?
1个回答

20

我认为你的代码缺少了掩码操作,例如:

switch (motionaction & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_POINTER_DOWN:
}

这段代码应该可以检测 ACTION_POINTER_DOWN 事件。

祝好运,并告诉我们发生了什么。

Tommy Kwee


是的,这就是问题所在。使用ACTION_MASK添加“and”解决了问题。让我生气的是,在官方文档中没有提到这一点。 - Bemipefe
1
Bernipefe,我理解您的感受。在文档中犯错误是很常见的事情。这个错误可能是因为有时候您不需要进行掩码处理。我的建议是下次使用调试器查看传入的值,并检查是否有任何预期值。祝另一位Android粉丝好运! - The Original Android
1
如文档链接http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_move所述,此事件值ACTION_MOVE没有掩码。在ACTION_MOVE、ACTION_UP和ACTION_DOWN之间,没有掩码。当您检查ACTION_POINTER_DOWN时,有掩码。是的...我承认我刚注意到这一点。我相信您可以处理代码中的这种混淆。再次祝你好运。 - The Original Android
我有机会时可以检查您的问题。目前我的直觉是,由于您的不寻常请求,您可能无法做到这一点。也许让您的用户界面只需要一个手指就能操作是个好主意。我不了解您的应用程序。但请记住,俗话说得好,简单就是美。 - The Original Android
请参考此回答,了解为什么需要“masked”部分。 - dwb
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接