因此,我正在开发一个必须处理多点触控的应用程序。基本上,我希望单点触摸旋转(这是没有问题的)。以及用于滚动的多点触控。

我已经有了基本代码,但是当发生从单点触控到多点触控以及反之亦然的转换时,我遇到了问题。基本上,由于多点触摸(两个手指)的中位与单指的绝对位置相距一定距离,因此运动会震动。因此,如果我在屏幕上有两个手指,它们将组成一个中间位置,然后抬起一根手指,这就像从该中间位置到绝对单指位置的快速移动一样。这是我不想要的运动。

这是我的代码:

@Override
public boolean onTouchEvent( MotionEvent event ) {
    float xEvent[] = new float[ 2 ];
    float yEvent[] = new float[ 2 ];
    switch( event.getPointerCount() ) {
        case 1:
            xEvent[ 0 ] = event.getX( 0 );
            yEvent[ 0 ] = event.getY( 0 );
            switch( event.getAction() ) {
                case MotionEvent.ACTION_DOWN:
                    camera.onTouchDown( xEvent[ 0 ], yEvent[ 0 ] );
                    return true;
                case MotionEvent.ACTION_MOVE:
                    camera.onTouchRotate( xEvent[ 0 ], yEvent[ 0 ] );
                    return true;
                default: return super.onTouchEvent( event );
            }
        case 2:
            xEvent[ 0 ] = event.getX( 0 );
            yEvent[ 0 ] = event.getY( 0 );
            xEvent[ 1 ] = event.getX( 1 );
            yEvent[ 1 ] = event.getY( 1 );
            switch( event.getAction() ) {
                case MotionEvent.ACTION_DOWN:
                    camera.onTouchDown( ( ( xEvent[ 0 ] + xEvent[ 1 ] ) / 2 ), ( ( yEvent[ 0 ] + yEvent[ 1 ] ) / 2 ) );
                    return true;
                case MotionEvent.ACTION_MOVE:
                    camera.onTouchSlide( ( ( xEvent[ 0 ] + xEvent[ 1 ] ) / 2 ), ( ( yEvent[ 0 ] + yEvent[ 1 ] ) / 2 ) );
                    return true;
                case MotionEvent.ACTION_POINTER_1_UP:
                    camera.onTouchDown( xEvent[ 1 ], yEvent[ 1 ] );
                    return true;
                case MotionEvent.ACTION_POINTER_2_UP:
                    camera.onTouchDown( xEvent[ 0 ], yEvent[ 0 ] );
                    return true;
                default: return super.onTouchEvent( event );
            }
        default: return false;
    }
}

摄像机的onTouchDown功能仅设置触摸移动的第一个值。这就是为什么我还要在向上运动中使用它为来自多点触摸的单点触摸运动设置新的开始值的原因。

我希望有人知道我的问题所在,可以为我提供进一步的帮助。

最佳答案

如果您还没有读过,请从这里开始,它涵盖了Android中处理多点触控的许多事情:http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html

有关您发布的代码的几件事:

  • 您将永远不会看到指针计数为2的ACTION_DOWNACTION_DOWN仅针对下降的第一个指针发送。在第一个手指之后触摸屏幕的所有手指都将发送ACTION_POINTER_DOWN
  • 不要只假设最多用2个手指触摸,就可以轻松实现更多手指触摸。
  • 使用屏蔽操作(使用MotionEvent#getActionMasked())要比分别为每个指针索引编写代码容易得多。
  • 最后,索引仅对从MotionEvent中提取数据有效。如果要跟踪指针随时间的运动,请使用指针ID。
  • 指针ID只是数字。除了它们是从0到更高的整数之外,不要假设它们将具有什么值。
  • 09-10 13:54