繁体   English   中英

Android多点触控干扰

[英]Android multi-touch interference

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

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

两个事件重叠

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

分配了错误的ID

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

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

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

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

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

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

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

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触摸pts - > 1触摸pt。并且prev touch pt 1足够接近prev touch pt 2 ...)。 在你的情况下,我会沿着合并的触摸手势移动两个冰球,直到它们分开,然后返回单独的控制。

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

如果合并发生,你可以让两个玩家失去控制他们的冰球。 当你的手撞到你的对手的时候,这可以模拟手腕的震动:)

我也喜欢@dbm的想法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM