一个OnGestureListener对象可以处理两个GestureDetector对象吗?

时间:2011-07-06 15:49:49

标签: android listener gesturedetector

我正在创建一个需要消耗任何手势的视图。为此,我创建了一个ScaleGestureDetector和一个GestureDetector。我还创建了一个监听器类,并意识到我可以实现我需要的每个接口;所以我做了。这对于OnGestureListener和OnDoubleTapListener来说是完全合理的,因为它们来自同一个类,但是:

  • ScaleGestureDetector会期望自己的侦听器类吗?
  • 如果对同一个班级感到满意,它会期待自己的对象吗?
  • 相反,我是否需要在两个探测器上使用相同的监听器?

实验证实了以下内容:

  • 您确实可以使用一个侦听器类,但
  • 如果ScaleGestureDetector和GestureDetector消耗相同的事件,它们会相互骚扰。然而
  • 似乎你可以通过始终调用比例检测器FIRST然后在运行常规检测器之前检查其isInProgress()方法来防止这种相互影响:

    public boolean onTouchEvent(MotionEvent event) {
    //let the ScaleGestureDetector try first
        mScaleDetector.onTouchEvent(event);
    //if isInProgress() returns true then it's consuming the event
        if(mScaleDetector.isInProgress()) return true;
    //if isInProgress() returns false it isn't consuming the event
    //it's therefore safe to pass it to the regular detector
        mPrimaryDetector.onTouchEvent(event);
        return true;
    }
    

3 个答案:

答案 0 :(得分:3)

要确定MotionEvent是否是多点触控事件,只需使用MotionEvent.getPointerCount() > 1即可。所以我认为以下代码将运作良好:

public boolean onTouchEvent(MotionEvent event) {
    if (event.getPointerCount() > 1) {
        mScaleDetector.onTouchEvent(event);
    } else {
        mDetector.onTouchEvent(event);
    }
    return true;
}

答案 1 :(得分:2)

  

ScaleGestureDetector和GestureDetector如果他们相互惹恼他们   消耗相同的事件。但是看起来你可以防止这种相互影响   总是先调用刻度探测器然后检查,以此来解决问题   运行常规检测器之前的isInProgress()方法

就个人而言,我没有发现任何问题,让他们都处理相同的触摸事件。

android GestureDetector有一个constructor,它带有一个布尔值ignoreMultiTouch。将ignoreMultiTouch设置为true可确保GestureDetector触摸事件处理忽略任何mutitouch事件。 (如果目标API级别为> = Froyo,Android实际上会将ignoreMultiTouch设置为true,因此您可能不需要明确设置它。)

如果您只拨打mPrimaryDetector.onTouchEvent(event),当mScaleDetector.isInProgress()返回false时,您将错误地收到长按事件。原因是GestureDetector在其onTouchEvent(MotionEvent ev)中包含以下代码,以确保它与多点触控手势不冲突:

case MotionEvent.ACTION_POINTER_DOWN:
  if (mIgnoreMultitouch) {
    // Multitouch event - abort.
    cancel();
  }
  break;

cancel()会按照说法执行操作并取消任何单个触摸手势。 (如果你真的很好奇,你可以自己查看GestureDetector code;它实际上使用处理程序来发送/删除消息。)

希望这可以帮助那些遇到同样问题的人。

答案 2 :(得分:0)

这对我很有用:

@Override
public boolean onTouchEvent(MotionEvent event) {
    m_sGestureDetector.onTouchEvent(event);
    m_GestureDetector.onTouchEvent(event);
    return true;
}