2012-12-04 40 views
8

我对触摸事件的遮罩有一些小问题。我在这里和其他地方阅读了很多内容,但仍然对部分内容有些困惑。Android多点触控和getActionMasked()

1)是event.getActionMasked()一样event.getAction() & MotionEvent.ACTION_MASK(他们似乎是三星S2和HTC Desire的)

2)将以上两个命令给所有的信息和更重要的是event.getAction()单独会,或者是不同的。 3)我已经写了一段代码,它简单地说明哪里正在触摸,哪个pointerId,或者如果指针没有被使用(此时只写两次触摸)。它似乎可以在上面提到的设备上正常工作,但是我知道如果某些设备不完全正确,某些设备的行为可能会非常不同。因此,我想知道以下内容是否正确,并且会在所有设备上运行。

boolean pointer0down=false, pointer1down=false; 
String st="", str0 ="", str1 =""; 

public boolean onTouchEvent(MotionEvent event) 
{ 

    if (event.getActionMasked()==MotionEvent.ACTION_UP 
     ||event.getActionMasked()==MotionEvent.ACTION_POINTER_UP 
     ||event.getActionMasked()==MotionEvent.ACTION_CANCEL) 
    { 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0) 
     pointer0down=false; 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1) 
     pointer1down=false; 
    } 

    if (event.getActionMasked()==MotionEvent.ACTION_DOWN 
    ||event.getActionMasked()==MotionEvent.ACTION_POINTER_DOWN) 
    { 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0) 
     pointer0down=true; 
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1) 
     pointer1down=true; 
    } 

if (pointer0down) 
    str0="\tx: " + event.getX(0) + "\ty: "+event.getY(0); 
else 
    str0="\tNot down"; 

if (pointer1down) 
    str1="\tx: " + event.getX(1) + "\ty: "+event.getY(1); 
else 
    str1="\tNot down"; 

st="pointer0:"+str0+"\npointer1:"+str1; 

    return true; 
} 

回答

16

一些背景 -

的整数的getAction返回是一个打包整数编码两者的动作代码(例如ACTION_DOWN)和指针索引(例如哪个手指)。

对于单点触摸,由于只涉及一个手指,所以不需要存储指针索引,因此该值只是操作码。因此,它可以安全地做类似getAction() == ACTION_DOWN

对于多点触摸,这种比较是不正确的B/C你在打包的整数中有额外的指针索引。您可以通过执行getAction() & ACTION_POINTER_INDEX_MASK

现在你的问题做getAction() & ACTION_MASK提取的动作代码并提取指针指数 -

1:是的。可以考虑getActionMasked作为提取动作码位的辅助方法。要提取指针索引,您必须使用等效的getActionIndex辅助方法。这两种方法都适用于单触或多触,因此它们是“最安全的”。

2:如上所述,也的getAction编码多点触摸

3指针指数:有在代码中的错误。 event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK))从技术上讲是不正确的。相反,你应该做event.getPointerId(event.getActionIndex())。你得到非常幸运与getActionIndex getActionIndex原来是不正确的逻辑和运算符,其结果是2字节和掩码本身2字节(0xff):)

+0

很好的解释! – George