首页 > 其他分享 >一统天下 flutter - 输入: 命中测试(hit test)

一统天下 flutter - 输入: 命中测试(hit test)

时间:2023-04-18 12:33:16浏览次数:40  
标签:hit webabcd MyText 命中 child test Container flutter

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - 输入: 命中测试(hit test)

示例如下:

lib\input\hit_test.dart

/*
 * 命中测试(hit test)
 *
 * hit test 的作用是根据事件的位置收集所有在该位置上的 widget,然后从最底层的节点开始向上将每个节点收集到一个集合中,最后根据这个集合进行事件分发
 * hit test 是在 RenderObject 上实现的
 */

import 'package:flutter/material.dart';
import 'package:flutter_demo/helper.dart';

class HitTestDemo extends StatefulWidget {
  const HitTestDemo({Key? key}) : super(key: key);

  @override
  _HitTestDemoState createState() => _HitTestDemoState();
}

class _HitTestDemoState extends State<HitTestDemo> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("title"),),
      backgroundColor: Colors.orange,
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
          /// HitTestBehavior.deferToChild - 子被命中了,则监听器被命中,这个是默认值
          /// 对于本例来说
          /// 1、MyText 被命中了,则 GestureDetector 被命中
          /// 2、如果是 Container 中的非 MyText 区域被命中了,则 GestureDetector 不会被命中
          GestureDetector(
            behavior: HitTestBehavior.deferToChild,
            child: Container(
              height: 50,
              alignment: Alignment.center,
              child: const MyText("webabcd"),
            ),
            onTap: () {
              log("onTap: ${currentTimestamp()}");
            },
          ),

          /// HitTestBehavior.opaque - 子被命中或者自己被命中,则监听器被命中
          /// 对于本例来说
          /// 1、MyText 被命中了,则 GestureDetector 被命中
          /// 2、如果是 Container 中的非 MyText 区域被命中了,则 GestureDetector 也会被命中
          GestureDetector(
            behavior: HitTestBehavior.opaque,
            child: Container(
              height: 50,
              alignment: Alignment.center,
              child: const MyText("webabcd"),
            ),
            onTap: () {
              log("onTap: ${currentTimestamp()}");
            },
          ),

          /// 如果 Container 设置了 color 则因为其对应的 _RenderColoredBox 的 behavior 是 HitTestBehavior.opaque
          /// 所以设置了 color 的 Container 的行为与 HitTestBehavior.opaque 一致
          GestureDetector(
            child: Container(
              height: 50,
              color: Colors.green,
              alignment: Alignment.center,
              child: const MyText("webabcd"),
            ),
            onTap: () {
              log("onTap: ${currentTimestamp()}");
            },
          ),

          /// HitTestBehavior.translucent - 与 HitTestBehavior.opaque 的行为一致,并且不会影响同级的上面的节点的命中测试
          /// 对于本例来说
          /// 1、MyText 被命中了,则 onTap2
          /// 2、如果是 Container 中的非 MyText 区域被命中了,则先 onTap2 再 onTap1(如果不是 translucent 则不会走到 onTap1)
          Stack(
            children: [
              Listener(
                child: Container(child: const MyText("webabcd"), width: 300, height: 50, alignment: Alignment.center, color: Colors.red),
                onPointerDown: (event) {
                  log("onTap1: ${currentTimestamp()}");
                },
              ),
              Listener(
                child: Container(child: const MyText("webabcd"), width: 300, height: 50, alignment: Alignment.center),
                onPointerDown: (event) {
                  log("onTap2: ${currentTimestamp()}");
                },
                behavior: HitTestBehavior.translucent,
              ),
            ],
          ),
        ],
      ),
    );
  }
}

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd

标签:hit,webabcd,MyText,命中,child,test,Container,flutter
From: https://www.cnblogs.com/webabcd/p/flutter_lib_input_hit_test.html

相关文章

  • 一统天下 flutter - widget 基础: 生命周期
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-widget基础:生命周期示例如下:lib\widget\basic\lifecycle.dart/**生命周期*/import'package:flutter/material.dart';import'../../helper.dart';classLifecy......
  • AtCoder Regular Contest 106 F Figures
    洛谷传送门AtCoder传送门晚自习的时候胡出来的做法(((首先你会发现题目等价于求\(\sum\limits_{(\sum\limits_{i=1}^na_i)=2(n-1)\land\foralli\in[1,n],1\lea_i\led_i}\prod\limits_{i=1}^n\dfrac{d_i!}{(d_i-a_i)!}\)。翻译一下就是枚举每个点的度数\(a_i\)......
  • ABC297F AtCoder Beginner Contest 297 F - Minimum Bounding Box 2
    https://atcoder.jp/contests/abc297/tasks/abc297_f在\(n\timesm\)的棋盘上放置\(k\)个棋子,记矩形A为能覆盖所有\(k\)个棋子的最小的矩形,求A的面积的期望将问题反过来考虑,枚举每种矩形有多少种放置棋子的方案,对于一个\(n\timesm\)的矩形,我们可以用容斥的方法......
  • Flutter 集成 uni小程序(UniMPSDK)
    原文地址amoshk.top又是一段成为鸽子的日子,今天我们直接来上手一把,简单聊聊如何在Flutter中集成并使用小程序。在国内环境下,小程序盛行,随着功能的庞大,许多业务上也需要进行支持,帮助开发进行抽离(减少宿主APP频繁发版、方便形成生态、便于独立进行测试与漏洞修复等),使用者也......
  • 7 Skills To Become A Successful Automation Tester In 2019
    Withnew-ageprojectdevelopmentmethodologieslikeAgileandDevOpsslowlyreplacingtheold-agewaterfallmodel,thedemandfortestingisincreasingintheindustry. Testersarenowworkingtogetherwiththedevelopersandautomationtestingisvastly......
  • Test Plan
    Refertothiswebsite:https://www.guru99.com/what-everybody-ought-to-know-about-test-planing.html#:~:text=How%20to%20write%20a%20Test%20Plan%201%20Analyze,7%20Schedule%20%26%20Estimation%208%20Determine%20Test%20DeliverablesTESTPLAN:Whatis,HowtoCr......
  • AtCoder Beginner Contest 295
    ThreeDaysAgo我们定义一个只由数字构成的字符串中的字符能够被重排成相同的两份,我们称这个字符串是个好字符串,比如12341234现在给定一个字符串\(S\),找出所有的\([l,r]\),使得在这段区间中的子段是个好字符串题解:思维+组合计数首先我们根据题意得到:一个好字符串中所有相......
  • Kubernetes-Cluster Architecture
    title:Kubernetes-ClusterArchitecturedate:2022-05-28:00:04author:liudongdong1img:https://cdn.pixabay.com/photo/2022/05/05/01/11/cormorant-7175037__340.jpgcover:falsecategories:Storagetags:-StorageKubernetesrunsyourworkloadbyplacin......
  • 什么是软件测试领域的 Flaky test?
    在软件测试领域,Flakytest是指那些在多次执行中产生不一致结果的测试用例。具体来说,这些测试用例在某些情况下可以成功通过测试,而在其他情况下则会失败,即使是相同的测试环境和测试数据。Flakytest可能是由于多种原因引起的,如测试代码中存在的竞态条件、网络延迟或不稳定的测试......
  • googleTest demo
    googletest的目录在的官方目录在https://github.com/google/googletest.git。作为用户,googleTest的库可以认为提供了两个东西:各种宏,如TEST,TEST_F,通过#include"gtest/gtest.h",即可使用。gtest_main的库libgtest_main.a,即提供了一个主函数,可以和一个测试套的“容器”。静态库......