Android - 如何区分onTouchEvent中的第一个指针和第二个指针移动

时间:2012-07-23 11:50:44

标签: java android touch listener gesture

我想在我的活动中处理一个手势。为此,我在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的运动“玷污”,因为虽然手指握住它在屏幕上的位置,但听众感觉每一个最小的运动。

我如何改善这一点?

2 个答案:

答案 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)