ScaleGestureDetector未检测到手势结束

时间:2010-10-31 23:07:11

标签: android multi-touch gesture-recognition

我已按照Android文档中的说明将ScaleGestureDetector连接到OnTouchListener。由于某种原因,ScaleGestureDetector并不总是检测到捏合手势的结束。这种情况主要发生在从大到小快速挤压时。

效果是,在我释放两根手指后,探测器不会触发手势结束事件。如果我之后用一个触摸屏幕,它仍然认为我正在继续缩放手势(继续触发尺度事件)。我必须做另一个手势让探测器发射终止事件。

我已将日志添加到OnTouchListener中,当缩放手势卡住时,我仍然可以正常使用一根手指并且event.getPointerCount()为1时获得动作事件。

我已经确定我没有其他听众干预。具有onTouchListener的视图不是屏幕上的唯一视图,但是当我非常小心地开始并在这一个视图中结束手势时,也会发生这种效果。

有没有办法改善结束检测?

或者,如果我有办法手动将ScaleGestureDetector设置为触发onScaleEnd并将scaleGestureDetector.isInProgress()更改为false?

2 个答案:

答案 0 :(得分:4)

在应用上述修复程序后,我想出了一个解决方案。我的应用程序同时使用ScaleGestureDetector和普通GestureDetector,因此我使用onScroll方法(来自GestureDetector)实现了:

if (m_dualFingerGestureDetector.isInProgress() && (evt1.getPointerCount() == 2 || evt2.getPointerCount == 2)
{
    return false;
}
...

我的变量如下:

m_dualFingerGestureDetector是我的ScaleGestureDetector
对于拖动动作,evt1evt2MotionEvent。如果您只有一个事件,则可以缩短上述代码:

if (m_dualFingerGestureDetector.isInProgress() && evt.getPointerCount() == 2)
{
    return false;
}
...

这样可以构建非常漂亮的用户界面。我总是建议使用手势检测器的组合为您的应用添加平移和缩放功能。

答案 1 :(得分:1)

您可能遇到以下错误 http://code.google.com/p/android/issues/detail?id=10067

我必须将ScaleGestureDetector实现复制到我的本地项目中,以便我可以应用该修复程序。我也针对2.1设备,所以除非我将它复制到我的项目中,否则我无法使用此类。

https://android.googlesource.com/platform/frameworks/base/+/gingerbread-release/core/java/android/view/ScaleGestureDetector.java