Android多点触控干扰

时间:2012-09-19 18:11:05

标签: android multi-touch

我目前正在为Android开发空气曲棍球模拟。对于多人游戏模式,我正在跟踪屏幕上的两个触摸事件,只要触摸点不能关闭,它就能很好地工作。 Normal Touch

当两个手指关闭时,android只识别一个触摸事件,在两个点的中间。

Two events overlapping

更糟糕的是,安卓有时会在碰撞后弄乱ID。

Wrong IDs assigned

我已经考虑过估算下一个接触点并手动分配ID,是否有人知道更好的方法,或者知道已经以编程方式解决过这个问题的人?

注意:我正在测试三星Galaxy S 3

3 个答案:

答案 0 :(得分:6)

不一定是该问题的合理解决方案,但仍然是该应用程序的可能解决方案:

如果我没有完全弄错的话,空气曲棍球比赛不应该让对手闯入对方的比赛场地。如果我们假设一个厚边框穿过屏幕的中心(在纵向模式下),那么我将不被允许做任何超出该边界的事情,因此在我的手指到达边界线后没有任何意义。

将跟踪的触摸事件封装到有效的物理位置(如上所述)可能只会帮助您忽略无效点(假设物理位置不相交,即)。

你可能还需要跟踪触摸向量的方向:如果向量从屏幕中心向“你的结束”伸展,则可能是对手侵入手指或你自己的手指。在任何情况下都不应该影响冰球(也许)。

答案 1 :(得分:2)

这可能取决于您使用的设备,但我在华为X5中使用下面的代码并且它永远不会弄乱手指,即使它们相互接触或者我在屏幕上扭曲它们。 / p>

private static PointF touchScreenStartPtArr[] = new PointF[10];
private static PointF touchScreenStopPtArr[] = new PointF[10];
private static PointF touchScreenCurrPtArr[] = new PointF[10];

OnTouchListener onTouchListenerMulti = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int action = event.getAction() & MotionEvent.ACTION_MASK;
        int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
        int fingerId = event.getPointerId(pointerIndex);

        switch (action) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:
            touchScreenStartPtArr[fingerId].x = event.getX(pointerIndex);
            touchScreenStartPtArr[fingerId].y = event.getY(pointerIndex);
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL:
            touchScreenStopPtArr[fingerId].x = event.getX(pointerIndex);
            touchScreenStopPtArr[fingerId].y  = event.getX(pointerIndex);
            break;
        case MotionEvent.ACTION_MOVE:
            int pointerCount = event.getPointerCount();
            for (int i = 0; i < pointerCount; i++) {
                touchScreenCurrPtArr[fingerId].x = event.getX(i);
                touchScreenCurrPtArr[fingerId].y = event.getY(i);
            }
            break;
        }
        return true;
    }
};  

请注意,我使用fingerId而不是pointerId来识别正确的手指,因为指针ID可能会在释放一根手指时发生变化。

希望它适合你。

答案 2 :(得分:2)

这是我看到它的方式。

触摸屏硬件为您提供了一个分辨率,低于该分辨率,两个触摸与一个触摸相同。这是你无法改变的。

现在的问题是,当两次接触合并时该怎么办? (这是可以通过编程方式进行测试的人可以想到的;例如,如果2个触摸点 - > 1触摸pt。并且prev touch pt 1足够接近prev touch pt 2 ...)。在你的情况下,我会沿着合并的触摸手势移动两个冰球,直到它们分开,然后返回单独的控制。

当然,我看到了几个问题,比如分裂后的哪个触控?也许有一个人在合并期间抬起手指。

如果发生合并,你可能让两位球员失去对冰球的控制权。当你的手撞到你的对手的时候,这可以模拟手腕的震动:)

我也喜欢@dbm的想法。

希望这会有所帮助。可能没有:)