跨设备/ Android版本的多触摸不一致

时间:2014-02-16 12:43:32

标签: android multi-touch

我正在尝试实施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设备/版本产生什么样的事件,即上面列出的这些序列中的一个是否可以被视为“正确的”。

2 个答案:

答案 0 :(得分:1)

以下是您可以尝试进一步诊断的一些其他事项:

  1. 切换发生在什么时候?这可以通过不仅记录ACTION_UP而且记录ACTION_MOVE来完成。寻找突然的跳跃。
  2. 查看一些历史数据(getHistoricalX(int pointerIndex, int pos)。看看是否有突然跳跃。
  3. 尝试删除MotionEventCompat调用,并直接调用索引。没有人再使用pre-Eclair,没有理由继续使用兼容性功能。
  4. 但最重要的是,预期的行为与您在Galaxy Ace中看到的一样。在我看来,你在FairPhone中发现了一个错误。我不确定你想用多少工作来调试它,但是你可以通过我上面提供的步骤找到解决方法。

答案 1 :(得分:0)

这可能基于OEM,因为它还取决于设备的硬件。准确度如何OEM如何实现(这样的功能)可以发挥重要作用。由于这一点,我们经常发现所有设备的触摸系统根据重复性,准确性,平滑度等不同。