news 2026/7/10 1:13:46

HarmonyOS 小游戏《对战五子棋》开发第23篇 - 保持棋盘正方形

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 小游戏《对战五子棋》开发第23篇 - 保持棋盘正方形

一个属性解决正方形问题——ArkUI布局的优雅之处

棋盘图片:

问题:如何保证棋盘永远是正方形

棋盘必须是正方形(15x15等比例),但屏幕通常是长方形。如果设置width('100%')height('100%'),棋盘会被拉伸变形。

方案对比

方案1:硬编码尺寸(不推荐)

Canvas(this.context).width(320).height(320)

问题:不同设备上尺寸固定,小屏太大、大屏太小。

方案2:手动计算(不推荐)

Canvas(this.context).width('100%').height(this.calculatedHeight)// 需要手动计算

问题:需要监听宽度变化,手动计算高度,代码复杂。

方案3:aspectRatio(本项目使用)

Canvas(this.context).width('100%').aspectRatio(1)// 宽高比1:1 → 正方形

aspectRatio详解

aspectRatio(ratio)设置组件的宽高比:

  • aspectRatio(1):宽=高(正方形)
  • aspectRatio(2):宽=2×高
  • aspectRatio(0.5):高=2×宽

工作原理:当设置了宽度(如width('100%')),aspectRatio自动计算高度。

宽度 = 父容器宽度 (如360vp) 高度 = 宽度 / aspectRatio = 360 / 1 = 360vp → 正方形!

棋盘容器的布局

Column(){ChessBoardView({boardData:this.boardData,lastMoveRow:this.lastMoveRow,lastMoveCol:this.lastMoveCol,onCellClick:(row:number,col:number)=>{this.onCellClick(row,col);}})}.width('92%')// 棋盘容器占页面92%.backgroundColor('#D4A868')// 木色背景.borderRadius(8)// 圆角.clip(true)// 裁剪超出部分

布局层次

页面 (100%) └─ Column (92%) ← 棋盘外框,有边距 └─ Canvas (100%, aspectRatio 1) ← 棋盘画布,正方形

clip(true)的作用

.clip(true)

Canvas是矩形,但外层Column有borderRadius(8)圆角。clip(true)让Canvas被裁剪为圆角矩形,避免棋盘四角超出圆角边框。

无clip: 有clip: ┌──────────┐ ╭──────────╮ │ Canvas │ │ Canvas │ │ (直角) │ │ (圆角) │ └──────────┘ ╰──────────╯

布局完整性

整个页面的布局结构:

Column(){// 顶部导航栏 (固定高度56)Row(){...}.height(56)// 状态栏 (自适应)Row(){...}.width('92%')// 状态文字 (自适应)Text(...)// 棋盘 (92%宽度,正方形)Column(){ChessBoardView(...)}.width('92%').borderRadius(8).clip(true)// 底部按钮 (自适应)Row(){...}.width('92%')}.width('100%').height('100%').backgroundColor('#F5F0E8')

垂直空间分配

  • 导航栏:固定56vp
  • 状态栏:内容高度
  • 棋盘:92%宽度的正方形
  • 底部按钮:内容高度
  • 剩余空间:自动分配

在小屏设备上的适配

如果屏幕太小,棋盘可能占满垂直空间。此时需要确保其他元素仍然可见:

Column(){Row(){...}.height(56)// 导航栏固定Row(){...}// 状态栏Text(...)// 状态文字Column(){ChessBoardView(...)}.width('92%')// 棋盘Row(){...}// 底部按钮}

ArkUI的Column默认从上到下排列,如果内容超出屏幕,可以滚动。但五子棋的布局通常不会超出——棋盘宽度92%意味着高度也是92%宽,在大多数设备上都能容纳。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 1:12:32

维度建模实战:电商数仓 6 步构建星型模型,产出 10+ 核心事实/维度表

电商数仓实战:从0到1构建高可用星型模型在电商行业数据爆炸式增长的今天,如何高效组织海量业务数据成为每个数据团队的核心挑战。本文将带您深入电商数据仓库构建的完整流程,通过6个关键步骤落地星型模型,最终产出10核心事实表与维…

作者头像 李华
网站建设 2026/7/10 1:10:54

直流有刷电机驱动方案:TC78H651AFNG与PIC18F85J10实战

1. 项目背景与核心器件选型在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。TC78H651AFNG(东芝)和PIC18F85J10(Microchip)这对组合&am…

作者头像 李华
网站建设 2026/7/10 1:08:42

02-01-确认环境依赖(全平台发布)

2.1 章节目标 📖 上下文回顾:在 01 章看完七层架构全景之后,你现在站在 L1 模型描述层的入口。本章不涉及任何代码编写——它的唯一目标是让你在 30 分钟内把环境搭好、把 ElectronBot 的 MJCF 模型加载到 MuJoCo Viewer 里、看到 6 个关节自…

作者头像 李华
网站建设 2026/7/10 1:05:56

你想不想用一套系统方法,把复杂的医学数据变成清晰结论?

「数据很多,但不知道怎么下手?」这是很多临床医生的困惑。医学数据往往很复杂:患者信息、检查结果、用药记录、随访数据……面对这么多数据,如何从中提炼出有价值的结论?今天讲清楚:一套系统的医学数据分析…

作者头像 李华