我正在尝试实施Android多点触控应用程序,我观察到两个不同设备上的不一致行为(运行Android 2.3.3的三星Galaxy Ace和运行Android 4.2.2的FairPhone)。
以下是相关代码:
@Override
public boolean onTouchEvent(MotionEvent event){
int action = MotionEventCompat.getActionMasked(event);
int index = MotionEventCompat.getActionIndex(event);
int id = MotionEventCompat.getPointerId(event, index);
if (action == MotionEvent.ACTION_DOWN || action == MotionEventCompat.ACTION_POINTER_DOWN) {
Log.d("FOO", "DOWN (" + id + ")");
} else if (action == MotionEvent.ACTION_UP || action == MotionEventCompat.ACTION_POINTER_UP) {
Log.d("FOO", "UP (" + id + ")");
}
return true;
}
使用此代码和手势“手指1向下,手指2向下,手指1向上,手指2向上”,这是Galaxy Ace上的日志输出:
DOWN (0)
DOWN (1)
UP (0)
UP (1)
这就是我所期待的。但是,这是FairPhone上相同手势序列的输出:
DOWN (0)
DOWN (1)
UP (1)
UP (0)
DOWN (1)
UP (1)
因此,FairPhone正在发出某种与实际手势不符的伪“ID切换”事件。
有没有办法实现一致的事件流,无论Android设备和版本如何?理想情况下,事件应该与实际的客户相对应(即没有伪事件)。
编辑:我也很高兴至少知道其他Android设备/版本产生什么样的事件,即上面列出的这些序列中的一个是否可以被视为“正确的”。
答案 0 :(得分:1)
以下是您可以尝试进一步诊断的一些其他事项:
ACTION_UP
而且记录ACTION_MOVE
来完成。寻找突然的跳跃。getHistoricalX(int pointerIndex, int pos)
。看看是否有突然跳跃。但最重要的是,预期的行为与您在Galaxy Ace中看到的一样。在我看来,你在FairPhone中发现了一个错误。我不确定你想用多少工作来调试它,但是你可以通过我上面提供的步骤找到解决方法。
答案 1 :(得分:0)
这可能基于OEM,因为它还取决于设备的硬件。准确度如何OEM如何实现(这样的功能)可以发挥重要作用。由于这一点,我们经常发现所有设备的触摸系统根据重复性,准确性,平滑度等不同。