zoukankan      html  css  js  c++  java
  • Listener(每日Flutter 小部件)

    参考:https://www.lizenghai.com/archives/48633.html

    const Listener({
        Key key,
        this.onPointerDown,
        this.onPointerMove,
        this.onPointerEnter,
        this.onPointerExit,
        this.onPointerHover,
        this.onPointerUp,
        this.onPointerCancel,
        this.onPointerSignal,
        this.behavior = HitTestBehavior.deferToChild,
        Widget child,
     })
    

      

    class _ListenerWidgetState extends State<ListenerWidget> {
      Offset offset = Offset(0.0, 0.0);
      String status = 'noPoint';
    
      @override
      Widget build(BuildContext context) {
        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              Listener(
                behavior: HitTestBehavior.opaque,
                  child: ConstrainedBox(
                      constraints: BoxConstraints.tight(Size(200, 200)),
                      child: Center(
                        child: Text('click me'),
                      )),
                  onPointerDown: (event) => print("onPointerDown}")),
              Text(
                'Test',
                style: TextStyle(fontSize: 22.0),
              ),
            ],
          ),
        );
      }
    }
    

      

    behavior属性

    behavior表示命中测试(Hit Test)过程中的表现策略。它是一个枚举,提供了三个值,分别是HitTestBehavior.deferToChildHitTestBehavior.opaqueHitTestBehavior.translucent

    上面说到过,命中测试,就是看RenderBoxhitTest的返回值,如ListenerhitTest方法如下。

    bool hitTest(BoxHitTestResult result, { Offset position }) {
        bool hitTarget = false;
        if (size.contains(position)) {
          hitTarget = hitTestChildren(result, position: position) || hitTestSelf(position);
          if (hitTarget || behavior == HitTestBehavior.translucent)
            result.add(BoxHitTestEntry(this, position));
        }
        return hitTarget;
    }
    bool hitTestSelf(Offset position) => behavior == HitTestBehavior.opaque;
    

      

    HitTestBehavior.deferToChild:Listener是否命中测试,取决于子child是否命中测试,这是默认behavior的默认值。

    HitTestBehavior.opaque:当Listener的子child没有命中测试时,该属性值保证hitTestSelf返回true,即保证Listener所在区域能响应触摸事件。

    HitTestBehavior.translucent:当Listener的子child没有命中测试时,并且hitTestSelf返回false时,该属性值可以保证Listener所在的区域能响应触摸事件(加入到命中测试列表),但是hitTest方法返回值还是false,这不能改变。

  • 相关阅读:
    业务逻辑层封装
    了解ASP.NET MVC几种ActionResult的本质:EmptyResult & ContentResult
    Facade外观模式
    了解ASP.NET MVC几种ActionResult的本质:FileResult
    示例代码浏览器5.4功能更新
    面试体验:Microsoft 篇
    Mono 2.11.3 发布包含微软的 Entity Framework
    系统架构设计师
    对数据访问层的抽象中
    说说项目中的插件思想
  • 原文地址:https://www.cnblogs.com/wjw334/p/12693072.html
Copyright © 2011-2022 走看看