ScaleGestureDetector的新“快速扩展”功能与GestureListener的onDoubleTap()之间的正确交互是什么?

时间:2014-05-08 20:10:45

标签: android android-4.4-kitkat gesture-recognition

KitKat SDK支持一种名为quick scale的新型缩放手势。用户可以双击并滑动以缩放视图,而不需要两个手指来捏缩放。您可以在Chrome和地图应用中看到这一点。

Chrome和地图区分双击(放大相关内容区域,如前所述)和双击滑动(允许您用一根手指任意缩放)。

引擎盖下,ScaleGestureDetector uses a GestureDetector检测双击并开始寻找相应的滑动。

我的问题是如何模仿Chrome和地图,检测双击和双击滑动手势,但不能同时检测两者。也就是说,我想区分正常的双击(无滑动)和双击滑动。

我有一个GestureDetector和一个ScaleGestureDetector正在我视图上的所有触摸事件。目前,当我进行双击滑动时,GestureListener.onDoubleTap()和ScaleGestureListener.onScaleBegin()都会触发。 onDoubleTap()首先被触发,因此无法取消处理ScaleGestureListener中的事件。

我看到两种可能的解决方案,两者都不是很干净:

  • 从Android源代码复制ScaleGestureDetector并向ScaleGestureListener接口添加一个新的回调,例如onDoubleTapConfirmed()(doubletap,no swipe)。
  • 向onDoubleTap()添加一个小延迟,以便我们在触发后的X毫秒内处理事件。如果onScaleBegin()在延迟结束之前被触发,则取消处理onDoubleTap()事件并开始处理比例。

处理此问题的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

这个派对有点晚了,但是快速刻度更像是一个未完成的双击,第二个点击变成拖动,如:

  

点按,点按,点按,移动

您对快速比例的解释似乎是:

  

点按,点按,点按,点按,点按,移动

如果您只在第二个操作上注册一个简单的双击,这会让您的问题变得更容易。当第二次动作发生时,您只需要确定在第二次敲击循环期间是否发生了拖动。如果手势识别器不适合您,您可以通过查看getScaledTouchSlop手动执行此操作。

此外,复制ScaleGestureDetector可能没有你想象的那么糟糕 - github充斥着“compat”项目,这些项目基本上是新版本SDK中功能的后端。