[英]Why does event.getActionMasked switch to these cases when event.getAction doesn't
當做event.getAction()
,如果我用三根手指觸摸。 讓我們按觸摸的順序將它們稱為手指0 1 2,如果我MotionEvent.ACTION_POINTER_UP
2移開,則MotionEvent.ACTION_POINTER_UP
不會切換到,同樣,當我放下手指時, MotionEvent.ACTION_POINTER_DOWN
也不會切換到。 但是在需要時,開關仍將轉到MotionEvent.ACTION_MOVE
。 但是,當我將開關的參數更改為event.getActionMasked()
所有情況將被正確調用。 我想了解為什么會這樣,因為在我的單觸開關語句中, event.getAction()
可以正常工作。
//replace with getAction(), first and third case don't always get called. Only sometimes.
switch(event.getActionMasked())
{
case MotionEvent.ACTION_POINTER_DOWN:
prevZoomX = Math.abs(x1-x2);
prevZoomY = Math.abs(y1-y2);
break;
case MotionEvent.ACTION_MOVE:
float deltaX = (Math.abs(x1-x2) - prevZoomX);
float deltaY = (Math.abs(y1-y2) - prevZoomY);
Log.d("zoom","dx: " + deltaX/(mDensity/2) + " prevZoomX " + prevZoomX);
Log.d("zoom","dy: " + deltaY/(mDensity/2) + " prevZoomY " + prevZoomY);
mRenderer.zoom = Math.abs(deltaX) > Math.abs(deltaY) ? deltaX/(mDensity/2) : deltaY/(mDensity/2);
Log.d("zoom","" + mRenderer.zoom);
prevZoomX = Math.abs(x1-x2);
prevZoomY = Math.abs(y1-y2);
break;
case MotionEvent.ACTION_POINTER_UP:
Log.d("finger","fingers left: " + event.getPointerCount());
break;
}
考慮使用getActionMasked()和getActionIndex()來檢索單獨的掩碼操作和指針索引。
我在想同樣的事情,我認為這句話意味着getAction()
不支持多個指針。
因為getActionMasked()和getAction()僅對於第一個手指(id = 0)相等。
例如MotionEvent.ACTION_POINTER_DOWN == 5。
對於第一個手指,兩個手指都將等於0(0x0000),因此不會到達那里,但是對於第二個手指(id = 1),將存在差異getActionMasked()= 5(0x0005)和getAction()= 261(0x0105)
因此,進入:
case MotionEvent.ACTION_POINTER_DOWN:
您應該使用getActionMasked()!
它通過ACTION_MASK == 255(0x00FF)過濾getAction()結果
指針ID將被刪除,如下所示:
261 & 255 = 5 (0x0105 & 0x00ff = 0x0005)
PS指針將使用掩碼65280(0xff00)提取,如下所示:
261 & 65280 = 256 (0x0105 & 0xff00 = 0x0100)
然后按移位8移位:
256 >> 8 = 1 (0b100000000 >> 8 = 0b1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.