
鸿蒙5 ArkUI开发入门:ArkCompiler与声明式UI初体验
鸿蒙操作系统5.0带来了更强大的ArkCompiler和声明式UI开发框架ArkUI,为开发者提供了全新的开发体验。本文将带你快速入门ArkUI的声明式编程,通过实际代码示例展示如何构建鸿蒙应用界面。
ArkCompiler简介
ArkCompiler是鸿蒙系统的高性能运行时和编译器工具链,它支持多种编程语言,能够将代码编译成高效的机器码。在鸿蒙5中,ArkCompiler进一步优化,提升了应用启动速度和运行性能。
ArkUI声明式编程基础
ArkUI采用声明式UI编程范式,与传统的命令式UI开发相比,具有以下优势:
更直观的UI描述
更高的开发效率
更好的可维护性
自动化的状态管理
开发环境准备
确保你已经安装了最新版的DevEco Studio和鸿蒙5 SDK。创建一个新的"Empty Ability"项目,选择eTS作为开发语言。
第一个ArkUI组件
让我们从一个简单的文本组件开始:
// EntryAbility.ets
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import window from ‘@ohos.window’;
export default class EntryAbility extends UIAbility {
onCreate(want, launchParam) {
console.log(‘[Demo] EntryAbility onCreate’);
}
onWindowStageCreate(windowStage: window.WindowStage) {
console.log(‘[Demo] EntryAbility onWindowStageCreate’);
windowStage.loadContent('pages/IndexPage', (err) => {
if (err.code) {
console.error('[Demo] Failed to load the content. Cause:' + JSON.stringify(err));
return;
}
console.log('[Demo] Succeeded in loading the content.');
});
}
}
// pages/IndexPage.ets
@Entry
@Component
struct IndexPage {
build() {
Column() {
Text(‘Hello ArkUI!’)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.fontColor(‘#007DFF’)
}
.width(‘100%’)
.height(‘100%’)
.justifyContent(FlexAlign.Center)
}
}
这个简单的例子展示了ArkUI的基本结构:
使用@Entry装饰器标记入口组件
使用@Component装饰器定义可复用的UI组件
在build()方法中声明UI布局
使用链式调用设置组件样式
状态管理与数据绑定
ArkUI的核心特性之一是响应式状态管理。让我们看一个计数器例子:
// pages/CounterPage.ets
@Entry
@Component
struct CounterPage {
@State count: number = 0
build() {
Column({ space: 20 }) {
Text(当前计数: ${this.count}
)
.fontSize(30)
Button('增加')
.width(150)
.height(60)
.onClick(() => {
this.count++
})
Button('减少')
.width(150)
.height(60)
.onClick(() => {
this.count--
})
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
}
关键点:
@State装饰器标记可变状态,当状态变化时自动触发UI更新
数据通过${}语法绑定到UI
事件处理使用简洁的箭头函数
布局与样式
ArkUI提供了丰富的布局容器和样式选项:
// pages/LayoutPage.ets
@Entry
@Component
struct LayoutPage {
build() {
Column({ space: 10 }) {
// 顶部导航栏
Row() {
Image($r(‘app.media.back’))
.width(30)
.height(30)
.margin({ left: 15 })
Text('商品详情')
.fontSize(20)
.fontWeight(FontWeight.Bold)
.margin({ left: 20 })
Blank()
Image($r('app.media.more'))
.width(30)
.height(30)
.margin({ right: 15 })
}
.width('100%')
.height(60)
.backgroundColor('#F5F5F5')
// 内容区域
Scroll() {
Column() {
Image($r('app.media.product'))
.width('100%')
.aspectRatio(1)
.objectFit(ImageFit.Cover)
Text('华为Mate 60 Pro')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 20, left: 15 })
Text('麒麟9000S芯片 | 超可靠玄武架构 | 卫星通信')
.fontSize(16)
.fontColor('#666666')
.margin({ top: 10, left: 15 })
// 价格区域
Row() {
Text('¥6999')
.fontSize(28)
.fontColor('#FF0000')
.fontWeight(FontWeight.Bold)
Text('起')
.fontSize(16)
.fontColor('#999999')
.margin({ left: 5, top: 10 })
}
.margin({ top: 20, left: 15 })
// 购买按钮
Button('立即购买', { type: ButtonType.Capsule })
.width('90%')
.height(50)
.margin({ top: 30 })
.backgroundColor('#007DFF')
}
}
.flexGrow(1)
// 底部标签栏
Row({ space: 20 }) {
Column() {
Image($r('app.media.home'))
.width(30)
.height(30)
Text('首页')
.fontSize(12)
}
Column() {
Image($r('app.media.cart'))
.width(30)
.height(30)
Text('购物车')
.fontSize(12)
}
Column() {
Image($r('app.media.user'))
.width(30)
.height(30)
Text('我的')
.fontSize(12)
}
}
.width('100%')
.height(70)
.justifyContent(FlexAlign.SpaceAround)
.backgroundColor('#FFFFFF')
.border({ width: { top: 1 }, color: '#EEEEEE' })
}
.width('100%')
.height('100%')
.backgroundColor('#FFFFFF')
}
}
这个例子展示了:
复杂的页面布局结构
多种布局容器(Column, Row, Scroll)的组合使用
图片资源的引用方式
灵活的边距和间距设置
边框和背景样式的应用
自定义组件
ArkUI鼓励将UI拆分为可复用的自定义组件:
// components/ProductCard.ets
@Component
export struct ProductCard {
@Prop name: string
@Prop price: number
@Prop image: Resource
build() {
Column() {
Image(this.image)
.width(‘100%’)
.aspectRatio(1)
.borderRadius(10)
.objectFit(ImageFit.Cover)
Text(this.name)
.fontSize(16)
.margin({ top: 8 })
.maxLines(1)
.textOverflow({ overflow: TextOverflow.Ellipsis })
Text(`¥${this.price}`)
.fontSize(18)
.fontColor('#FF0000')
.fontWeight(FontWeight.Bold)
.margin({ top: 5 })
}
.width('48%')
.padding(10)
.backgroundColor('#FFFFFF')
.borderRadius(12)
.shadow({ radius: 8, color: '#1A000000', offsetX: 2, offsetY: 2 })
}
}
// pages/ProductListPage.ets
@Entry
@Component
struct ProductListPage {
private products = [
{ id: 1, name: ‘华为Mate 60 Pro’, price: 6999, image: $r(‘app.media.mate60’) },
{ id: 2, name: ‘华为P60 Art’, price: 8988, image: $r(‘app.media.p60’) },
{ id: 3, name: ‘华为Mate X3’, price: 12999, image: $r(‘app.media.x3’) },
{ id: 4, name: ‘华为Watch 4 Pro’, price: 2699, image: $r(‘app.media.watch’) }
]
build() {
Column({ space: 15 }) {
Text(‘热门商品’)
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ top: 15, left: 15 })
.alignSelf(HorizontalAlign.Start)
Grid() {
ForEach(this.products, (item) => {
GridItem() {
ProductCard({
name: item.name,
price: item.price,
image: item.image
})
}
})
}
.columnsTemplate('1fr 1fr')
.rowsTemplate('1fr 1fr')
.columnsGap(10)
.rowsGap(10)
.height('80%')
.margin(10)
}
.width('100%')
.height('100%')
.backgroundColor('#F5F5F5')
}
}
这个例子展示了:
自定义组件的创建和使用
@Prop装饰器用于父组件向子组件传递数据
ForEach循环渲染列表数据
Grid网格布局的使用
阴影效果的应用
总结
鸿蒙5的ArkUI框架通过声明式编程范式大大简化了UI开发流程。本文介绍了:
ArkUI的基本结构和语法
状态管理和数据绑定
常用布局和样式设置
自定义组件的创建和使用
ArkCompiler的优化使得这些声明式UI能够高效运行,开发者可以专注于业务逻辑而无需过多考虑性能问题。
随着鸿蒙生态的不断发展,ArkUI和ArkCompiler将继续演进,为开发者提供更强大、更高效的开发工具链。建议开发者多实践这些基础概念,逐步探索ArkUI更高级的特性,如动画、手势处理和跨设备UI适配等。
