鸿蒙UI开发快速入门 —— part01: 装饰器&UI描述
1. 背景
在鸿蒙开发中,ArkTS是优选的主力应用开发语言。
ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。
因此,在学习ArkTS语言之前,建议开发者具备TS语言开发能力,本文的假设前提为,读者拥有TS编程经验。
2. 综述
学习UI开发,一般关注以下三个问题:
1)界面和控件如何编写;
2)状态管理和组件间的数据传递如何实现;
3)用户交互时,如何做到界面渲染控制。
在展开讲界面和控件编写前,本文先介绍两个UI相关的核心概念:装饰器、UI描述。
3. 装饰器
在鸿蒙开发中,关键的UI相关的定义(界面入口、自定义组件、状态变量、样式定义等)都是通过装饰器来标注。
常用的装饰器例如:@Entry、@Component、@State、@Builder、@Extend、@Styles等。
- @Component表示自定义组件;
- @Entry表示该自定义组件为入口组件;
- @State表示组件中的状态变量,状态变量变化会触发UI刷新;
- @Builder/@BuilderParam:特殊的封装UI描述的方法,细粒度的封装和复用UI描述;
- @Extend/@Styles:扩展内置组件和封装属性样式,更灵活地组合内置组件;
下面是一个Hello World程序中的拆解示意图:
其中:@Component表示Hello是一个自定义组件;@Entry表示当前自定义组件为UI页面的入口(单个UI页面中,最多可以使用@Entry装饰一个自定义组件);@State表示myText是一个内部状态变量(任何对myText的修改,都将触发UI的刷新);
4. UI描述
鸿蒙UI的开发在build()函数中完成,整个build()函数的开发类似于编写描述文件,我们也将buid()开发过程称为UI描述。
分析下图中的Hello World程序,它做了以下几件UI描述的事儿:
- 创建了一个Column()垂直布局组件,组件内部配置了三个子组件;
- 在垂直布局控件中,创建了一个Text()文本组件;
- 紧接着接了一个Diveder()水平分割线组件;
- 紧接着创建了一个Button按钮,并且配置属性:高度为50,宽度为100,顶部间距为20;
- Button配置了事件监听器,将myText的值从“Hello World”改为了 “ArkUI”。
交互示意图如下:
从示意图中,我们可以总结出UI 描述的几个关键点:a)创建组件;b)给组件配置属性;c)给组件配置事件监听;d)给组件添加子组件。
我们分别来了解下:
4.1 创建组件
根据组件构造方法的不同,创建组件包含有参数和无参数两种方式。
- 有参数
如果组件的接口定义包含构造参数,则在组件后面的“()”配置相应参数,例如如下代码:
Image('https://xyz/test.jpg')
变量或表达式也可以用于参数赋值,其中表达式返回的结果类型必须满足参数类型要求。例如,设置变量或表达式来构造Image和Text组件的参数,例如如下代码:
Image(this.imagePath)Image('https://' + this.imageUrl)Text(`count: ${this.count}`)
- 无参数
如果组件的接口定义没有包含必选构造参数,则组件后面的“()”不需要配置任何内容。例如,Divider组件不包含构造参数。
Column() { Text('item 1') Divider() // 无参数示例 Text('item 2')}
4.2 配置属性
属性方法以“.”链式调用的方式配置系统组件的样式和其他属性,建议每个属性方法单独写一行,示例代码如下:
// 配置Button属性Button() .height(50) .width(100) .margin({top: 20})
// 配置Text属性Text('Hello World') .fontSize(50)
4.3 配置事件
配置事件与配置属性类似
事件方法以“.”链式调用的方式配置系统组件支持的事件,建议每个事件方法单独写一行。
Button('Click me') .onClick(() => { this.myText = 'ArkUI'; })
| tips:这里推荐使用箭头函数来作为事件的执行回调函数。如果使用 function 匿名函数,或者使用组件成员变量,需要bind(this)保证传入的回调函数与当前组件一致 |
|---|
// case1: 匿名function,需要bind(this)
Button('add counter')
.onClick(function(){
this.counter += 2;
}.bind(this))
// case2: 成员函数,需要.bind(this)
myClickHandler(): void {
this.counter += 2;
}
...
Button('add counter')
.onClick(this.myClickHandler.bind(this))
4.4 配置子组件
如果组件支持子组件配置,则需在尾随闭包"{...}"中为组件添加子组件的UI描述。Column、Row、Stack、Grid、List等组件都是容器组件。
Column() {
// 下面的代码是Column组件d的子组件
Text('Hello')
.fontSize(100)
Divider()
Text(this.myText)
.fontSize(100)
.fontColor(Color.Red)
}
容器组件均支持子组件配置,可以实现相对复杂的多级嵌套。
Column() {
// 下面的代码是Column组件d的子组件
Row() {
// 下面的代码是Row组件d的子组件(Row嵌套在了Column中)
Image('test1.jpg')
.width(100)
.height(100)
Button('click +1')
.onClick(() => {
console.info('+1 clicked!');
})
}
}
鸿蒙UI开发快速入门 —— part01: 装饰器&UI描述的更多相关文章
- WPF开发快速入门【7】WPF的拖放功能(Drag and Drop)
概述 本文描述WPF的拖放功能(Drag and Drop). 拖放功能涉及到两个功能,一个就是拖,一个是放.拖放可以发生在两个控件之间,也可以在一个控件自己内部拖放.假设界面上有两个控件,一个Tre ...
- Apple Watch开发快速入门教程
Apple Watch开发快速入门教程 试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...
- Python入门篇-装饰器
Python入门篇-装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.装饰器概述 装饰器(无参) 它是一个函数 函数作为它的形参 返回值也是一个函数 可以使用@functi ...
- Transform组件C#游戏开发快速入门
Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸 ...
- HealthKit开发快速入门教程之HealthKit数据的操作
HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...
- HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...
- HealthKit开发快速入门教程之HealthKit开发概述简介
HealthKit开发快速入门教程之HealthKit开发概述简介 2014年6月2日召开的年度开发者大会上,苹果发布了一款新的移动应用平台,可以收集和分析用户的健康数据.该移动应用平台被命名为“He ...
- 游戏控制杆OUYA游戏开发快速入门教程
游戏控制杆OUYA游戏开发快速入门教程 1.2.2 游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4 游戏控制杆各个角度的 ...
- SpringBoot开发快速入门
SpringBoot开发快速入门 目录 一.Spring Boot 入门 1.Spring Boot 简介 2.微服务 3.环境准备 1.maven设置: 2.IDEA设置 4.Spring Boot ...
- python进阶04 装饰器、描述器、常用内置装饰器
python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...
随机推荐
- Android MTP流程
概要 本文的目的是介绍Android系统中MTP的一些相关知识.主要的内容包括:第1部分 MTP简介 对Mtp协议进行简单的介绍.第2部分 MTP框架 介绍Android系统下MTP的框架.第3部分 ...
- html5新标签 画布 canvas 替代了 flash
绘制矩形边框,和填充不同的是绘制使用的是strokeRect, 和strokeStyle实现的 绘制路径 绘制路径的作用是为了设置一个不规则的多边形状态 路径都是闭合的,使用路径进行绘制的时候需要既定 ...
- javaScript遍历对象总结
定义对象: const obj = { name: 'zlx', id: 245, age: 25, gender: '男', } 1. 使用 for... in..循环遍历 对象的属性有2种方式可以 ...
- element+vue2下的input的样式修改
/* 禁用下的input的字体颜色 */ /* .el-input.is-disabled /deep/ .el-input__inner { color: red; } */ /* 禁用下的inpu ...
- PCI-5565反射内存卡
PCI-5565反射内存卡是一种用于实时网络的硬件设备.它基于反射内存网的原理,通过光纤连接多台计算机,形成网络节点,并且每个节点上的网络内存卡存储着其他节点的共享数据拷贝.该反射内存卡可以插在多种总 ...
- ROS入门21讲(4)
八.客户端Client的编程实现 1.话题模型 服务模型(客户端/服务器) 2.创建功能包 命令: $ cd ~/catkin_ws/src $ catkin_create_pkg learning_ ...
- openresty操作mongodb
最近项目中使用openresty,需要通过openresty连接mongo,经过几番折腾终于有了一个结果,现将其记录下来,也感谢模块提供者 使用openresty操作mongo 1.引入第三方的模块 ...
- 【转载】《扩散模型是实时游戏引擎(Diffusion Models Are Real-Time Game Engines)》的论文,向我们展示了世界上第一个完全由神经模型驱动的游戏引擎,GameNGen。这也是历史上首次,AI能在不借助其他游戏引擎的情况下,为玩家生成实时游戏了,并且在单个TPU上速度可以达到每秒20帧
地址: https://www.youtube.com/watch?v=VniPJII6ak0 8月29号,谷歌DeepMind发布了一篇名为<扩散模型是实时游戏引擎(Diffusion Mod ...
- 4-1 C++运算符基本概念
目录 4.1.1 基本概念 函数观点 左值和右值 运算符重载 4.1.2 优先级.结合律与求值顺序 优先级和结合律 求值顺序 书中表述 实践表明(猜想) 实践验证 可能的解释:编译器的优化行为 一些运 ...
- 实战:Mailivery 模拟登录
问题情景 混淆群内的小伙伴遇到这么个问题,Mailivery 这个网站登录后,明明提交的表单(邮箱和密码也正确).请求头等等都没问题,为啥一直重定向到登录页面呢?唉,该出手时就出手啊,我也看看咋回事吧 ...