Gesture手势检测和滑动冲突

2019-07-19  本文已影响0人  icecreamco

最近flutter稳定版本由1.5升级到了1.7,GestureDetector手势检测类也得到了完善,新增了很多事件回调方法。接下来主要介绍下GestureDetector基本使用、注意事项、1.5到1.7升级引起的问题和滑动冲突。

GestureDetector简介

Listener简介

如果需要处理原始用户手势事件,可以使用Listner,其提供了原始手指操作的回调,核心方法有onPointerDownonPointerMoveonPointerUp,每一个事件流都是按照onPointerDown -> onPointerMove -> onPointerUp的顺序进行的,可以继承至Listner定制自定义手势检测。

GestureDetector手势事件冲突

升级1.7遇到的问题和解决方案

1.5及1.5以前的版本可以嵌套GestureDetector同时检测scalepan,嵌套内层的GestureDetector优先处理事件流,如果内层嵌套不处理,则外层嵌套处理事件流,非常方便。

1.7上scale事件完全成为pan事件流的超集,不能共存,且不能嵌套,需要在scale相关回调中自行判断是滑动、缩放还是转动事件,通常,在不考虑转动事件下,认为若scale == 1为拖拽事件流,否则为缩放事件流,再进行相应操作。

滑动冲突的解决方案

典型场景,TabBarView结合内部可以滑动的view,例如大图页面ScalableImageWidget,会产生典型的滑动冲突。

解决方案是内部ScalableImageWidget优先级较高,决定是否处理滑动事件,若不处理,则移交给外部TabBarView处理。具体如下:

  1. root页面持有TabBarView和其child ScalableImageWidget构造方法,设置标志位_needHandleScroll决定TabBarViewphysics属性取PageScrollPhysics还是NeverScrollableScrollPhysics,设置ScalableImageWidget回调scrollStateCallback
  2. ScalableImageWidget根据边界条件决定是否消费滑动事件,若不消费,则调用ScrollStateCallback回调设置root页面_needHandleScroll标志位,将处理权交给TabBarView
  3. TabBarView获取了滑动事件处理权,则监听滑动动画的执行,滑动动画结束后将处理权移交给内部child
上一篇下一篇

猜你喜欢

热点阅读