2012-12-04 62 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