当做event.getAction()
时,如果我用3个手指触摸。让我们按照他们触摸的顺序称他们为手指0 1 2,如果我删除2然后1,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;
}
答案 0 :(得分:0)
考虑使用getActionMasked()和getActionIndex()来检索单独的蒙版动作和指针索引。
我想知道同样的事情,我认为这句话意味着getAction()
不支持多个指针。
答案 1 :(得分:0)
因为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)
P.S。指针将使用掩码65280(0xff00)提取,如:
261 & 65280 = 256 (0x0105 & 0xff00 = 0x0100)
然后换班8:
256 >> 8 = 1 (0b100000000 >> 8 = 0b1)