当前位置: 首页 > news >正文

鸿蒙原生开发手记:徒步迹 - ArkUI 声明式UI基础组件

学习 ArkUI 核心组件,构建"徒步迹"的用户界面基础


一、前言

ArkUI 是鸿蒙原生应用的声明式 UI 框架,采用类似 SwiftUI 和 Jetpack Compose 的声明式编程范式。开发者只需描述 UI 的最终状态,框架自动处理状态变化时的界面更新。

本文将系统介绍 ArkUI 的基础组件,包括布局容器、文本、图片、按钮、输入框等,并结合"徒步迹"的实际场景演示用法。


二、组件基础结构

2.1 组件树

ArkUI 中每个页面由组件树构成,组件通过链式调用设置属性:

@Entry@Componentstruct ExamplePage{build(){Column(){// 父组件:列布局Text('Hello')// 子组件1:文本.fontSize(20)// 链式属性设置.fontColor('#333');Button('点击')// 子组件2:按钮.onClick(()=>{});}.width('100%')// 父组件属性.padding(16);}}

2.2 组件分类

ArkUI 组件按功能可分为:

  • 布局组件:Column、Row、Stack、Flex、Grid、List
  • 基础组件:Text、Image、Button、TextInput、Slider
  • 展示组件:Progress、LoadingProgress、Badge、Panel
  • 交互组件:Dialog、Menu、Picker、DatePicker
  • 导航组件:Navigation、Tab、NavRouter

三、布局容器

3.1 Column - 垂直布局

Column 是最常用的垂直排列布局,子组件从上到下排列:

// 徒步迹 - 个人中心头部布局Column(){// 头像Image($r('app.media.avatar')).width(80).height(80).borderRadius(40);// 用户名Text('徒步爱好者').fontSize(20).fontWeight(FontWeight.Bold).fontColor($r('app.color.text_primary'));// 统计信息Text('累计徒步 86km').fontSize(14).fontColor($r('app.color.text_secondary'));}.width('100%').alignItems(HorizontalAlign.Center)// 居中对齐.padding(24);

3.2 Row - 水平布局

Row 用于水平排列子组件:

// 徒步迹 - 今日概览统计行Row(){this.StatItem('🏃','8,642','步数');this.StatItem('📏','5.2','距离');this.StatItem('🔥','320','卡路里');}.width('100%').justifyContent(FlexAlign.SpaceAround);// 均匀分布

3.3 Stack - 层叠布局

Stack 用于组件叠加(类似 CSS 的 position: absolute):

// 徒步迹 - 路线卡片顶部区域Stack(){// 背景图片Image($r('app.media.route_bg')).width('100%').height(140).objectFit(ImageFit.Cover);// 难度标签,叠加在图片上Text('中等').fontSize(12).fontColor(Color.White).backgroundColor($r('app.color.warning_color')).padding({left:10,right:10,top:4,bottom:4}).borderRadius(10).position({top:8,right:8});// 绝对定位}.width('100%').height(140);

3.4 Flex - 弹性布局

Flex 提供了更灵活的布局控制:

Flex({direction:FlexDirection.Row,// 主轴方向wrap:FlexWrap.Wrap,// 是否换行justifyContent:FlexAlign.Center,// 主轴对齐alignItems:ItemAlign.Center,// 交叉轴对齐}){Text('标签1').padding(8).backgroundColor('#E8F5E9').borderRadius(4);Text('标签2').padding(8).backgroundColor('#E3F2FD').borderRadius(4);Text('标签3').padding(8).backgroundColor('#FFF3E0').borderRadius(4);}

四、基础组件

4.1 Text - 文本

ArkUI 中最常用的文本组件:

// 基本用法Text('徒步迹').fontSize(24)// 字号.fontWeight(FontWeight.Bold)// 加粗.fontColor($r('app.color.primary_color'));// 取色// 多行文本Text('这是一条风景优美的徒步路线,沿途经过森林和溪流').fontSize(14).fontColor($r('app.color.text_secondary')).maxLines(2)// 最多2行.textOverflow({overflow:TextOverflow.Ellipsis});// 溢出省略// 富文本(部分样式)Text(){Span('徒步')// 内联片段.fontSize(16).fontColor($r('app.color.primary_color'));Span('迹').fontSize(20).fontColor($r('app.color.accent_color'));}

4.2 Image - 图片

// 加载资源图片Image($r('app.media.app_icon')).width(100).height(100).borderRadius(16).objectFit(ImageFit.Cover);// 裁剪模式// 加载网络图片(需申请网络权限)Image('https://example.com/photo.jpg').width('100%').height(200).objectFit(ImageFit.Cover);

4.3 Button - 按钮

// 文本按钮Button('开始徒步').width(200).height(48).backgroundColor($r('app.color.primary_color')).borderRadius(24).fontColor(Color.White).fontSize(16).onClick(()=>{console.log('开始记录轨迹');});// 自定义内容按钮Button(){Row(){Image($r('app.media.app_icon')).width(18).height(18);Text('创建团队').fontSize(14).fontColor(Color.White);}.alignItems(HorizontalAlign.Center);}.width('90%').height(44).backgroundColor($r('app.color.primary_color')).borderRadius(22);

4.4 TextInput - 文本输入框

// 普通输入TextInput({placeholder:'请输入手机号'}).width('100%').height(48).backgroundColor('#F5F5F5').borderRadius(12).padding({left:16}).type(InputType.PhoneNumber)// 输入类型.maxLength(11)// 最大长度.onChange((value:string)=>{console.log(`输入:${value}`);});// 密码输入TextInput({placeholder:'请输入密码'}).width('100%').height(48).backgroundColor('#F5F5F5').borderRadius(12).padding({left:16}).type(InputType.Password)// 密码类型.showPasswordIcon(true);// 显示密码切换

五、列表组件

5.1 ForEach - 循环渲染

@Stateroutes:HikingRoute[]=[{id:1,name:'香山徒步'},{id:2,name:'奥森公园'},{id:3,name:'百望山'},];build(){Column(){ForEach(this.routes,(route:HikingRoute)=>{Text(route.name).fontSize(16).padding(12).width('100%');},(route:HikingRoute)=>route.id.toString());}}

5.2 List - 高效长列表

List(){ForEach(this.routes,(route:HikingRoute)=>{ListItem(){RouteCard({route:route});}},(route:HikingRoute)=>route.id.toString());}.divider({strokeWidth:1,color:'#EEE'})// 分割线.edgeEffect(EdgeEffect.Spring);// 弹性效果

六、修饰符与链式调用

ArkUI 采用链式调用来设置组件属性,这是最常用的编程模式:

// 单行链式Text('徒步迹').fontSize(20).fontColor('#4CAF50').fontWeight(FontWeight.Bold);// 多行链式(推荐,可读性更好)Text('徒步迹').fontSize(20).fontColor($r('app.color.primary_color')).fontWeight(FontWeight.Bold).margin({top:12,bottom:12}).padding({left:16,right:16}).backgroundColor('#F5F5F5').borderRadius(8).textAlign(TextAlign.Center).width('100%');

七、实战:徒步迹首页概览卡片

综合运用所学组件,实现"徒步迹"首页的今日概览卡片:

@Componentstruct TodayOverview{@Propsteps:number=0;@Propdistance:number=0;@Propcalories:number=0;build(){Column(){Text('今日概览').fontSize(16).fontWeight(FontWeight.Medium).width('100%');Row(){// 步数Column(){Text('🏃').fontSize(28);Text(`${this.steps}`).fontSize(22).fontWeight(FontWeight.Bold);Text('步').fontSize(12).fontColor('#999');}.alignItems(HorizontalAlign.Center).layoutWeight(1);// 距离Column(){Text('📏').fontSize(28);Text(`${this.distance.toFixed(1)}`).fontSize(22).fontWeight(FontWeight.Bold);Text('km').fontSize(12).fontColor('#999');}.alignItems(HorizontalAlign.Center).layoutWeight(1);// 卡路里Column(){Text('🔥').fontSize(28);Text(`${this.calories}`).fontSize(22).fontWeight(FontWeight.Bold);Text('kcal').fontSize(12).fontColor('#999');}.alignItems(HorizontalAlign.Center).layoutWeight(1);}.width('100%').margin({top:16}).padding(12);}.width('100%').padding(16).backgroundColor(Color.White).borderRadius(16);}}// 使用@Entry@Componentstruct HomePage{build(){Column(){TodayOverview({steps:8642,distance:5.2,calories:320});}.width('100%').height('100%').backgroundColor('#F5F5F5').padding(16);}}

这段代码在 App 中的实际效果,可以参考项目截图:


八、总结

本文介绍了 ArkUI 的核心基础组件,包括 Column、Row、Stack 布局容器,Text、Image、Button、TextInput 等基础组件,以及 ForEach、List 等列表组件。掌握这些组件后,你已经可以构建大部分应用界面。

下一篇文章我们将学习 Stage 模型和 UIAbility 的深入应用,理解鸿蒙应用的运行机制。


下一篇预告:鸿蒙原生开发手机:徒步迹 - Stage 模型与UIAbility详解

有问题欢迎在评论区交流探讨。

http://www.jsqmd.com/news/1184395/

相关文章:

  • 亨得利官方钟表服务中心|官方热线及详细网点地址权威信息公告(2026年7月最新) - 亨得利官方
  • 中文隐喻文本解析:基于NLP的情感分析与隐喻识别实践
  • Pixelle-Video:开源AI短视频生成引擎全解析与实战指南
  • Windows SBS 2011 技术解析:集成架构、部署实践与迁移指南
  • 为什么Python是机器学习工程实践的首选语言
  • 降 AI 率软件那么多到底选哪个?三个标准帮你挑
  • 【线激光扫描三维成像】从硬件选型到软件实现的工业检测实战指南
  • Windows Server 2012 Build 7968:从SKU演变看微软服务器产品策略
  • 帝舵中国官方售后服务中心|官方地址及售后服务电话权威信息公示(2026年7月更新) - 帝舵中国官方服务中心
  • LangChain 1.3 Deep Agent实战:从LLM调用到智能体架构升级
  • PyTorch与TensorFlow选型实战:科研效率vs工程可靠性
  • 中文情感分析技术实践:从原理到部署的完整指南
  • 用Folium构建城市绿地交互地图:Open Data驱动的轻量级GIS实践
  • 毕设可用的网页端艺术风格迁移工具包,含多个TensorFlow.js预训练模型和即跑示例
  • 豆包AI搜索推广实战指南:从账户搭建到效果优化
  • TLA2518与PIC32MX675F512L的高精度ADC系统设计
  • 代理人驱动盘:Docker容器化开发环境快速搭建实战指南
  • 宝珀中国官方售后服务中心|官方电话和网点地址权威信息声明(2026年7月最新) - 宝珀官方售后服务中心
  • WPS超级会员PDF转Word全攻略:OCR技术、批量处理与高效办公
  • Windows C++ 显示器信息枚举与显示模式查询实战指南
  • 直流负载管理技术:继电器选型与微控制器应用
  • 智能协作代理技术解析:从AI助手到主动式开发伙伴的演进
  • Windows下部署OpenClaw框架打造智能QQ机器人
  • 麒麟操作系统软件更新灾难连篇之二:QQ安装包格式全解析与实战避坑
  • 如何免费解锁专业设计软件:开源激活方案完整指南
  • n8n SEO自动化实战:14个可落地的低代码工作流方案
  • 如何用网盘直链下载助手实现高速下载:9大平台完整操作指南
  • Windows 98界面改造:模拟XP与Win7视觉效果的完整指南
  • 假设检验实战指南:从p值误解到决策落地
  • Python实现彩色ASCII艺术图:图像处理入门实战