如何编码多点触控

时间:2010-11-19 20:46:34

标签: android touch multi-touch

所以我正在开发一个必须处理多点触控的应用程序。基本上我想要单点旋转(这没问题)。用于滚动的多点触控。

我有基本代码,但是当从单一触摸转换到多点触控和副verca时,我遇到了问题。基本上,由于多点触控(两个手指)的中间位置和单个手指的绝对位置处于一定距离,因此运动将发生摇晃。因此,如果我在屏幕上有两个手指,它们构成一个中间位置,然后抬起一根手指,这就像从中间位置到绝对单指位置的快速移动。这将是我不想要的运动。

这是我的代码:

@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功能只设置触摸移动的第一个值。这就是为什么我也会在向上移动中使用它来为来自多点触控的单点触控设置设置新的开始值。

我希望有人知道我的问题是什么,并可以帮助我。

2 个答案:

答案 0 :(得分:10)

如果您还没有阅读过,请从这里开始,它涉及Android中多点触控的许多内容:http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html

有关您发布的代码的一些信息:

  1. 您永远不会看到指针计数为2的ACTION_DOWNACTION_DOWN仅发送给第一个指针。在第一次触摸屏幕后触摸屏幕的所有手指都会发送ACTION_POINTER_DOWN
  2. 不要假设最多只有2个手指触摸,很容易就会有更多。
  3. 使用屏蔽操作(使用MotionEvent#getActionMasked())比单独编写每个指针索引要容易得多。
  4. 最后,索引仅对从MotionEvent中提取数据起作用。如果您跟踪指针随时间的移动,请使用指针ID。
  5. 指针ID只是数字。不要假设他们将拥有什么价值,而不是他们将从0开始整数。

答案 1 :(得分:2)

你可以用简单的数学解决这个问题,虽然可能有一种更好的方法已经内置。

只需创建一个对象,该对象在.ACTION_POINTER_X_UP事件触发时保存每个手指的位置,以及一个保存上次使用哪种触摸模式的布尔对象。

case MotionEvent.ACTION_POINTER_1_UP:
        camera.onTouchDown( xEvent[ 1 ], yEvent[ 1 ] );
        boolean usedMultiTouch = true;
        int x = event.getX(1);
        int y = event.getY(1);
        return true;

接下来你的ACTION_MOVE(在case = 1内)语句将在用户从多点触摸到单触时移动手指时触发。

现在,根据你想要做什么,你可以忽略单个移动(布尔值是你的检查),直到.ACTION_UP事件触发并且你将布尔值设置为假

您根据保存的位置值和仍在屏幕上的手指调用一个进行数学运算的方法。数学应该很简单,但我不知道你真正想做什么。