gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:54:10 25 4
gpt4 key购买 nike

在执行 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com