Flutter学习笔记 --事件处理

这篇博客详细介绍了Flutter中的原始指针事件,包括onPointerDown、onPointerMove、onPointerUp和onPointerCancel,以及PointerEvent的相关属性。同时,文章讨论了GestureDetector组件在处理复杂手势如点击、拖动、缩放和双击等事件的应用,并给出了示例代码,展示了如何实现手势交互。此外,还提到了IgnorePointer和AbsorbPointer组件在事件拦截和忽略中的不同作用。
Flutter有四种原始指针事件,如下:
事件类型说明
onPointerDown手指按下
onPointerMove手指移动
onPointerUp手指抬起
onPointerCancel触摸事件取消

上面几个方法中都有一个event参数,参数类型分别是onPointerDownEvent、onPointerMoveEvent、onPointerUpEvent和onPointerCancelEvent,它们都是PointerEvent的子类,常用属性有以下几种:

  • position:相对于全局坐标的偏移
  • delta:两次指针移动事件的距离
  • orientation:指针移动的方向,是一个角度值
  • pressure:按压力度,如果没有压力传感器的话,该值始终为1
指针事件的拦截和忽略,Flutter提供了两个组件IgnorePointer和AbsorbPointer。两者的区别:
  • IgnorePointer:此节点与其子节点都将忽略点击事件
  • AbsorbPointer:此节点本身能够响应点击事件,并且会阻止事件传递到子节点上
除了原始指针事件以外,还有一些复杂的手势事件,如放大、缩小、双击等,处理这些复杂的手势事件,需要用到GestureDetector组件。GestureDetector组件的常用属性如下:
属性说明
onTap当用户与屏幕短暂触碰时触发
onTapDown当用户按下屏幕时触发
onTapUp当用户停止触碰屏幕时触发
onTapCancel当用户触碰屏幕但没有完成Tap事件时触发
onVerticalDragDown当用户触碰屏幕且准备往屏幕垂直方向移动时触发
onVerticalDragUpdate当用户触碰屏幕且开始往屏幕垂直方向移动并且发生位移时触发
onVerticalDragCancel当用户中断了onVerticalDragDown时触发
onVerticalDragStart当用户触碰屏幕且开始往屏幕垂直方向移动时触发
onVerticalDragEnd当用户完成垂直方向触摸屏幕时触发
onHorizontalDragDown当用户触碰屏幕且准备往屏幕水平方向移动时触发
onHorizontalDragUpdate当用户触碰屏幕且开始往屏幕水平方向移动并且发生位移时触发
onHorizontalDragCancel当用户中断了onHorizontalDragDown时触发
onHorizontalDragStart当用户触碰屏幕且开始往屏幕水平方向移动时触发
onHorizontalDragEnd当用户完成水平方向触摸屏幕时触发
onPanDown当用户触碰屏幕时触发
onPanUpdate当用户触碰屏幕并产生移动时触发
onPanEnd当用户完成触碰屏幕时触发
onPanStart当用户触碰屏幕并开始移动时触发
onScaleStart当用户触碰屏幕并开始缩放时触发
onScaleUpdate当用户触碰屏幕并产生缩放时触发
onScaleEnd当用户完成缩放时触发
onDoubleTap当用户快速双击屏幕时触发
onLongPress当用户长按屏幕时触发

示例代码:

class _GestureDetectorPageState extends State<GestureDetectorPage> {
  double _left = 0.0;
  double _top=0.0;
  int index = 0;
  double _scaleSize = 100.0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Stack(
        children:[
        Positioned(
          left: _left,
          top: _top,
          child: GestureDetector(
            child: OutlinedButton(
              onPressed: () {  },
              child: Text('huhuhu'),
            ),
            // child: Column(
            //   children: [
            //     Container(
            //       width: 200,
            //       height: 200,
            //       color: index % 2 == 0 ? Colors.green : Colors.blue,
            //       child: Text('$_scaleSize'),
            //     ),
            //     FlutterLogo(
            //       size: _scaleSize,
            //     )
            //   ],
            // ),
            onPanUpdate: (e)=>{
              setState(() {
                _left += e.delta.dx;
                _top += e.delta.dy;
              })
            },
            // onTap: ()=>print('onTap'),
            // onTapDown: (e)=>print('onTapDown:$e'),
            // onTapUp: (e)=>print('onTapUp:$e'),
            // onScaleUpdate: (e)=>setState(() {
            //   if(e.scale.clamp(0.5, 10) != 1) {
            //     _scaleSize = 100 * e.scale.clamp(0.5, 10);
            //   }
            // }),
            // onHorizontalDragCancel: ()=>print('onHorizontalDragCancel'),
            // onHorizontalDragDown: (e)=>print('onHorizontalDragDown'),
            // onHorizontalDragEnd: (e)=>print('onHorizontalDragEnd'),
            // onHorizontalDragUpdate: (e)=>setState(() {
            //   // _left += e.delta.dx;
            //   index = 4;
            //   print('水平事件胜出');
            // }),
            // onVerticalDragDown: (e)=>print('onVerticalDragDown'),
            // onVerticalDragCancel: ()=>print('onVerticalDragCancel'),
            // onVerticalDragStart: (e)=>print('onVerticalDragStart'),
            // onVerticalDragUpdate: (e)=>setState(() {
            //   index = 5;
            //   // _top += e.delta.dy;
            //   print('垂直事件胜出');
            // }),
          ),
        ),
        ],
      ),
    );
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值