1

我想在我的活动中处理一个手势。为此,我在我的 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;我唯一能做的就是保存手指 1 的位置并丢弃靠近该点的移动。结果它确实并不完美,有时手指2 的运动会被小指1 的运动“污染”,因为尽管手指保持在屏幕上的位置,但听众会感觉到每个最小的运动。

我该如何改进呢?

4

2 回答 2

1

参考Quintin Balsdon的回答:

我的代码中有类似的东西。我在 ACTION_DOWN 情况下保存了手指 1 的位置,然后当手指 2 移动时,我查看移动的 Y 坐标是否超过了保存的手指 1 Y 坐标。如果是这样,则将其称为finger2的运动,否则称为finger1,我在两指模式下将其丢弃。

如果我尝试在一个手指模式下在我的视图上画一个圆圈,我会得到这样的结果:http: //img208.imageshack.us/img208/8113/onefingercircle.jpg

如果我尝试在两指模式下在我的视图上画一个圆圈,我会得到这样的结果:http: //img256.imageshack.us/img256/6778/twofingercircle.jpg

因此,在单指模式下它可以完美运行,但在两指模式下却不行。我不知道它是否与手机多点触控处理程序或触摸屏有关。它也可能只是硬件相关,或者我对 API 的误解。

于 2012-07-24T10:07:03.993 回答
0

这是由您作为开发人员管理的。您将不得不创建一些布尔变量以在“DOWN”动作发生时设置(为真),然后在“UP”或“MOVE”动作事件发生时取消设置(假)。在下面的代码中,我甚至在“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)

于 2012-07-23T12:20:07.250 回答