java - 为什么 event.getActionMasked 会切换到这些情况,而 event.getAction 不会

标签 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;
}

最佳答案

因为 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)

附言指针将使用掩码 65280 (0xff00) 提取,如下所示:

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

然后用 shift 8 移动:

256 >> 8 = 1 (0b100000000 >> 8 = 0b1)

关于java - 为什么 event.getActionMasked 会切换到这些情况,而 event.getAction 不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21199329/

相关文章:

java - 使用 Apache HttpComponents HttpClient 测量带宽使用情况

java - Windows BSOD 后什么可能导致 Eclipse 无法运行?

c# - 重量级模式下的 dotnetbrowser 触摸事件未传递给 wpf

android - 低功耗蓝牙外设模式

Android 滚动条一闪而过

ios - 使用 setNeedsDisplayInRect 仍然会删除底层内容

java - onCompletion() 顺序在 Camel DSL 中是否重要?

java - DynamoDBMapper : How to get all the rows for multiple id's(array) in a single query or scan of DynamoDBMapper

android - Bootstrap 2.3.2 - 不要将移动布局用于平板电脑纵向

android - 如何发送 Intent 以使用多个航路点进行导航?