1

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

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

实验证实了以下几点:

  • 您确实可以使用一个侦听器类,但是
  • 如果 ScaleGestureDetector 和 GestureDetector 使用相同的事件,它们会互相干扰。然而
  • 似乎您可以通过始终先调用比例检测器然后在运行常规检测器之前检查其 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;
    }
    
4

3 回答 3

3

要确定 MotionEvent 是否为多点触控事件,只需使用MotionEvent.getPointerCount() > 1. 所以我认为下面的代码会很好用:

public boolean onTouchEvent(MotionEvent event) {
    if (event.getPointerCount() > 1) {
        mScaleDetector.onTouchEvent(event);
    } else {
        mDetector.onTouchEvent(event);
    }
    return true;
}
于 2013-05-29T01:51:25.967 回答
2

如果 ScaleGestureDetector 和 GestureDetector 使用相同的事件,它们会互相干扰。但是,您似乎可以通过始终首先调用比例检测器,然后在运行常规检测器之前检查其 isInProgress() 方法来防止这种相互烦扰

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

androidGestureDetector有一个构造函数,它接受一个 boolean ignoreMultiTouch。设置ignoreMultiTouchtrue将确保GestureDetector触摸事件处理忽略任何多点触摸事件。(如果目标 API 级别 >= Froyo,Android 实际上会设置ignoreMultiTouchtrue,因此您可能不需要显式设置它。)

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

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

cancel()会按照它说的去做并取消任何单一的触摸手势。(如果您真的很好奇,您可以自己查看GestureDetector 代码;它实际上使用处理程序来发送/删除消息)。

希望这对遇到与我相同问题的人有所帮助。

于 2012-01-03T23:04:00.550 回答
0

这对我很有用:

@Override
public boolean onTouchEvent(MotionEvent event) {
    m_sGestureDetector.onTouchEvent(event);
    m_GestureDetector.onTouchEvent(event);
    return true;
}
于 2012-02-01T18:19:51.470 回答