如何编写多点触控

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

我已经有了基本的代码,但是当从单一切换到多点触摸,以及副切换发生时,我遇到了问题。 基本上,运动会因为多点触摸(两个手指)的中间位置和单指的绝对位置处于一定距离而发生颠簸。 所以如果我在屏幕上有两个手指,他们组成一个中间位置,然后举起一个手指,就像从中间位置到绝对单指位置的快速移动。 这将是我不想要的运动。

这是我的代码:

@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; } } 

相机的onTouchDownfunction只是设置触摸移动的第一个值。 这就是为什么我也使用它在向上运动中为来自多点触摸的单点触摸移动设置新的开始值。

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

Solutions Collecting From Web of "如何编写多点触控"

从这里开始,如果你还没有阅读它,它会处理Android中的多点触控: http : //android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html

关于您的发布代码的一些事情:

  1. 您将永远不会看到指针数为2的ACTION_DOWN仅针对发生故障的第一个指针发送。 第一个触摸屏幕后的所有手指都会发送ACTION_POINTER_DOWN
  2. 不要假设只有2个手指触摸,可以很容易地更多。
  3. 使用遮罩动作(使用MotionEvent#getActionMasked() )比单独为每个指针索引编码要容易得多。
  4. 最后,索引只是用于将数据从MotionEvent提取出来。 如果您正在跟踪指针移动,请使用指针ID。
  5. 指针ID只是数字。 不要假设他们将会具有什么样的价值,除非他们是从零开始的整数。

你可以用简单的math来解决这个问题,尽pipe可能有更好的方法。

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

 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事件触发,你把布尔值设置为false

要么

你调用一个方法,根据保存的位置值和仍然在屏幕上的手指进行一些math运算。 math应该很容易,但我不知道你真的想做什么。