我想在我的活动中处理一个手势。为此,我在Activity上覆盖了公共布尔onTouchEvent(MotionEvent MEvent)方法。内容如下所示:
motionaction = MEvent.getAction();
if(motionaction == MotionEvent.ACTION_DOWN)
{
...
return true;
}
if(motionaction == MotionEvent.ACTION_UP)
{
...
return true;
}
if(motionaction == MotionEvent.ACTION_MOVE)
{
...
return true;
}
motionaction = MEvent.getActionMasked();
if(motionaction == MotionEvent.ACTION_POINTER_DOWN)
{
...
return true;
}
if(motionaction == MotionEvent.ACTION_POINTER_UP)
{
...
return true;
}
return true;
手势如下:
屏幕上的-finger1保持其位置(实际上因为总是有一点移动)
-finger2在屏幕上移动。这是我想抓住的运动。
我可以抓住5个动作,但问题是,当两个手指在屏幕上时,ACTION_MOVE抓住第一个和第二个手指的移动。方法 MEvent.getActionIndex()不适用于始终为0的ACTION_MOVE;我唯一可以做的就是保存finger1的位置并丢弃靠近那一点的动作。结果它并不完美,有时手指2的运动被小指1的运动“玷污”,因为虽然手指握住它在屏幕上的位置,但听众感觉每一个最小的运动。
我如何改善这一点?
答案 0 :(得分:1)
参考 Quintin Balsdon 的答案:
我的代码中有类似的东西。我将finger1的位置保存在ACTION_DOWN的情况下,然后当finger2移动时,我看到移动的Y坐标是否超过了保存的finger1 Y坐标。如果是这样的话,它指向finger2的运动另外被称为finger1并且我在两个手指模式中丢弃它。
如果我尝试在一个手指模式下在我的视图上绘制一个圆圈,我有这样的事情: http://img208.imageshack.us/img208/8113/onefingercircle.jpg
如果我尝试在两个手指模式下在我的视图上绘制一个圆圈,我会得到这样的结果: http://img256.imageshack.us/img256/6778/twofingercircle.jpg
因此,在一个手指模式下,它可以完美地工作,但不能用于双指模式。 我不知道它是否与手机多点触控处理程序或触摸屏有关。它可能只是硬件相关或我对API的误解。
答案 1 :(得分:0)
这是由您作为开发人员管理的。当“DOWN”动作发生时,你将不得不创建一些布尔变量来设置(为真),然后在“UP”或“MOVE”动作事件发生时设置(false)。在下面的代码中,我在“DOWN”发生时保持坐标,并在用户四处移动时进行调整。
switch (e.Action) //e is a MotionEvent type
{
case MotionEvent.ACTION_DOWN:
{
_prevx = e.getX();
_prevy = e.getY();
}
break;
case MotionEvent.ACTION_MOVE:
{
_xoffset += e.GetX() - _prevx;
_yoffset += e.GetY() - _prevy;
Invalidate();
_prevx = e.GetX();
_prevy = e.GetY();
}
break;
}
如果你想进行多指拖动,你需要实现ScaleGestureDetector.OnScaleGestureListener(http://developer.android.com/reference/android/view/ScaleGestureDetector.OnScaleGestureListener.html)