2010-10-31 74 views
3

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

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

我已经添加日志到OnTouchListener而当规模的姿态用一根手指和event.getPointerCount()为1

我已经确信,我也不当卡住我仍然得到运动赛事正常有其他听众介入。具有onTouchListener的视图不是屏幕上唯一的视图,但是当我非常小心地在这个视图内部开始和结束手势时,这种效果也会发生。

有什么办法可以改善结束检测吗?

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

+0

你是怎么解决这个问题的? Akos Cz的评论与源代码中的错误计算有关,而不是onScaleEnd未发送的原因? – 2011-08-02 11:33:46

+0

@ vivek.m查看我的答案。 – 2011-08-31 02:38:11

回答

4

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

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

我的变量如下:

m_dualFingerGestureDetector是我ScaleGestureDetector
evt1evt2MotionEvent s用于拖拽手势。如果你只有一个事件,可以缩短上面的代码:

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

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

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

+0

非常感谢您的回答。我会研究这一点。这很可能是这个bug。 – Juhani 2010-11-04 09:19:24

+0

经过多次测试后,很明显这实际上是关键问题之一。性能是一个很大的问题,但是在我们实现这个bug支持的变更之前,这个问题还没有完全解决。 – Juhani 2010-11-05 12:07:11