为什么当event.getAction没有时,event.getActionMasked会切换到这些情况

时间:2014-01-18 02:35:45

标签: java android touch motionevent

当做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;
}

2 个答案:

答案 0 :(得分:0)

来自MotionEvent documentation

  

考虑使用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)