我正在创建一个需要消耗任何手势的视图。为此,我创建了一个ScaleGestureDetector和一个GestureDetector。我还创建了一个监听器类,并意识到我可以实现我需要的每个接口;所以我做了。这对于OnGestureListener和OnDoubleTapListener来说是完全合理的,因为它们来自同一个类,但是:
实验证实了以下内容:
似乎你可以通过始终调用比例检测器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;
}
答案 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;
}