如何在颤动中创建带有透明孔的小部件

2023-12-11

我想在任何 Flutter 小部件中创建一个洞。例如,假设我们在一个堆栈中有两个小部件,我想在上面的一个小部件上挖一个洞,以使下面的小部件对用户可见。

有一个question具有相似的标题,但接受的答案与问题不完全匹配。答案是在单色覆盖层上挖一个洞,而不是在一个完整的小部件上。

我发现与CustomPaint我们可以在三层中绘制小部件:

class BasicExample extends StatelessWidget {
  const BasicExample({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return CustomPaint(
      child: Image.asset(
        "images/flutter.jpg",
        fit: BoxFit.cover,
      ),
      foregroundPainter: DemoPainter(Colors.red.withOpacity(0.5)),
      painter: DemoPainter(Colors.blue.withOpacity(0.5)),
      size: Size.square(200.0),
      willChange: true,
    );
  }
}

但我找不到像这样的机制ColorFiltered上面的回答中提到了。有没有一种东西叫WidgetFiltered,作为小部件世界中单色覆盖世界的对应部分,我们可以用它来处理两个重叠小部件的渲染(例如,示例代码中的画家和子部件)?


我在用ClipPath虽然包含的答案已被使用ColorFilter.

更改滑块值以更改孔尺寸

Run on dartPad

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

  @override
  State<WidgetHole> createState() => _WidgetHoleState();
}

class _WidgetHoleState extends State<WidgetHole> {
  double dimension = 52;

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (context, constraints) => Scaffold(
        backgroundColor: Colors.pink,
        appBar: AppBar(
          backgroundColor: Colors.purple,
          title: Slider(
            value: dimension,
            max: constraints.maxWidth,
            onChanged: (v) {
              setState(() {
                dimension = v;
              });
            },
          ),
        ),
        body: ClipPath(
          clipper: CenterHolePath(dimension: dimension),
          child: Container(
            alignment: Alignment.center,
            color: Colors.yellow,
            child: Column(
              children: [
                Text("Hey this is background"),
                Expanded(
                    child: ListView.builder(
                  clipBehavior: Clip.hardEdge,
                  itemCount: 44,
                  itemBuilder: (context, index) {
                    return Center(
                      child: SizedBox(
                        height: kToolbarHeight,
                        child: Text("lItem  $index"),
                      ),
                    );
                  },
                ))
              ],
            ),
          ),
        ),
      ),
    );
  }
}

class CenterHolePath extends CustomClipper<Path> {
  final double dimension;
  CenterHolePath({
    required this.dimension,
  });

  @override
  Path getClip(Size size) {
    final rect = Rect.fromLTRB(0, 0, size.width, size.height);

    final path = Path()
      ..fillType = PathFillType.evenOdd
      ..addOval(
        Rect.fromCenter(
            center: Offset(size.width / 2, size.height / 2),
            width: dimension,
            height: dimension),
      )
      ..addRect(rect);

    return path;
  }

  @override
  bool shouldReclip(covariant CenterHolePath oldClipper) {
    return dimension != oldClipper.dimension;
  }
}

粉色是脚手架背景

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在颤动中创建带有透明孔的小部件 的相关文章

随机推荐

  • 从表中删除数据后Oracle释放空间

    我最近从数据库中的一些表中删除了大量数据 现在我希望释放该数据所占用的空间 之后我想重建索引 释放空间的最佳方法是什么 释放空间 是什么意思 当您删除数据时 块中的空间被释放 该空间现在可用于在您从中删除数据的表中进行后续插入 或更新 这通
  • Birt mongodb 参数

    我安装了 Birt 4 3 最新 作为 Eclipse 插件 JDBC 作为数据源非常适合我 我在查询中定义了一个参数 我可以通过报表设计在数据集中定义参数并将其链接到报表参数 但我对 MongoDB 有多个问题 1 当我打开 编辑数据集
  • 已声明但未设置的变量计算结果为 true?

    我正在用下面的代码做一个简单的计算器 现在它执行得很完美 然而 当我试图改变现状时 却行不通 我用了BOOL program检查是否继续询问该人的输入或完成该程序 如果我改变表达方式while声明只是 program 并改变YES NO i
  • CSS - 仅使用水平滚动条

    仅当 div 的内容长于宽度值时 我才需要使用水平滚动条 所以我写 viewgallerylist width 920px float left padding top 20px height 120px border bottom 1px
  • 如何正确处理从右到左的文本输入字段?

    我正在研究多语言布局 让我担心的是 如何正确处理文本输入 我已经建立了一个JSFiddle解释我的问题 如果我只是添加dir rtl 单词从右到左出现 但不是每个字符 如果我添加从右到左的 CSS 样式 包含的数字也会翻转 我如何组合数字和
  • 如何处理catch块中的异常?

    我正在尝试找到处理异常的理想方法 我用谷歌搜索并读到我应该放try catch in the catch块也可以处理 但是如果嵌套块本身发生任何异常怎么办 try int a 10 int b 0 int c a b Console Wri
  • OpenCV createsamples - 无效的背景描述文件

    我在我的OPENCV ROOT文件夹并在 Win x64 中运行以下命令 opencv createsamples bgcolor 0 bgthresh 0 maxxangle 1 1 maxyangle 1 1 maxzangle 0 5
  • 为什么在散列中向数组追加一个值也会修改分配它的其他变量?

    示例代码 hash of array a b hash of array c hash of array b a lt lt 1 puts b gt a 1 puts c gt a 1 为什么两个变量的数组中都有 1 我只将它附加到变量上b
  • 存储函数时如何传递预定义参数

    是否可以存储带有预定义参数的函数以供另一个函数调用 例如 def function num print num trigger function store function 1 trigger prints 1 trigger funct
  • 如何为 tts 创建自定义 sapi 语音

    我正在开发一个项目 需要为我的应用程序创建自定义语音引擎 我见过类似 TTS Builder 的东西 但是有人了解 TTS Builder 等应用程序本身是如何开发的吗 SAPI引擎背后的东西是什么 它们是如何工作的 一个人如何构建自己的
  • 如何使用AWS Lambda部署大型Python包?

    我需要一些建议 我使用 Tensorflow 训练了一个图像分类器 并希望使用它将其部署到 AWS Lambda无服务器 该目录包括模型 一些Python模块 包括tensorflow和numpy 以及Python代码 解压前完整文件夹的大
  • 如何在C++中获得不同向量的向量

    我想要一个 C 表示的表 如下所示 0 1 2 1 1 0 a 2 2 0 b 3 3 0 c 列的类型必须从int double or string在运行时 用 C 表达它的最佳方式是什么 附录 我真正的问题 我想要一个数据库表的列式表示
  • 在 DispatchTimer 中使用消息对话框时,Windows 8 应用程序中出现“访问被拒绝。(HRESULT 异常:0x80070005 (E_ACCESSDENIED))”?

    我正在尝试在调度计时器中使用消息对话框来在时间完成时更改用户 但有时会出现以下错误 访问被拒绝 HRESULT 异常 0x80070005 E ACCESSDENIED 如何解决这个问题 Code public DetailPage tim
  • 我们如何找到正在运行的Windows服务的进程ID?

    我正在寻找一种查找特定 Windows 服务的进程 ID 的好方法 特别是 我需要找到 Windows 附带的默认 WebClient 服务的 pid 它作为 svchost exe 进程中的 本地服务 托管 我发现当我使用 netstat
  • 如何生成在 1×41 向量中定位 20 个 -1 值的每个排列?

    我编写了不同的代码来生成 1 和减 1 的不同排列 它们适用于小尺寸矩阵 例如 S 1 1 1 1 1 1 1 1 P unique perms S rows 产生 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  • 对于存储桶中不存在的密钥,如何让 S3 存储桶返回 404(而不是 403)/

    我正在使用 S3 来存储一些业务关键文档 我希望存储桶在尝试访问存储桶中不存在的对象时返回 404 状态代码 然而 我发现它不断返回我 403 以下是使用 S3 网站 URL 的会话示例 gt GET foobar txt HTTP 1 1
  • 如何在 VSCode 的 QuickOpen 面板中预过滤 showCommands

    我有一些扩展可以添加 4 个 6 个或更多命令 但我不想为每个扩展设置快捷方式 理想情况下 我可以创建一个快捷方式来显示该扩展的所有命令 或者显示workbench action showCommands列表中已经设置了一些文本 以便只显示
  • 必须输入“N”两次才能显示相关信息

    我正在尝试编写一些代码 根据用户输入的内容按升序或降序对数字进行排序 当用户输入 Y 时 程序能够按升序对它们进行排序 但是如果输入 N 按降序排序 则用户必须在显示之前输入 N 两次 我已经发布了下面的语法 所以如果有人想告诉我缺少什么
  • 将数据从 Parse tableview 传递到 WatchKit

    我在用着Parse创建此表视图 并且我正在尝试弄清楚如何获取表数据 以便我可以将其传递到 WatchKit InterfaceController 我是否需要查询Parse以某种方式获取数据并将其存储在array然后我就可以从 WatchK
  • 如何在颤动中创建带有透明孔的小部件

    我想在任何 Flutter 小部件中创建一个洞 例如 假设我们在一个堆栈中有两个小部件 我想在上面的一个小部件上挖一个洞 以使下面的小部件对用户可见 有一个question具有相似的标题 但接受的答案与问题不完全匹配 答案是在单色覆盖层上挖