Flutter手势识别

1:触摸事件来源


GestureBinding

2:对事件感兴趣



对PointerDownEvent进行处理,找出对后续事件感兴趣的target。

RenderBinding类方法

依次RenderObject的hitTest方法。


RenderView类方法

若是对于该事件感兴趣,则将其加入HitTestResult。也调用children的hitTest方法。

3:手势识别

手势识别的基础类是Listener。我们主要关心Listener Widget所对应的RenderObject对象。

RenderProxyBoxWithHitTestBehavior类

主要逻辑就是,先检测手指的触摸点是否在该RenderObject范围类。若是则测试children是否关心该事件。(HitTestBehavior的三种类型见文档)



RawGestureDetector

RawGestureDetector类使用了Listener,看源码可见,该类只关心pointer down 事件。


RawGestureDetector

下面进入手势识别的核心逻辑,为了简单起见,我们以tap手势为例。


GestureRecognizer


PrimaryPointerGestureRecognizer


OneSequenceGestureRecognizer

到此可见,GestureRecognizer最终会像GestureBinding注册一个handleEvent回调。

我们在此梳理一下,RawGestureDetector对down事件感兴趣,表示对后续事件也感兴趣,借助GestureRecognizer,往GestureBinding注册了handleEvent回调。handleEvent会对后续的move ,up等事件进行处理。

下一个问题是,GestureBinding如何分发后续事件。

GestureBinding


PointerRouter

GestureBinding的handleEvent,将后续事件分发给了,之前在GestureRecognizer的addAllowedPointer中添加的Router。

你可能感兴趣的:(Flutter手势识别)