[英]In Android, what is the difference between getAction() and getActionMasked() in MotionEvent?
[英]Android multitouch and getActionMasked()
我有一些關於觸摸事件掩蓋的小問題。 我在這里和其他地方看過很多東西,但我仍然對零件感到困惑。
1) event.getActionMasked()
與event.getAction() & MotionEvent.ACTION_MASK
(它們似乎在Samsung S2和HTC Desire上)
2)上述兩個命令是否會提供所有信息,而不僅僅是那個事件event.getAction()
將會是,或者它是不同的。
3)我編寫了一段代碼,簡單地說明了觸摸的位置和指針ID,或指針是否未被使用(目前僅寫入兩次觸摸)。 它似乎在上面提到的設備上正常工作,但是我知道如果沒有完全正確的話,某些設備可以采取非常不同的行為。 因此,我想知道以下是否正確並且將在所有設備上運行。
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;
}
一些背景 -
從getAction返回的整數是一個壓縮整數,它對動作代碼(例如ACTION_DOWN)和指針索引(例如哪個手指)進行編碼。
對於單點觸摸,由於只涉及一個手指,因此不需要存儲指針索引,因此值只是動作代碼。 因此可以安全地執行getAction() == ACTION_DOWN
對於多點觸摸,這種比較是不正確的b / c你在打包的整數中有額外的指針索引。 您可以通過執行getAction() & ACTION_MASK
來提取操作代碼,並通過執行getAction() & ACTION_POINTER_INDEX_MASK
提取指針索引
現在問你的問題 -
1:是的。 將getActionMasked視為提取動作代碼位的輔助方法。 要提取指針索引,您將獲得等效的getActionIndex輔助方法。 這兩種方法都適用於單次或多次觸摸,因此它們是“最安全的”。
2:如上所述,getAction還編碼多點觸控的指針索引
3:您的代碼中存在錯誤。 event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK))
在技術上是不正確的。 相反,你應該做event.getPointerId(event.getActionIndex())
。 你很幸運 getActionIndex上的邏輯和運算符不正確,結果是2個字節,掩碼本身就是2個字節(0xff):)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.