unity GridLayoutGroup真正的居中

GridLayoutGroup默认的居中效果:

  

不是真正的居中 加上代码:
namespace UnityEngine.UI
{/// <summary>/// GridLayoutGroup拓展,使支持自定义内容/// </summary>internal class GridLayoutGroupEx : GridLayoutGroup{/// <summary>/// 启用居中/// </summary>bool m_enableMiddle = true;/// <summary>/// 超过行数采用默认的/// </summary>int m_surpassLine = 2;public bool EnableMiddle{set { m_enableMiddle = value; }get { return m_enableMiddle; }}public int SurpassLine{set { m_surpassLine = value; }get { return m_surpassLine; }}/// <summary>/// Called by the layout system/// Also see ILayoutElement/// </summary>public override void SetLayoutHorizontal(){SetCellsAlongAxis(0);}/// <summary>/// Called by the layout system/// Also see ILayoutElement/// </summary>public override void SetLayoutVertical(){SetCellsAlongAxis(1);}private void SetCellsAlongAxis(int axis){// Normally a Layout Controller should only set horizontal values when invoked for the horizontal axis// and only vertical values when invoked for the vertical axis.// However, in this case we set both the horizontal and vertical position when invoked for the vertical axis.// Since we only set the horizontal position and not the size, it shouldn't affect children's layout,// and thus shouldn't break the rule that all horizontal layout must be calculated before all vertical layout.if (axis == 0){// Only set the sizes when invoked for horizontal axis, not the positions.for (int i = 0; i < rectChildren.Count; i++){RectTransform rect = rectChildren[i];m_Tracker.Add(this, rect,DrivenTransformProperties.Anchors |DrivenTransformProperties.AnchoredPosition |DrivenTransformProperties.SizeDelta);rect.anchorMin = Vector2.up;rect.anchorMax = Vector2.up;rect.sizeDelta = cellSize;}return;}float width = rectTransform.rect.size.x;float height = rectTransform.rect.size.y;int cellCountX = 1;int cellCountY = 1;if (m_Constraint == Constraint.FixedColumnCount){cellCountX = m_ConstraintCount;if (rectChildren.Count > cellCountX)cellCountY = rectChildren.Count / cellCountX + (rectChildren.Count % cellCountX > 0 ? 1 : 0);}else if (m_Constraint == Constraint.FixedRowCount){cellCountY = m_ConstraintCount;if (rectChildren.Count > cellCountY)cellCountX = rectChildren.Count / cellCountY + (rectChildren.Count % cellCountY > 0 ? 1 : 0);}else{if (cellSize.x + spacing.x <= 0)cellCountX = int.MaxValue;elsecellCountX = Mathf.Max(1, Mathf.FloorToInt((width - padding.horizontal + spacing.x + 0.001f) / (cellSize.x + spacing.x)));if (cellSize.y + spacing.y <= 0)cellCountY = int.MaxValue;elsecellCountY = Mathf.Max(1, Mathf.FloorToInt((height - padding.vertical + spacing.y + 0.001f) / (cellSize.y + spacing.y)));}int cornerX = (int)startCorner % 2;int cornerY = (int)startCorner / 2;int cellsPerMainAxis, actualCellCountX, actualCellCountY;if (startAxis == Axis.Horizontal){cellsPerMainAxis = cellCountX;actualCellCountX = Mathf.Clamp(cellCountX, 1, rectChildren.Count);actualCellCountY = Mathf.Clamp(cellCountY, 1, Mathf.CeilToInt(rectChildren.Count / (float)cellsPerMainAxis));}else{cellsPerMainAxis = cellCountY;actualCellCountY = Mathf.Clamp(cellCountY, 1, rectChildren.Count);actualCellCountX = Mathf.Clamp(cellCountX, 1, Mathf.CeilToInt(rectChildren.Count / (float)cellsPerMainAxis));}Vector2 requiredSpace = new Vector2(actualCellCountX * cellSize.x + (actualCellCountX - 1) * spacing.x,actualCellCountY * cellSize.y + (actualCellCountY - 1) * spacing.y);Vector2 startOffset = new Vector2(GetStartOffset(0, requiredSpace.x),GetStartOffset(1, requiredSpace.y));int customActualCellCountX, customActualCellCountY;if (startAxis == Axis.Horizontal){customActualCellCountX = rectChildren.Count % cellCountX;customActualCellCountY = Mathf.Clamp(cellCountY, 1, Mathf.CeilToInt(rectChildren.Count / (float)cellsPerMainAxis));}else{customActualCellCountY = rectChildren.Count % cellCountY;customActualCellCountX = Mathf.Clamp(cellCountX, 1, Mathf.CeilToInt(rectChildren.Count / (float)cellsPerMainAxis));}Vector2 customRequiredSpace = new Vector2(customActualCellCountX * cellSize.x + (customActualCellCountX - 1) * spacing.x,customActualCellCountY * cellSize.y + (customActualCellCountY - 1) * spacing.y);Vector2 customStartOffset = new Vector2(GetStartOffset(0, customRequiredSpace.x),GetStartOffset(1, customRequiredSpace.y));//Debug.Log("actualCellCountX: " + actualCellCountX);//Debug.Log("actualCellCountY: " + actualCellCountY);//Debug.Log("requiredSpace.x: " + requiredSpace.x);//Debug.Log("requiredSpace.y: " + requiredSpace.y);//Debug.Log("startOffset.x: " + startOffset.x);//Debug.Log("startOffset.y: " + startOffset.y);//Debug.Log("-------------------------------");//Debug.Log("customActualCellCountX: " + customActualCellCountX);//Debug.Log("customActualCellCountY: " + customActualCellCountY);//Debug.Log("customRequiredSpace.x: " + customRequiredSpace.x);//Debug.Log("customRequiredSpace.y: " + customRequiredSpace.y);//Debug.Log("customStartOffset.x: " + customStartOffset.x);//Debug.Log("customStartOffset.y: " + customStartOffset.y);int startCount = rectChildren.Count % cellsPerMainAxis;int totalLine = startAxis == Axis.Horizontal ? customActualCellCountY : customActualCellCountX;for (int i = 0; i < rectChildren.Count; i++){int positionX;int positionY;if (m_enableMiddle && startCount > 0 && totalLine <= m_surpassLine){if (i < startCount){if (startAxis == Axis.Horizontal){positionX = i;positionY = 0;if (cornerX == 1)positionX = startCount - 1 - positionX;if (cornerY == 1)positionY = actualCellCountY - 1 - positionY;}else{positionX = 0;positionY = i;if (cornerX == 1)positionX = actualCellCountX - 1 - positionX;if (cornerY == 1)positionY = startCount - 1 - positionY;}SetChildAlongAxis(rectChildren[i], 0, customStartOffset.x + (cellSize[0] + spacing[0]) * positionX, cellSize[0]);SetChildAlongAxis(rectChildren[i], 1, customStartOffset.y + (cellSize[1] + spacing[1]) * positionY, cellSize[1]);}else{int index = i - startCount;if (startAxis == Axis.Horizontal){positionX = index % cellsPerMainAxis;positionY = index / cellsPerMainAxis + 1;}else{positionX = index / cellsPerMainAxis + 1;positionY = index % cellsPerMainAxis;}if (cornerX == 1)positionX = actualCellCountX - 1 - positionX;if (cornerY == 1)positionY = actualCellCountY - 1 - positionY;SetChildAlongAxis(rectChildren[i], 0, startOffset.x + (cellSize[0] + spacing[0]) * positionX, cellSize[0]);SetChildAlongAxis(rectChildren[i], 1, startOffset.y + (cellSize[1] + spacing[1]) * positionY, cellSize[1]);}}else{if (startAxis == Axis.Horizontal){positionX = i % cellsPerMainAxis;positionY = i / cellsPerMainAxis;}else{positionX = i / cellsPerMainAxis;positionY = i % cellsPerMainAxis;}if (cornerX == 1)positionX = actualCellCountX - 1 - positionX;if (cornerY == 1)positionY = actualCellCountY - 1 - positionY;SetChildAlongAxis(rectChildren[i], 0, startOffset.x + (cellSize[0] + spacing[0]) * positionX, cellSize[0]);SetChildAlongAxis(rectChildren[i], 1, startOffset.y + (cellSize[1] + spacing[1]) * positionY, cellSize[1]);}//Debuger.Log("positionX: " + positionX + "positionY: " + positionY + ",cellsPerMainAxis: " + cellsPerMainAxis);}}}
}

效果:

  

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

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

相关文章

香橙派转换模型以及在开发板上部署

新手小白记录一下自己使用香橙派模型转换以及在开发板上运行的过程&#xff0c;防止后面忘记。 使用的开发板&#xff1a;Orange Pi 5 Plus&#xff08;rk3588&#xff09; 官方的一些资料在&#xff08;主要参考用户手册&#xff09;&#xff1a;Orange Pi - Orangepihttp:/…

【视频讲解】Python贝叶斯卷积神经网络分类胸部X光图像数据集实例

全文链接&#xff1a;https://tecdat.cn/?p37604 分析师&#xff1a;Yuanchun Niu 在人工智能的诸多领域中&#xff0c;分类技术扮演着核心角色&#xff0c;其应用广泛而深远。无论是在金融风险评估、医疗诊断、安全监控还是日常的交互式服务中&#xff0c;有效的分类算法都是…

科研绘图系列:R语言富集散点图(enrichment scatter plot)

介绍 富集通路散点图(Enrichment Pathway Scatter Plot)是一种数据可视化工具,用于展示基因集富集分析(Gene Set Enrichment Analysis, GSEA)的结果。 横坐标是对应基因名称,纵坐标是通路名称,图中的点表示该基因在某个通路下的qvalue,可以简单理解为不同环境下的贡献…

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片那是获取资料的入口&#xff01; 【全网最全】2024年数学建模国赛A题30页完整建模文档17页成品论文保奖matla代码可视化图表等&#xff08;后续会更新&#xff09;「首先来看看目前已有的资料&#xff0…

【ACM独立出版|EI快检索-高录用|IEEE Fellow支持】2024年数字经济与计算机科学国际学术会议(DECS2024)

【ACM独立出版&#xff5c;EI快检索-高录用&#xff5c;IEEE Fellow支持】 2024年数字经济与计算机科学国际学术会议&#xff08;DECS2024&#xff09; *ACM独立出版&#xff0c;快检索&#xff0c;高录用 *见刊后1个月左右完成EI&Scopus检索 *国内211大学、世界QS名校…

系统架构师-ERP+集成

ERP 集成平台end&#xff1a;就懒得画新的页

MyBatis-MappedStatement什么时候生成?QueryWrapper如何做到动态生成了SQL?

通过XML配置的MappedStatement 这部分MappedStatement主要是由MybatisXMLMapperBuilder进行解析&#xff0c;核心逻辑如下&#xff1a; 通过注解配置的MappedStatement 核心逻辑就在这个里面了&#xff1a; 继承BaseMapper的MappedStatement 我们看看这个类&#xff0c;里…

Java项目——苍穹外卖(一)

Entity、DTO、VO Entity&#xff08;实体&#xff09; Entity 是表示数据库表的对象&#xff0c;通常对应数据库中的一行数据。它通常包含与数据库表对应的字段&#xff0c;并可能包含一些业务逻辑。 DTO&#xff08;数据传输对象&#xff09; 作用&#xff1a;DTO 是用于在…

【小沐学OpenGL】Ubuntu环境下glfw的安装和使用

文章目录 1、简介1.1 OpenGL简介1.2 glfw简介 2、安装glfw2.1 直接命令二进制安装2.2 源码安装 3、测试glfw3.1 测试1&#xff0c;glfwglew3.2 测试2&#xff0c;glfwglad3.3 测试3 结语 1、简介 1.1 OpenGL简介 OpenGL作为图形界的工业标准&#xff0c;其仅仅定义了一组2D和…

Vivado编译报错黑盒子问题

1 问题描述 “Black Box Instances: Cell **** of type ** has undefined contents and is considered a back box. The contents of this cell must be defined for opt_design to complete successfully.” 检查工程代码提示的模块&#xff0c;该模块为纯手写的Veril…

注册安全分析报告:熊猫频道

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【论文阅读】CiteTracker: Correlating Image and Text for Visual Tracking

paper&#xff1a;[2308.11322] CiteTracker: Correlating Image and Text for Visual Tracking (arxiv.org) code&#xff1a;NorahGreen/CiteTracker: [ICCV23] CiteTracker: Correlating Image and Text for Visual Tracking (github.com) 简介 现有的视觉跟踪方法通常以…

前端:HTML、CSS、JS、Vue

1 前端 内容概要 了解前端三件套(HTML、CSS、JS)在前端所起的作用掌握HTML标签的功能&#xff0c;掌握重要标签(a标签&#xff0c;form标签)了解CSS了解JS的基础语法掌握Vue的基础语法重点掌握Vue项目怎么启动项目掌握前后端分离是什么。前端做什么事情&#xff0c;后端做什么…

视频监控系统布局策略:EasyCVR视频汇聚平台构建高效、全面的安全防线

随着科技的飞速发展&#xff0c;视频监控系统已成为现代社会安全防范的重要组成部分&#xff0c;广泛应用于公共场所、企业园区、住宅小区等各个领域。一个科学合理的视频监控系统布局与选型策略&#xff0c;不仅能够显著提升安全监控的效率和效果&#xff0c;还能在关键时刻提…

Pytest-@pytest.fixture夹具篇(一)

一、定义 在Python的pytest测试框架中&#xff0c;pytest.fixture是一个&#xff08;不是唯一&#xff09;装饰器&#xff0c;用于定义一个测试夹具。 二、简单实例 使用参数autouserTrue pytest.fixture(autouseTrue) def my_fixture():print("Setup: 准备测试环境&q…

计算机毕业设计 | SpringBoot+vue 游戏商城 steam网站管理系统(附源码)

1&#xff0c;项目背景 国家大力推进信息化建设的大背景下&#xff0c;城市网络基础设施和信息化应用水平得到了极大的提高和提高。特别是在经济发达的沿海地区&#xff0c;商业和服务业也比较发达&#xff0c;公众接受新事物的能力和消费水平也比较高。开展商贸流通产业的信息…

应用层协议HTTP

应用层协议中的 HTTP&#xff08;超文本传输协议&#xff09;。在互联网中&#xff0c;HTTP 协议是一个至关重要的一个协议&#xff0c;它定义了客户端与服务器之间如何进行通信&#xff0c;以交换或传输超文本。 本篇介绍了有关 URL 的相关知识&#xff0c;http 的报文格式&am…

Apache Pig

目录 一、配置说明1.本地模式2.集群模式 二、pig的数据模型三、pig的数据类型四、惰性执行五、pig的基本语法5.1语法说明5.2案例操作 六、pig的自定义函数 一、配置说明 1.本地模式 操作的是Linux系统文件 pig -x local关键日志 当前处于root目录下 2.集群模式 连接的是…

CentOS7单机环境安装k8s集群

目录 1、环境准备 2、安装依赖工具 3、配置 Kubernetes 的国内 Yum 源 4. 安装 Kubernetes 组件 5、初始化 Kubernetes 集群 1. 容器运行时没有正常运行 1.1. 可能的原因 1.2. 解决办法 2. 初始化拉取镜像卡住 2.1. 使用国内的镜像源&#xff08;无法解决问题&#x…

AI绘画工具排行榜:探索最受欢迎的AI绘图软件特点与选择指南

AI绘画工具各有优势&#xff0c;从开放性到对特定语言和文化的支持&#xff0c;以及对图像细节和艺术性的不同关注点&#xff0c;根据具体需求选择合适的工具 MidJourney 图片品质卓越&#xff0c;充满独特创意&#xff0c;初期能够免费获取数十账高质量图片&#xff0c;整个生…