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

【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解

【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解

一、前言:移动开发声明式 UI 框架的技术变革

在移动操作系统的发展历程中,UI 开发模式经历了从命令式到声明式的重大变革。

根据华为开发者联盟 2024 年数据报告显示,HarmonyOS 设备激活量已突破 7.3 亿台,其中采用 ArkTS 声明式 UI 框架开发的应用占比达 68%,较 2023 年提升 45 个百分点。

这标志着以 ArkTS 为代表的声明式开发范式,正在成为智能终端应用开发的主流选择。

本文将以一个典型的 ArkTS 组件代码为例(代码示例来自IDE示例)。

该代码实现了一个基础的交互界面,包含状态管理、布局设计、事件处理等核心要素,是理解 ArkTS 组件开发的绝佳切入点。

二、ArkTS 组件基础:代码结构与核心装饰器

(1)项目结构梳理
在这里插入图片描述
图(1-1)

如上图所示,该项目整体结构为HarmonyOS示例空Ability项目结构。一个常规的鸿蒙应用项目,重点需要关心编码的部分,分为三个:

  1. AppScope 设置应用的包名,图标等相关信息
  2. entry - src - main - ets 只要编码的所在地。entryAbility作为启动初始的入口,需要修改其中的启动页。pages为UI界面和逻辑开发。
  3. resource 资源目录下的图标目录 media,页面配置路由main_pages

(2)ArkTS组件声明与入口标记



struct Index {// 组件内部逻辑
}

1. @Entry 装饰器:
标记应用的Ability启动加载的入门,我们可以理解为界面。所以该装饰器修饰,都可以在Ability中加载,作为界面使用。

2. 下面为EntryAbility代码示例,配置启动页:

import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';const DOMAIN = 0x0000;export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);}onWindowStageCreate(windowStage: window.WindowStage): void {// 舞台添加启动页面windowStage.loadContent('pages/Index', (err) => {if (err.code) {hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));return;}hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');});}}

3. 下面为路由配置表resource - base - profile - main_pages.json文件:

{"src": ["pages/Index"]
}

当我们使用快捷键,创建空的pages时,IDE会自动在该路由表添加信息。若是手动,一定要记得添加页面的信息。
在这里插入图片描述

4. @Component 装饰器: 代表该类是组建类,可以给其他界面和组件调用,例如:

// 这里引入
import { Index } from './Index'

struct APage {build() {RelativeContainer() {// 这里使用Index()}.height('100%').width('100%')}
}

5. export导出
但是需要注意的是,我们需要对要引入的组件类,进行export导出标记,其他类才能去导出。所以我们的Index类需要作如下修改:



export struct Index {// 组件内部逻辑
}

(3)build函数是做什么的呢?

1. build函数构建概述

组件构建函数,定义UI结构和布局,从示例代码可以看出,build中进行了鱼鳞排版布局的编写。这也是声明式UI布局编写的一大特写,不管是Flutter还是Android的compose,都是如此。

布局通过嵌入-展开的形式,可以一目了然整个UI布局的结构。并且通过链式调用,非常方便的设置UI属性。

 // 应用入口组件标识
 // 声明为组件
export struct Index {// 组件构建函数,定义UI结构和布局build() {// 创建一个相对容器,占满整个父容器空间RelativeContainer() {// 显示message状态变量的文本组件Text(this.message).id('HelloWorld') // 设置组件ID,用于样式或交互引用.fontSize($r('app.float.page_text_font_size')) // 从资源文件获取字体大小.fontWeight(FontWeight.Bold) // 设置字体加粗.alignRules({ // 设置文本在容器中的对齐规则center: { anchor: '__container__', align: VerticalAlign.Center }, // 垂直居中middle: { anchor: '__container__', align: HorizontalAlign.Center } // 水平居中})}.height('100%') // 容器高度占满父容器.width('100%')  // 容器宽度占满父容器}
}

2.RelativeContainer 的定位策略
HarmonyOS 提供 7 种基础布局容器,RelativeContainer(相对布局)适用于元素需相对于容器或其他元素定位的场景。

根据华为 UX 设计规范,在屏幕适配场景中,相对布局的设备兼容性比绝对布局高 40%,尤其适合折叠屏等多形态设备。

.alignRules({center: { anchor: '__container__', align: VerticalAlign.Center },middle: { anchor: '__container__', align: HorizontalAlign.Center }
})

锚点系统:
__container__表示相对于父容器定位,支持自定义锚点(如子组件 ID)。华为布局引擎数据显示,合理使用锚点可减少 20% 的布局计算时间,避免递归定位导致的性能瓶颈。​

对齐策略:
VerticalAlign.Center(垂直居中)与 HorizontalAlign.Center(水平居中)组合使用,实现文本组件的屏幕中心定位。该策略在不同分辨率设备上的定位误差小于 1px(基于 1920x1080 到 4K 分辨率的测试数据)。

(4)数据交互与事件交互
1. 响应式状态管理:@State 装饰器

 message: string = 'Hello World';

@State 修饰的变量会被框架自动追踪,当变量值发生变化时,系统会智能识别受影响的 UI 元素并触发局部重绘。与传统命令式 UI 更新(如 Android 的 findViewById+setText)相比,声明式更新减少了 60% 的 DOM 操作量(基于 Chromium 内核性能测试数据)。

2. 绑定点击事件:
通过在点击事件中,处理message变量的赋值。ArkUI框架自动处理数值变化后,使用了该数值的UI进行重新渲染刷新。

.onClick(() => {this.message = 'Welcome';
})
      // 显示message状态变量的文本组件Text(this.message)

(5)资源文件的管理

.fontSize($r('app.float.page_text_font_size'))

$r () 函数:
从资源文件(resources/base/element/string.json 等)动态获取字体大小,支持多语言、多设备适配。华为开发者平台数据显示,使用资源文件管理样式可使应用包体积减少 15%,避免硬编码导致的维护成本。​

类型安全:
DevEco Studio 提供资源引用智能提示,减少 70% 的资源路径拼写错误(基于千次开发测试数据)。

三、示例项目源码与详细注释

Index.page

 // 应用入口组件标识
 // 声明为组件
export struct Index {// 响应式状态变量,用于存储显示的文本内容 message: string = 'Hello World';// 组件构建函数,定义UI结构和布局build() {// 创建一个相对容器,占满整个父容器空间RelativeContainer() {// 显示message状态变量的文本组件Text(this.message).id('HelloWorld') // 设置组件ID,用于样式或交互引用.fontSize($r('app.float.page_text_font_size')) // 从资源文件获取字体大小.fontWeight(FontWeight.Bold) // 设置字体加粗.alignRules({ // 设置文本在容器中的对齐规则center: { anchor: '__container__', align: VerticalAlign.Center }, // 垂直居中middle: { anchor: '__container__', align: HorizontalAlign.Center } // 水平居中}).onClick(() => { // 点击事件处理this.message = 'Welcome'; // 点击后更新状态变量,触发UI刷新})}.height('100%') // 容器高度占满父容器.width('100%')  // 容器宽度占满父容器}
}

APage.ets

import { Index } from './Index'

struct APage {build() {RelativeContainer() {Index()}.height('100%').width('100%')}
}

相关文章:

【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解

【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解 一、前言:移动开发声明式 UI 框架的技术变革 在移动操作系统的发展历程中,UI 开发模式经历了从命令式到声明式的重大变革。 根据华为开发者联盟 2024 年数据报告显示,HarmonyOS 设备…...

AWS Transit Gateway实战:构建DMZ隔离架构,实现可控的网络互通

在企业云网络架构中,如何实现不同VPC之间的安全互通是一个常见挑战。本文将通过AWS Transit Gateway实战,展示如何构建一个DMZ隔离架构,使DMZ可以与Test和Production环境互通,而Test和Production环境之间相互隔离。 1. Transit Gateway架构设计概述 在开始实践前,让我们先…...

用提示词写程序(3),VSCODE+Claude3.5+deepseek开发edge扩展插件V2

edge扩展插件;筛选书签,跳转搜索,设置背景 链接: https://pan.baidu.com/s/1nfnwQXCkePRnRh5ltFyfag?pwd86se 提取码: 86se 导入解压的扩展文件夹: 导入扩展成功: edge扩展插件;筛选书签,跳转搜索,设置背景...

栈与队列:数据结构的有序律动

在数据结构的舞台上,栈与队列宛如两位优雅的舞者,以独特的节奏演绎着数据的进出规则。它们虽不像顺序表与链表那般复杂多变,却有着令人着迷的简洁与实用,在众多程序场景中发挥着不可或缺的作用。今天,就让我们一同去探…...

初识PS(Photoshop)

初识PS(Photoshop) 1、Photoshop界面 2、常用快捷键...

go语言的GMP(基础)

1.概念梳理 1.1线程 通常语义中的线程,指的是内核级线程,核心点如下: (1)是操作系统最小调度单元; (2)创建、销毁、调度交由内核完成,cpu 需完成用户态与内核态间的切…...

电路图识图基础知识-高、低压供配电系统电气系统的继电自动装置(十三)

电气系统的继电自动装置 在供电系统中为保证系统的可靠性,保证重要负荷的不间断供电,常采用自动重合闸装置和备用电源自动投入装置。 1 自动重合闸装置 供配电系统多年运行实践表明,架空线路发生的故障多属于暂时性故障,如雷击…...

JDK21深度解密 Day 9:响应式编程模型重构

【JDK21深度解密 Day 9】响应式编程模型重构 引言:从Reactor到虚拟线程的范式转变 在JDK21中,虚拟线程的引入彻底改变了传统的异步编程模型。作为"JDK21深度解密"系列的第91天,我们将聚焦于响应式编程模型重构这一关键主题。通过…...

在 Linux 服务器上无需 sudo 权限解压/打包 .7z 的方法(实用命令)

7z的压缩比很高,可以把100G的文件压到3-5G,在大文件传输上很有优势但是一般服务器上是只有tar解压,用户没法(没有权限)直接安装7z工具来解压因此使用conda安装p7zip库可以很好地解决这个问题~ 关于7z的相关背景知识&am…...

微信小程序(uniapp)实现腾讯云 IM 消息撤回

uniapp 实现腾讯云 IM 消息撤回功能实战指南 一、功能实现原理 腾讯云 IM 的消息撤回功能通过 消息修订(Message Revision) 机制实现,核心流程如下: 发送方调用撤回 API 删除指定消息云端生成撤回通知消息(类型为 T…...

设计学生管理系统的数据库

在设计学生管理系统的数据库时,需要考虑多个实体及其关系。以下是一个基本的学生管理系统表结构设计,涵盖了核心实体和关系: 1. 用户表 (user) 存储所有系统用户的基本信息,包括学生、教师和管理员。 sql CREATE TABLE user (u…...

ArcGIS Pro 3.4 二次开发 - 图形图层

环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 图形图层1.1 创建图形图层1.2 访问GraphicsLayer1.3 复制图形元素1.4 移除图形元素2 创建图形元素2.1 使用CIMGraphic创建点图形元素2.2 使用CIMGraphic创建线图元素2.3 使用 CIMGraphic 的多边形图形元素2.4 使用CIMGraphic创建多…...

Linux配置DockerHub镜像源配置

个人博客地址:Linux配置DockerHub镜像源配置 | 一张假钞的真实世界 因为某些原因,DockerHub官方镜像源已不可用,国内一些镜像源也已不可用,大家可以搜索可用的镜像源并修改配置。推荐一篇良心博文:https://zhuanlan.z…...

JDK21深度解密 Day 11:云原生环境中的JDK21应用

【JDK21深度解密 Day 111】云原生环境中的JDK21应用 本文是《JDK21深度解密:从新特性到生产实践的全栈指南》专栏的第11天内容,聚焦云原生环境中的JDK21应用。我们将深入探讨如何在容器化、微服务、Serverless等云原生架构中充分发挥JDK21的技术优势,提升Java应用的性能、稳…...

如何学习才能更好地理解人工智能工程技术专业和其他信息技术专业的关联性?

要深入理解人工智能工程技术专业与其他信息技术专业的关联性,需要跳出单一专业的学习框架,通过 “理论筑基 - 实践串联 - 跨学科整合” 的路径构建系统性认知。以下是分阶段、可落地的学习方法: 一、建立 “专业关联” 的理论认知框架 绘制知…...

Qt实现的水波进度条和温度进度条

一.效果 二.原理 1.水波 要模拟波浪,就要首先画出一条波浪线,正弦余弦曲线就很适合。 y=A*sin(ω*x+φ)+k y=A*cos(ω*x+φ)+k 这是正弦余弦曲线的公式,要想实现水波效果,那需要两条曲线,一条曲线的波峰对着另外一条曲线的波谷,要实现这样的曲线效果,只有让正弦曲线前移…...

3516cv610在sample_aiisp上多创一路编码流,方法

3516cv610在sample_aiisp上多创一路编码流,方法 首先确保 vpss grp0有视频流 最好保证 已经有一路视频流能推出来 多创一路编码流思路为 将 vpss grp0又绑定给 vpss_chn1 vpss_chn1有绑定给 venc_chn1 这样我们就多创了一路视频流。 这里思路完全正确 可以实现…...

WEBSTORM前端 —— 第3章:移动 Web —— 第4节:移动适配-VM

目录 一、适配方案 二、VM布局 ​编辑 三、vh布局 四、案例—酷我音乐 一、适配方案 二、VM布局 三、vh布局 四、案例—酷我音乐...

Android第十一次面试补充篇

Livedata内存泄漏解决​ 1. 未正确绑定 LifecycleOwner​ ​原因​: 使用 observe() 时未传入正确的 LifecycleOwner(如 Activity/Fragment),或误用 Application 等长生命周期对象,导致观察者无法自动解除绑定。 ​…...

【Zephyr 系列 3】多线程与调度机制:让你的 MCU 同时干多件事

好的,下面是Zephyr 系列第 3 篇:聚焦 多线程与调度机制的实践应用,继续面向你这样的 Ubuntu + 真板实战开发者,代码清晰、讲解通俗、结构规范,符合 CSDN 高质量博客标准。 🧠关键词:Zephyr、线程调度、k_thread、k_sleep、RTOS、BluePill 📌适合人群:想从裸机开发进…...

Kotlin-特殊类型

文章目录 数据类型枚举类型匿名类和伴生对象单例类伴生对象 数据类型 声明一个数据类非常简单: //在class前面添加data关键字表示为一个数据类 data class Student(var name: String, var age: Int)数据类声明后,编译器会根据主构造函数中声明的所有属性自动为其生成以下函数…...

nssctf第二题[SWPUCTF 2021 新生赛]简简单单的逻辑

这是题目&#xff0c;下载后得到一个python文件,打开 解读代码&#xff1a; for i in range(len(list)):key (list[i]>>4)((list[i] & 0xf)<<4)result str(hex(ord(flag[i])^key))[2:].zfill(2)list[i]>>4&#xff1a;从列表中取数字同时高4位向右位…...

《Discuz! X3.5开发从入门到生态共建》第3章 Discuz! X3.5 核心目录结构解析-优雅草卓伊凡

《Discuz! X3.5开发从入门到生态共建》第3章 Discuz! X3.5 核心目录结构解析-优雅草卓伊凡 3.1 系统核心目录结构 Discuz! X3.5采用模块化设计&#xff0c;主要目录结构如下&#xff1a; discuz_root/ ├─ api/ // API接口目录 ├─ config/ …...

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能 一、前言 图(1-1) HarmonyOS 系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。 其核心能力包括:扫描合同、票据、会议记录并保存为 PDF 分享。拍摄课堂 PPT、书籍章…...

Python_day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 关于 Dataset 从谷歌图片中抓取了 1000 多张猫和狗的图片。问题陈述是构建一个模型&#xff0c;该模型可以尽可能准确地在图像…...

STM32CubeDAC及DMA配置

STM32CubeDAC及DMA配置 一&#xff0c;问题1二&#xff0c;解决11&#xff0c;宏观思路CubeMX配置2&#xff0c;HAL_TIM_Base_Start(&htim6) 的作用1&#xff0c;作用1&#xff1a;使能TIM6的时钟并让它开始计数2&#xff0c;作用2&#xff1a;当 TIM6 溢出时&#xff0c;会…...

SQL快速入门【转自牛客网】

来源:牛客网 1、SQL 基础查询 在 SQL 中,SELECT 语句是最基本的查询语句,用于从数据库表中检索数据。通过 SELECT 语句,可以选择表中的所有列或特定列,并根据需要进行过滤和排序。 基本语法 SELECT 语句的基本语法如下: SELECT column1, column2, ... FROM table_na…...

行业案例 | OPPO借助Azure AI Speech国际服务实现音频文件智能转录

OPPO是全球领先的智能终端与移动互联网服务提供商&#xff0c;业务覆盖50余国&#xff0c;通过超40万销售网点和2500个服务中心与全球用户共享科技。作为软硬服一体化科技公司&#xff0c;OPPO以ColorOS为核心优化软件平台&#xff0c;为4.4亿月活用户打造智能操作系统&#xf…...

基于 OpenCV 和 DLib 实现面部特征调整(眼间距、鼻子、嘴巴)

摘 要 本文介绍如何利用Dlib面部特征点检测和OpenCV图像处理技术&#xff0c;通过Python实现面部特征的精准调整。我们将以改变眼间距为例&#xff0c;演示包括地标检测、三角剖分变形等关键技术&#xff0c;该方法可扩展至嘴唇、眉毛等面部特征的调整。 技术栈 Python 3.8 …...

spring-boot接入websocket教程以及常见问题解决

我们使用spring-boot接入websocket有三种方式&#xff1a;使用EnableWebSocket、EnableWebSocketMessageBroker以及ServerEndpoint&#xff0c;本文主要介绍使用ServerEndpoint方式的流程以及碰到的问题解决 接入方式 添加依赖 确保spring-boot-starter-websocket依赖 <d…...