一、 原始指针事件处理
- 原始指针事件(pointer Event) 触摸事件 ,在flutter 中可以使用Listener 来监听原始触摸事件,listener 是一个功能性组件;listener 的构造函数: 、、、 Listener({ Key key, this.onPointerDown, //手指按下回调 this.onPointerMove, //手指移动回调 this.onPointerUp,//手指抬起回调 this.onPointerCancel,//触摸事件取消回调 this.behavior = HitTestBehavior.deferToChild, //在命中测试期间如何表现 Widget child }) 、、、
PointerDownEvent、PointerMoveEvent、PointerUpEvent都是PointerEvent,PointerEvent 包含:
- position : 鼠标相对于全局坐标的偏移;
- delta: 两次指针移动事件的距离 pointerMoveEvent;
- pressure: 按压力度;
- orientation: 指针移动方向,是一个角度值;
- behavior 属性 : 决定子组件如何响应命中测试,它的值类型为 hitTestBehavior 是枚举值:
- deferToChild: 子组件会一个接一个的进行命中测试,如果子组件中有测试通过的,则当前组件通过,这就意味着,如果指针事件作用于子组件上时,其父级组件也肯定可以收到该事件。
- opaque:在命中测试时,将当前组件当成不透明处理(即使本身是透明的),最终的效果相当于当前Widget的整个区域都是点击区域。举个例子:
- translucent:当点击组件透明区域时,可以对自身边界内及底部可视区域都进行命中测试,这意味着点击顶部组件透明区域时,顶部组件和底部组件都可以接收到事件,
- 忽略PointerEvent IgnorePointer (本身不参与) 或者AbsorbPointer(本身会参与命中测试,本身是可以接收指针事件的(但其子树不行))
二、 手势识别
- 手势处理: GestureDetector 和 GestureRecognizer;
- GestureDetector 是一个用于手势识别功能性组件; 可以通过GestureDetector对container 进行手势识别; 点击(onTap) 双击(onDoubleTap) 长按(onLongPress) 拖动 缩放
- GestureRecognizer : 识别各种手势,通过listener 来将原始指针事件转换为语义手势
、、、 @override void dispose() { //用到GestureRecognizer的话一定要调用其dispose方法释放资源 _tapGestureRecognizer.dispose(); super.dispose(); } 、、、
三、 事件总线
四、 Nofitfication
- 可滚动组件(Scrollable Widget) 滚动时就会滚动通知 (ScrollNotification),而scrollbar 正是通过监听ScrollNotification来确定滚动位置的 ; ScrollNotfication 包含: ScrollStartNotification 开始滚动、 ScrollUpdateNotification 正在滚动、 ScrollEndNotification 停止滚动、 OverscrollNotification 滚动到边界;
- onNotification : typedef NotificationListenerCallback = bool Function(T notification);
- 在Flutter 的U框架中 除啦可滚动组件 在滚动的过程中也会发出 ScrollNotification的通知 , 还有 SizeChangedLayoutNotfication 、 keepAliveNotification、 layoutChangedNotification 等 ;
- 自定义通知: 、、、 Class myNotification extends Notification{ myNotification(this.msg); Final String msg; } 、、、
- 分发通知: Notification通过dispatch(context) 方法进行分发通知; context 实际上是通过操作 Element 的一个接口 ,它与Element树上的节点对应,通知会从context 对应的Element节点向上冒泡;