所以我正在开发一个必须处理多点触控的应用程序。基本上我想要单点旋转(这没问题)。用于滚动的多点触控。
我有基本代码,但是当从单一触摸转换到多点触控和副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功能只设置触摸移动的第一个值。这就是为什么我也会在向上移动中使用它来为来自多点触控的单点触控设置设置新的开始值。
我希望有人知道我的问题是什么,并可以帮助我。
答案 0 :(得分:10)
如果您还没有阅读过,请从这里开始,它涉及Android中多点触控的许多内容:http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html
有关您发布的代码的一些信息:
ACTION_DOWN
。ACTION_DOWN
仅发送给第一个指针。在第一次触摸屏幕后触摸屏幕的所有手指都会发送ACTION_POINTER_DOWN
。MotionEvent#getActionMasked()
)比单独编写每个指针索引要容易得多。MotionEvent
中提取数据起作用。如果您跟踪指针随时间的移动,请使用指针ID。答案 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事件触发并且你将布尔值设置为假
或
您根据保存的位置值和仍在屏幕上的手指调用一个进行数学运算的方法。数学应该很简单,但我不知道你真正想做什么。