HarmonyOS应用《玄象》开发实战:五行环绕太极:Stack 定位 + getFiveElementPosition 三角函数布局
阅读时长约 19 分钟 | 难度★★★★★ | 篇章第 3 篇 · 首页与功能导航对应源码entry/src/main/ets/pages/HomePage.ets中的getFiveElementPosition方法前言玄象项目首页今日天地卡片中5 个五行徽章围绕太极图呈五角星分布。这一视觉布局通过 ArkUI 的Stack层叠容器配合position精确定位实现其核心算法getFiveElementPosition运用三角函数计算每个徽章的圆周坐标。本篇将深入剖析玄象项目五行环绕太极的实现从Stack层叠容器、ForEach列表渲染、position精确定位到Math.cos/Math.sin三角函数布局算法。掌握这套圆周布局方法论您就能为任何 HarmonyOS 应用打造星宿环绕、轮盘布局等复杂视觉。提示圆周布局是玄象项目的核心视觉语言——五行环绕太极、二十八宿环绕紫微、二十四山环绕罗盘。一、五行环绕太极完整源码1.1 源码全貌Stack(){Canvas(this.taijiContext).width(180).height(180).onReady((){this.drawTaiji(this.taijiContext,this.taijiContext.width,this.taijiContext.height);})ForEach([火,木,山,水,金],(item:string,index:number){Text(item).fontSize(18).fontWeight(FontWeight.Bold).fontColor(#FFFFFF).width(44).height(44).textAlign(TextAlign.Center).backgroundColor(Colors.BG_CARD).border({width:1.5,color:Colors.PRIMARY_GOLD,radius:22}).borderRadius(22).position(this.getFiveElementPosition(index,180,44))},(item:string)item)}.width(220).height(220).align(Alignment.Center)1.2 三层视觉结构Stack (220×220) ├── Canvas (180×180 太极图) ← 底层 └── ForEach (5 个五行徽章) ← 上层 ├── Text 火 (index0) ├── Text 木 (index1) ├── Text 山 (index2) ├── Text 水 (index3) └── Text 金 (index4)二、Stack 层叠容器2.1 Stack 的对齐特性Stack默认让所有子元素居中对齐按声明顺序层叠。2.2 玄象项目 Stack 配置Stack(){Canvas(this.taijiContext).width(180).height(180)ForEach(...){Text(item)...}}.width(220).height(220).align(Alignment.Center)属性值含义width220Stack 宽度 220vpheight220Stack 高度 220vpalignAlignment.Center子元素居中对齐2.3 Stack 中 Canvas 与五行徽章的关系220×220 Stack 区域 ↓ ┌──────────────┐ │ │ │ 180×180 │ ← Canvas 居中 │ 太极图 │ │ │ └──────────────┘ 五个五行徽章 (44×44) 通过 position 精确放置在太极图周围三、ForEach 列表渲染3.1 ForEach 基本用法ForEach([火,木,山,水,金],(item:string,index:number){Text(item)// ....position(this.getFiveElementPosition(index,180,44))},(item:string)item)3.2 ForEach 三参数参数类型作用数据源string[]待渲染数组itemGenerator(item, index) void单项渲染函数keyGenerator(item) string唯一键生成函数3.3 keyGenerator 的作用(item:string)itemkeyGenerator返回数组元素本身‘火’、木’等作为唯一键帮助 ArkUI 高效更新列表。提示玄象项目五行数组顺序为[火, 木, 山, 水, 金]对应index0-4。四、position 精确定位4.1 position 属性.position(this.getFiveElementPosition(index,180,44))position(value: Position)设置组件相对于父容器的左上角坐标。4.2 Position 类型interfacePosition{x:number|string;y:number|string;}4.3 position 的特殊性使用position后组件脱离常规布局流按指定坐标放置。这正是五行徽章能精确环绕太极图的关键。五、getFiveElementPosition 三角函数算法5.1 完整源码privategetFiveElementPosition(index:number,containerSize:number,itemSize:number):Position{constangle(index*72-90)*Math.PI/180;constradiuscontainerSize/210;constcxcontainerSize/2;constcycontainerSize/2;return{x:cxradius*Math.cos(angle)-itemSize/2,y:cyradius*Math.sin(angle)-itemSize/2};}5.2 算法分解步骤 1计算角度 angle (index * 72 - 90) * π / 180 步骤 2计算半径 radius containerSize / 2 10 步骤 3确定圆心 cx containerSize / 2 cy containerSize / 2 步骤 4极坐标转直角坐标 x cx radius * cos(angle) - itemSize / 2 y cy radius * sin(angle) - itemSize / 25.3 角度计算详解constangle(index*72-90)*Math.PI/180;index计算角度弧度00*72 - 90 -90-90°-π/211*72 - 90 -18-18°-π/1022*72 - 90 5454°3π/1033*72 - 90 126126°7π/1044*72 - 90 198198°11π/105.4 72 度的由来5 个徽章均分圆周每个徽章占 360/5 72 度。5.5 -90 偏移的作用无偏移index0 在 0°右侧 有 -90 偏移index0 在 -90°上方玄象项目希望第一个徽章火位于太极图正上方因此引入 -90 偏移。5.6 弧度转换*Math.PI/180JavaScript 三角函数接受弧度而非角度。转换公式弧度 角度 × π / 180。5.7 半径计算constradiuscontainerSize/210;containerSize / 2 太极图半径 10 徽章向外延伸 10vp5.8 圆心与坐标constcxcontainerSize/2;// 90constcycontainerSize/2;// 90玄象项目太极图 Canvas 尺寸 180×180圆心位于 (90, 90)。5.9 最终坐标计算return{x:cxradius*Math.cos(angle)-itemSize/2,y:cyradius*Math.sin(angle)-itemSize/2};- itemSize / 2的意义position设置的是组件左上角坐标需减去半个徽章尺寸让徽章中心对齐圆周点。5.10 实际坐标计算示例以index0火为例angle -90° -π/2 radius 90 10 100 cx 90, cy 90 itemSize 44 cos(-π/2) 0 sin(-π/2) -1 x 90 100 * 0 - 44 / 2 90 - 22 68 y 90 100 * (-1) - 44 / 2 90 - 100 - 22 -32火徽章左上角位于 (68, -32)即太极图正上方略偏外。六、五行徽章的样式6.1 完整样式Text(item).fontSize(18).fontWeight(FontWeight.Bold).fontColor(#FFFFFF).width(44).height(44).textAlign(TextAlign.Center).backgroundColor(Colors.BG_CARD).border({width:1.5,color:Colors.PRIMARY_GOLD,radius:22}).borderRadius(22)6.2 圆形徽章的实现width 44, height 44 ← 正方形 borderRadius 22 ← 半径 边长 / 2 完整圆形6.3 金色边框.border({width:1.5,color:Colors.PRIMARY_GOLD,radius:22})1.5vp 宽度的金色边框与卡片金边呼应。七、五行徽章的视觉布局7.1 五行方位火 ┌────────┐ 金 │ 太极 │ 木 │ 图 │ 山 │ │ 水 └────────┘7.2 五行属性对照五行方位颜色火南上红木东右绿金西左白水北下蓝土中黄提示玄象项目五行数组用山代替土是设计变体。八、圆周布局的通用算法8.1 抽象通用算法functiongetCircularPosition(index:number,total:number,center:{x:number,y:number},radius:number,startAngle:number-90,itemSize:number0):Position{constangle(index*(360/total)startAngle)*Math.PI/180;return{x:center.xradius*Math.cos(angle)-itemSize/2,y:center.yradius*Math.sin(angle)-itemSize/2};}8.2 玄象项目应用场景场景totalstartAngle五行环绕太极5-90°二十八宿环绕28-90°二十四山罗盘240°八卦环绕中心8-90°8.3 算法封装建议// common/utils/CircularLayout.etsexportclassCircularLayout{staticgetPosition(index:number,total:number,centerX:number,centerY:number,radius:number,startAngle:number-90,itemSize:number0):Position{constangle(index*(360/total)startAngle)*Math.PI/180;return{x:centerXradius*Math.cos(angle)-itemSize/2,y:centerYradius*Math.sin(angle)-itemSize/2};}}九、五行徽章的交互扩展9.1 点击跳转Text(item).onClick((){router.pushUrl({url:pages/stems/HeavenlyStemsPage,params:{element:item}});})9.2 悬停高亮Text(item).scale({x:this.hoverIndexindex?1.1:1,y:this.hoverIndexindex?1.1:1}).animation({duration:200})9.3 旋转动画Staterotation:number0;Stack(){// ...}.rotate({angle:this.rotation}).animation({duration:60000,iterations:-1,curve:Curve.Linear})aboutToAppear(){this.rotation360;}提示玄象项目风水罗盘可结合圆周布局 旋转动画 陀螺仪传感器实现真实的罗盘体验。十、玄象项目圆周布局体系10.1 应用场景汇总模块圆周布局场景首页五行环绕太极星宿二十八宿列表周易八卦环绕、卦象大轮盘风水二十四山罗盘命理十二宫位排盘乐律十二律吕圆周10.2 圆周布局的视觉价值文化契合圆周布局契合东方天圆地方哲学。视觉聚焦中心元素被环绕元素强化。空间利用圆周布局比线性布局更紧凑。总结本篇以玄象项目五行环绕太极为蓝本深入剖析了 ArkUI 圆周布局算法从Stack层叠容器、ForEach列表渲染、position精确定位到getFiveElementPosition三角函数算法、极坐标转直角坐标、72 度均分原理。掌握这套圆周布局方法论您就能为任何 HarmonyOS 应用打造星宿环绕、轮盘布局等复杂视觉。下一篇《24 · 宜忌标签云ForEach padding borderRadius 的 chip 实现》将带您深入玄象项目首页宜忌标签的实现。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源HarmonyOS 官方文档Stack 组件HarmonyOS 官方文档ForEach 组件HarmonyOS 官方文档position 属性MDN Math.cosdeveloper.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/cos开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net

相关新闻

SAM模型在遥感图像分割中的优化实践

SAM模型在遥感图像分割中的优化实践

1. 项目概述去年Meta推出的SAM(Segment Anything Model)在计算机视觉领域掀起了一场分割革命。这个号称"能分割万物"的模型,在通用场景下展现出了惊人的零样本分割能力。但当我们把它应用到遥感图像分析时,却发现效果大…

2026/10/27 19:31:55 阅读更多 →
大语言模型智体技能解析与应用实践

大语言模型智体技能解析与应用实践

1. 大语言模型智体技能概述大语言模型(LLM)作为当前人工智能领域最具突破性的技术之一,其"智体技能"(Agent Capabilities)正引发广泛关注。简单来说,智体技能指的是大模型在特定场景下展现出的类…

2026/10/27 19:31:41 阅读更多 →
HarmonyOS应用《玄象》开发实战:.ohpm 依赖管理:@ohos/hypium 与 @ohos/hamock 测试体系

HarmonyOS应用《玄象》开发实战:.ohpm 依赖管理:@ohos/hypium 与 @ohos/hamock 测试体系

阅读时长:约 18 分钟 | 难度:★★★☆☆ | 篇章:第 1 篇 项目架构与设计哲学 对应源码:xuanxiang_ohos_app/oh-package.json5、entry/oh-package.json5、entry/src/ohosTest/、entry/src/test/ 前言 在大型 HarmonyOS 应用中…

2026/10/27 3:55:20 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →