zoukankan      html  css  js  c++  java
  • Flutter学习笔记(32)--PointerEvent事件处理

    如需转载,请注明出处:Flutter学习笔记(32)--PointerEvent事件处理

    在Android原生的开发中,对于事件的处理,我们都知道事件分为down、move、up事件,对于ViewGroup有事件分发、拦截和消费处理,对于View有分发和消费处理,在Flutter中也是一样,事件分为down、move、up事件。

    在Flutter中对事件的监听是通过Listener来监听原始触摸事件,Listener的构造方法如下:

    const Listener({
      Key key,
      this.onPointerDown,//手指按下回调
      this.onPointerMove,//手指移动回调
      this.onPointerUp,//手指弹起回调
      this.onPointerCancel,//触摸事件取消回调
      this.behavior = HitTestBehavior.deferToChild,//在命中测试期间如何表现
      Widget child,
    })

    先看一下demo示例:

    import 'package:flutter/material.dart';
    
    class PointerEventDemo extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'PointerEventDemo',
          home: _PointerEventDemoHome(),
        );
      }
    }
    
    class _PointerEventDemoHome extends StatefulWidget {
      @override
      State<StatefulWidget> createState() {
        return _PointerEventDemoHomeState();
      }
    }
    
    class _PointerEventDemoHomeState extends State {
      PointerEvent _event;
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: new Scaffold(
            appBar: new AppBar(
              title: new Text('PointerEventDemo'),
            ),
            body: new Container(
              alignment: Alignment.center,
              color: Colors.red,
               400,
              height: 300,
              child: new Listener(
                child: new Container(
                  alignment: Alignment.center,
                  color: Colors.tealAccent,
                   200.0,
                  height: 150.0,
                  child: new Text(
                    _event?.toString() ?? '',
                    style: new TextStyle(color: Colors.red),
                  ),
                ),
                //不同响应时的处理
                onPointerDown: (PointerDownEvent event) =>
                    setState(() => _event = event),
                onPointerMove: (PointerMoveEvent event) =>
                    setState(() => _event = event),
                onPointerUp: (PointerUpEvent event) =>
                    setState(() => _event = event),
                behavior: HitTestBehavior.translucent,
              ),
            ),
          ),
        );
      }
    }
    Listener本身是一个功能组件,它用来监听内部组件的触摸事件,事件会从最内层的widget一直向上冒泡到最外层的widget,监听到了用户的触摸事件,会回调到对应的响应处理onPointerDown、onPointerMoveonPointerUp
    demo很简单,就是响应用户的触摸操作,然后打印指针坐标。

    忽略PointerEvent

    假如我们不想让某个子树响应PointerEvent的话,我们可以使用IgnorePointerAbsorbPointer,这两个组件都能阻止子树接收指针事件,不同之处在于AbsorbPointer本身会参与命中测试,而IgnorePointer本身不会参与,这就意味着AbsorbPointer本身是可以接收指针事件的(但其子树不行),而IgnorePointer不可以。示例如下:
    Listener(
      child: AbsorbPointer(
        child: Listener(
          child: Container(
            color: Colors.red,
             200.0,
            height: 100.0,
          ),
          onPointerDown: (event)=>print("in"),
        ),
      ),
      onPointerDown: (event)=>print("up"),
    )
    点击Container时,由于它在AbsorbPointer的子树上,所以不会响应指针事件,所以日志不会输出"in",但AbsorbPointer本身是可以接收指针事件的,所以会输出"up"。如果将AbsorbPointer换成IgnorePointer,则两个都不会输出。
  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/upwgh/p/13156798.html
Copyright © 2011-2022 走看看