Gesture手势检测和滑动冲突

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

GestureDetector简介

  • GestureDetector接受child参数,检测child上手势操作的回调

  • downcancel

    GestureRecognizer之间相互竞争,down事件可能会有多个手势生出并接收回调,当某一个事件流程正式胜出,其他GestureRecognizer会调用其cancel方法

    // down
    onTapDown;
    onVerticalDragDown;
    onHorizontalDragDown;
    onPanDown;
    // cancel
    onTapCancel;
    onVerticalDragCancel;
    onHorizontalDragCancel;
    onPanCancel;
    
  • tap单击

    事件回调顺序onTapDown -> onTapUp -> onTap

    • onTap: 单击回调
    • onTapUp: 单击手势抬起回调
  • longPress长按

    事件回调顺序onLongPressStart -> onLongPress -> onLongPressMoveUpdate -> onLongPressEnd -> onLongPressUp

    • onLongPressStart:长按开始
    • onLongPress:长按回调
    • onLongPressMoveUpdate:长按移动
    • onLongPressEnd:长按事件结束
    • onLongPressUp:长按手势抬起
  • onDoubleTap双击回调

  • drag水平/垂直拖拽

    事件回调顺序onXXDragStart -> onXXDragUpdate -> onXXDragEnd

    • onXXDragStart:拖拽开始
    • onXXDragUpdate:拖拽过程移动
    • onXXDragEnd:拖拽结束
  • scale缩放

    事件回调顺序onScaleStart -> onScaleUpdate -> onScaleEnd

    • onScaleStart:缩放开始

    • onScaleUpdate:缩放更新

    • onScaleEnd:缩放结束

  • pan拖拽

    事件回调顺序onPanStart -> onPanUpdate -> onPanEnd

    • onPanStart:拖拽开始
    • onPanUpdate:拖拽过程移动
    • onPanEnd:拖拽结束

Listener简介

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

  • onPointerDown:手指按下屏幕
  • onPointerMove:手指滑动
  • onPointerUp:手指离开屏幕

GestureDetector手势事件冲突

  • scalepan事件冲突,不能同时存在,建议直接使用scaleScaleUpdateDetails参数中,如果scale == 1则可以认为进入pan流程,前后两个focalPoint的差值即是DragUpdateDetails中的delta
  • HorizontalDragVerticalDrag不能共存,且如果存在scale的话,Drag事件优先级比较高,scale事件将被忽略。如果既要检测横向拖拽又要检测纵向拖拽,有两种方案:
    • GestureDetector嵌套,分别提供vertivalDraghorizontalDrag的回调,优势是简单方便,劣势是不能检测任意方向上的滑动
    • pan事件处理,直接处理pan事件流,可以检测到任意方向上的拖拽,有点是比较灵活和全面,缺点是稍显复杂

升级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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358