3

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

效果是,在我松开两个手指后,检测器不会触发手势结束事件。如果我之后用一个触摸屏幕,它仍然认为我正在继续缩放手势(继续触发 onScale 事件)。我必须做另一个手势才能让探测器触发结束事件。

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

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

有什么方法可以改善末端检测吗?

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

4

2 回答 2

4

在应用上述修复后,我想出了一个解决方案。我的应用程序同时使用 aScaleGestureDetector和 normalGestureDetector所以我在我的onScroll方法中实现(来自GestureDetector):

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

我的变量如下:

m_dualFingerGestureDetectoris myScaleGestureDetector
evt1evt2are MotionEvents 用于拖动手势。如果你只有一个事件,你可以缩短上面的代码:

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

这允许构建非常好的用户界面。我总是建议使用手势检测器的组合来为您的应用程序添加平移和缩放功能。

于 2011-08-13T21:23:43.080 回答
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

于 2010-11-04T07:09:24.210 回答