Flutter自定义MultiChildRenderObjectWidget实现圆环布局效果

news2024/11/27 16:42:01

一、本文主要是学习巩固一下自定义RenderObject这一块内容,用所了解到的知识实现一个圆环布局效果

  • 本篇文章主要参考了恋猫de小郭Flutter 完整开发实战详解(十六、详解自定义布局实战)文章,大家可以先看完这篇文章再来阅读本篇这样能更好的理解文中代码。
  • 源码在文末。

二、效果图

.
根据自组件的数量,平均将所有的子组件摆放在矩形的内切圆上。

三、自定义Layout步骤

  1. 创建CircleLayoutWidget类继承MultiChildRenderObjectWidget
  2. 创建CircleLayoutData类继承ContainerBoxParentData
  3. 创建CircleLayoutRenderBox类继承RenderBox,同时混入ContainerRenderObjectMixinRenderBoxContainerDefaultsMixin

关于上面两个混入,在开头引入的文章链接中已经详细说明了

如下代码

class CircleLayoutWidget extends MultiChildRenderObjectWidget {
  ///圆环布局的大小
  final double size;

  CircleLayoutWidget({
    required this.size,
    required List<Widget> children,
    Key? key,
  }) : super(key: key, children: children);

  
  RenderObject createRenderObject(BuildContext context) {
    return CircleLayoutRenderBox(size);
  }
}

///每个child的数据
class CircleLayoutData extends ContainerBoxParentData<RenderBox> {}

四、这里重点讲一下自定义RenderBox这块操作

  1. 需要混入上面说到的两个mixin
  2. 重写setupParentData函数为每一个child设置数据
  3. 重写performLayout函数进行布局大小设置、逻辑编写;同时需要对每一个child进行layout

    child.layout(constraints, parentUsesSize: true);

  4. 重写paint函数进行child的绘制
class CircleLayoutRenderBox extends RenderBox
    with
        ContainerRenderObjectMixin<RenderBox, CircleLayoutData>,
        RenderBoxContainerDefaultsMixin<RenderBox, CircleLayoutData> {
  final double layoutSize;

  CircleLayoutRenderBox(this.layoutSize);

  ///step 1
  
  void setupParentData(RenderObject child) {
    if (child.parentData is! CircleLayoutData) {
      child.parentData = CircleLayoutData();
    }
  }

  
  void performLayout() {
    size = Size(layoutSize, layoutSize);
    ///省略部分代码...
  }

  
  void paint(PaintingContext context, Offset offset) {
    defaultPaint(context, offset);
  }
}

五、这里说下关于每一个child在圆环上的坐标计算

在这里插入图片描述
通过画图来理解各个点位的关系,可以得到以下信息

  • 半径r是画布大小的一半r = layoutSize / 2
  • 角a根据子组件数量进行计算∠a = 2 * pi / childCount
  • 有了上面俩个条件就可以通过三角函数计算出F点的坐标F(x,y) = (sin(∠a) * r, cos(∠a) * r)

void performLayout() {
  final double r = layoutSize / 2;
  ///起始角度0
  double angle = 0;
  int count = 0;
  RenderBox? child = firstChild;
  while (child != null) {
    child.layout(constraints, parentUsesSize: true);
    final CircleLayoutData parentData = child.parentData! as CircleLayoutData;
    ///计算当前child所在的角度
    angle = count * 2 * pi / childCount;
    parentData.offset = Offset(
      sin(angle) * r - child.size.width / 2 + r,
      cos(angle) * r - child.size.height / 2 + r,
    );
    ///下一个child
    child = parentData.nextSibling;
    count++;
  }
}

注意:最后还需要对F点进行(x,y) = (x - child.size.width / 2 + r ,y - child.size.height / 2 +r)运算,这是为了让组件的中心在圆弧上同时将坐标原点移动到画布中心

本文所有源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生产制造企业用的ERP系统——流程管理

ERP的含义是企业资源计划&#xff0c;主要是对企业所拥有各种资源进行综合规划和优化管理&#xff0c;用以降低成本&#xff0c;提高效率&#xff0c;增加利润。 作为一个低代码开发平台&#xff0c;百数在办公领域已有10年历史&#xff0c;为企业信息化发展提供丰富的功能模块…

Java如何实现截取字符串

文章目录0 写在前面1 .substring()2 split()正则表达式3 StringUtils.substring()4 写在最后0 写在前面 在实际工作中有一些地方需要用到截取字符串的方法&#xff0c;所以在此记录下截取字符串的几种方法。 .substring() StringUtils.substring() split()正则表达式 1 .subs…

最高月薪15.5K,成大事不在于力量的大小,而在于能坚持多久~

在前几天的世界杯八强赛中&#xff0c;阿根廷通过点球战胜了荷兰&#xff0c;闯入了四强。 说起阿根廷&#xff0c;就不得不提起梅西&#xff0c;这个被众多球迷誉为天才的球王&#xff0c;可实际上&#xff0c;在他的父亲眼中&#xff0c;却从不称自己的儿子为天才&#xff0…

java 课设-超级玛丽游戏

题目&#xff1a; 本程序是针对超级玛丽小游戏的 JAVA 程序&#xff0c;进入游戏后首先用鼠标点击 GUI 窗口&#xff0c;然后开始游 戏&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断马里 奥的可移动性…

.net 移动开发 MAUI

.net 移动开发 MAUI新建一个Hello World运行效果修改一下&#xff0c;做个加法运算吧运行效果创建新的内容页修改xaml内容添加逻辑内容主页面添加一个按钮并且增加路由按钮事件添加路由整体感受第一&#xff1a;WPF第二&#xff1a;小程序所有的页面跳转都是借助路由第三&#…

Win11怎么更改时区?

Win11可以自动检测配置用户的时区来显示正确的时间&#xff0c;如果由于一些特殊原因导致系统时区错误&#xff0c;显示时间也错误的话&#xff0c;这时候要怎么调整呢&#xff1f;下面小编就来教教大家更换Windows 11时区的方法。 方法一&#xff1a;在 Windows 11 上更改时区…

新旧电脑数据如何迁移?电脑数据导入到另一台电脑

新旧电脑数据如何迁移&#xff1f;换电脑是一件好事&#xff0c;换更新版本的电脑&#xff0c;还可以体验新功能。您需要找到将数据传输到新电脑的有效方法。电脑数据导入到另一台电脑&#xff0c;接下来的内容将为大家揭晓答案&#xff01; 方法1、使用专业的数据传输迁移数据…

[附源码]计算机毕业设计的玉石交易系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

cookie 和 session 的区别

1. 前言 cookie 和 session 的区别是什么&#xff1f;这个问题在面试中问到的频率非常高 cookie 和 session 的共同点: 都是用来记录用户访问浏览器时保存的数据&#xff0c;比如&#xff1a;用户的身份信息等 2. cookie 和 session 的工作原理 cookie 工作原理: 浏览器端第…

【自然语言处理】隐马尔科夫模型【Ⅲ】估计问题

有任何的书写错误、排版错误、概念错误等&#xff0c;希望大家包含指正。 由于字数限制&#xff0c;分成六篇博客。 【自然语言处理】隐马尔可夫模型【Ⅰ】马尔可夫模型 【自然语言处理】隐马尔科夫模型【Ⅱ】隐马尔科夫模型概述 【自然语言处理】隐马尔科夫模型【Ⅲ】估计问题…

Rsyslog+MariaDB搭建Rsyslog日志服务器

rsyslog是一个linux系统日志服务的工具&#xff0c;主要用来监控收集系统从开机运行之后所发生的所有日志&#xff0c;包括内核日志&#xff0c;服务日志&#xff0c;应用日志等等&#xff1b;记录的日志全部都写到/var/log下面&#xff0c;常用的有dmsg&#xff08;内核日志&a…

带你手把手实操一个RPC框架

前言&#xff1a; 这篇文章我们来聊一聊RPC框架&#xff0c;为什么要聊RPC呢 &#xff1f; 首先从个人成长角度&#xff0c;如果一个新时代码农能清楚的了解RPC框架所具备的要素&#xff0c;掌握RPC框架中涉及的服务注册发现、负载均衡、序列化协议、RPC通信协议、Socket通信…

Linux 安装 Redis教程

1.切换到目录/use/local/src cd /use/local/src 2.下载文件 wget https://download.redis.io/releases/redis-6.2.6.tar.gz 3.文件解包 tar xzf redis-6.2.6.tar.gz 4.将解压后的包移动到/usr/local/redis目录下 mv redis-6.2.6 /usr/local/redis 5.切换到/usr/local/r…

Vue3这样子结合hook写弹窗组件更快更高效

为什么会有这个想法 在管理后台开发过程中&#xff0c;涉及到太多的弹窗业务弹窗&#xff0c;其中最多的就是“添加XX数据”&#xff0c;“编辑XX数据”&#xff0c;“查看XX详情数据”等弹窗类型最多。 这些弹窗组件的代码&#xff0c;很多都是相同的&#xff0c;例如组件状…

DBCO-PEG-NHS,二苯并环辛炔(DBCO)PEG-NHS衍生物,分子量MV 3.4K 5K

1、产品描述&#xff1a; 二苯并环辛炔&#xff08;DBCO&#xff09;PEG-NHS衍生物可以在不需要任何金属催化剂的情况下进行化学反应。菌株促进的环辛炔和叠氮化合物的1,3-偶极环加成反应&#xff0c;也称为无铜点击反应&#xff0c;是一种双正交反应&#xff0c;可使两个分子…

【Java版oj】day05统计回文

目录 一、原题再现 二、问题分析 三、完整代码 一、原题再现 统计回文_牛客题霸_牛客网 描述 “回文串”是一个正读和反读都一样的字符串&#xff0c;比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串&#xff0c;生日的时候她得到两个礼物分别…

ADI Blackfin DSP处理器-BF533的开发详解50:RGBtoGary (图像灰度提取处理)(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像灰度提取处理&#xff0c;代码运行时&#xff0c;会通过文件系统打开工程文件根目下" …/ImageView"路径中的…

OPENGL ES 2.0 知识串讲(1)――OPENGL ES 2.0 概括

前言 电脑是做什么用的? 电脑又被称为计算机,那么最重要的工作就是计算。看过三体的同学都知道, 电脑中有无数纳米级别的计算单元,通过 0 和 1 的转换,完成加减乘除的操作。 是什么使得电脑工作? 驱动,驱使着硬件完成工作。 谁来写驱动? 制造电脑的公司自己来写驱动,因…

#芯片# N25Q128A21BSF40F

数据手册下载链接&#xff1a;N25Q128A21BSF40F 0. 指令集 1.基本介绍 SPI兼容串行总线接口。108 MHz&#xff08;最大&#xff09;时钟频率。推荐工作电压&#xff1a;1.8 V。单电源电压1.7 V至2 V。支持传统SPI协议&#xff0c;Quad I/O或Dual I/O SPI协议。四路/双路I/O指…

bug的生命周期你知道吗?一张图带你看懂它!

目录 1、什么是bug 2、bug的生命周期 3、如何描述一个bug 4、bug的级别 1、什么是bug 软件的bug狭义方面可以理解为是指软件程序的漏洞或缺陷&#xff0c;广义方面除找到程序漏洞之外&#xff0c;还包括测试工程师或用户所发现和提出的软件可改进的细节、或与需求文档存在差…