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,这不能改变。

 

posted on 2020-04-13 18:26  wjw334  阅读(626)  评论(0编辑  收藏  举报

导航