2014-01-18 41 views
2

當做event.getAction(),如果我用3個手指觸摸。讓我們按照他們觸摸的順序調用他們的手指0 1 2,如果我刪除2然後1,MotionEvent.ACTION_POINTER_UP不會切換到,同樣當我放下手指時,MotionEvent.ACTION_POINTER_DOWN不會切換到。但是如果需要的話,交換機仍然會去MotionEvent.ACTION_MOVE。但是當我將開關的參數更改爲event.getActionMasked()時,所有情況都將被正確調用。我想明白爲什麼這是因爲在我的單鍵觸摸開關語句中,event.getAction()工作正常。爲什麼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; 
} 

回答

0

MotionEvent documentation

考慮使用getActionMasked()和getActionIndex()來檢索單獨的掩蔽作用和指針索引。

我想知道同樣的事情,我假設這句話意味着getAction()不支持多指針。

+0

這樣看來如此。我想知道爲什麼。 – Ion

0

因爲getActionMasked()和getAction()僅等於第一個手指(id = 0)。

例如MotionEvent.ACTION_POINTER_DOWN == 5.

對於第一手指都將等於0(0×0000),因此它不會得到那裏, 但對於第二(ID = 1)將有差異getActionMasked()= 5(0×0005)和的getAction()= 261(0x0105)

因此,要獲得在:

case MotionEvent.ACTION_POINTER_DOWN: 

您應該使用getActionMasked()!

它過濾通過ACTION_MASK == 255(設爲$ 00FF)的getAction()結果

指示器ID將像這樣被刪除:

261 & 255 = 5 (0x0105 & 0x00ff = 0x0005) 

P.S.指針將與掩模65280(爲0xFF00)等來提取:

261 & 65280 = 256 (0x0105 & 0xff00 = 0x0100) 

,然後用移8移位:

256 >> 8 = 1 (0b100000000 >> 8 = 0b1) 
相關問題