鸿蒙App基础

打印 上一主题 下一主题

主题 548|帖子 548|积分 1644

基础说明

.1、应用模型

.1.1、构成要素


  • 应用组件
    应用组件是应用的基本组成单位,是应用的运行入口。用户启动、使用和退出应用过程中,应用组件会在不同的状态间切换,这些状态称为应用组件的生命周期。应用组件提供生命周期的回调函数,开辟者通过应用组件的生命周期回调感知应用的状态变化。应用开辟者在编写应用时,起首需要编写的就是应用组件,同时还需编写应用组件的生命周期回调函数,并在应用设置文件中设置相关信息。如许,使用体系在运行期间通过设置文件创建应用组件的实例,并调度它的生命周期回调函数,从而执行开辟者的代码。
  • 应用进程模型
    应用进程模型界说应用进程的创建和销毁方式,以及进程间的通信方式。
  • 应用线程模型
    应用线程模型界说应用进程内线程的创建和销毁方式、主线程和UI线程的创建方式、线程间的通信方式。
  • 应用使命管理模型
    应用使命管理模型界说使命(Mission)的创建和销毁方式,以及使命与组件间的关系。HarmonyOS应用使命管来由体系应用负责,三方应用无需关注,下文不做详细先容。
  • 应用设置文件
    应用设置文件中包含应用设置信息、应用组件信息、权限信息、开辟者自界说信息等,这些信息在编译构建、分发和运行阶段分别提供给编译工具、应用市场和使用体系使用。
.1.2、应用模型分类

https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/stage-model-development-overview-0000001427744552-V3


  • FA(Feature Ability)模型:HarmonyOS早期版本开始支持的模型,已经不再主推。
  • Stage模型:HarmonyOS 3.1 Developer Preview版本开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了AbilityStage、WindowStage等类作为应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。
Stage模型与FA模型最大的区别在于: Stage模型中,多个应用组件共享同一个ArkTS引擎实例;而FA模型中,每个应用组件独享一个ArkTS引擎实例。因此在Stage模型中,应用组件之间可以方便的共享对象和状态,同时淘汰复杂应用运行对内存的占用。Stage模型作为主推的应用模型,开辟者通过它能够更加便利地开辟出分布式场景下的复杂应用。
.1.3、Module、HAP、HAR、HSP等应用程序包的基础概念

一个应用包含一个或者多个Module,可以在DevEco Studio工程中创建一个或者多个Module
.1.3.1、Module

Module是HarmonyOS应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务设置文件,每一个Module都可以独立进行编译和运行。Module分为“Ability”和“Library”两种类型
.1.3.2、HAP(Harmony Ability Package)

“Ability”类型的Module对应于编译后的HAP。
1、开辟者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件,即HAP。HAP是HarmonyOS应用安装的基本单位,包含了编译后的代码、资源、三方库及设置文件。HAP可分为Entry和Feature两种类型。


  • Entry类型的HAP:是应用的主模块,在module.json5设置文件中的type标签设置为“entry”类型。在同一个应用中,同一设备类型只支持一个Entry类型的HAP,通常用于实现应用的入口界面、入口图标、主特性功能等。
  • Feature类型的HAP:是应用的动态特性模块,在module.json5设置文件中的type标签设置为“feature”类型。一个应用程序包可以包含一个或多个Feature类型的HAP,也可以不包含;Feature类型的HAP通常用于实现应用的特性功能,可以设置成按需下载安装,也可以设置成随Entry类型的HAP一起下载安装(请参见module对象内部结构中的“deliveryWithInstall”)。
2、每个HarmonyOS应用可以包含多个.hap文件,一个应用中的.hap文件合在一起称为一个Bundle,而bundleName就是应用的唯一标识(请参见app.json5设置文件中的bundleName标签)。需要特别说明的是:在应用上架到应用市场时,需要把应用包含的所有.hap文件(即Bundle)打包为一个.app后缀的文件用于上架,这个.app文件称为App Pack(Application Package),其中同时包含了形貌App Pack属性的pack.info文件;在云端(服务器)分发和终端设备安装时,都是以HAP为单位进行分发和安装的。
3、打包后的HAP包结构包罗ets、libs、resources等文件夹和resources.index、module.json、pack.info等文件。


  • ets目任命于存放应用代码编译后的字节码文件。
  • libs目任命于存放库文件。库文件是HarmonyOS应用依赖的第三方代码(.so二进制文件)。
  • resources目任命于存放应用的资源文件(字符串、图片等),便于开辟者使用和维护,详见资源分类与访问。
  • resources.index是资源索引表,由IDE编译工程时天生。
  • module.json是HAP的设置文件,内容由工程设置中的module.json5和app.json5组成,该文件是HAP中必不可少的文件。IDE会自动天生一部分默认设置,开辟者按需修改其中的设置。详细字段请参见应用设置文件。
  • pack.info是Bundle中用于形貌每个HAP属性的文件,例如app中的bundleName和versionCode信息、module中的name、type和abilities等信息,由IDE工具天生Bundle包时自动天生。

.1.3.3、HAR(Harmony Archive)

“Library”类型的Module对应于HAR
.1.3.4、HSP(Harmony Shared Package)

“Library”类型的Module对应于HAR(Harmony Archive),或者HSP(Harmony Shared Package)。

像素单位

.1、基础单位

为开辟者提供4种像素单位,框架采用vp为基准数据单位。
PS:个人发起使用lpx,设置好设置文件,这里就可以按照UI设计稿现实的来,可以更好的实现设计效果
名称形貌px屏幕物理像素单位vp屏幕密度相关像素,根据屏幕像素密度转换为屏幕物理像素,当数值不带单位时,默认单位vp。在现实宽度为1440物理像素的屏幕上,1vp约即是3px。fp字体像素,与vp类似适用屏幕密度变化,随体系字体大小设置变化。lpx视窗逻辑像素单位,lpx单位为现实屏幕宽度与逻辑宽度(通过designWidth设置)的比值,designWidth默认值为720。当designWidth为720时,在现实宽度为1440物理像素的屏幕上,1lpx为2px大小。 .2、像素单位转换

提供其他单位与px单位相互转换的方法
接口形貌vp2px(value : number) : number将vp单位的数值转换为以px为单位的数值px2vp(value : number) : number将px单位的数值转换为以vp为单位的数值fp2px(value : number) : number将fp单位的数值转换为以px为单位的数值px2fp(value : number) : number将px单位的数值转换为以fp为单位的数值lpx2px(value : number) : number将lpx单位的数值转换为以px为单位的数值px2lpx(value : number) : number将px单位的数值转换为以lpx为单位的数值 例如:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct Example {
  5.   build() {
  6.     Column() {
  7.       Flex({ wrap: FlexWrap.Wrap }) {
  8.         Column() {
  9.           Text("width(220)")
  10.             .width(220)
  11.             .height(40)
  12.             .backgroundColor(0xF9CF93)
  13.             .textAlign(TextAlign.Center)
  14.             .fontColor(Color.White)
  15.             .fontSize('12vp')
  16.         }.margin(5)
  17.         Column() {
  18.           Text("width('220px')")
  19.             .width('220px')
  20.             .height(40)
  21.             .backgroundColor(0xF9CF93)
  22.             .textAlign(TextAlign.Center)
  23.             .fontColor(Color.White)
  24.         }.margin(5)
  25.         Column() {
  26.           Text("width('220vp')")
  27.             .width('220vp')
  28.             .height(40)
  29.             .backgroundColor(0xF9CF93)
  30.             .textAlign(TextAlign.Center)
  31.             .fontColor(Color.White)
  32.             .fontSize('12vp')
  33.         }.margin(5)
  34.         Column() {
  35.           Text("width('220lpx') designWidth:720")
  36.             .width('220lpx')
  37.             .height(40)
  38.             .backgroundColor(0xF9CF93)
  39.             .textAlign(TextAlign.Center)
  40.             .fontColor(Color.White)
  41.             .fontSize('12vp')
  42.         }.margin(5)
  43.         Column() {
  44.           Text("width(vp2px(220) + 'px')")
  45.             .width(vp2px(220) + 'px')
  46.             .height(40)
  47.             .backgroundColor(0xF9CF93)
  48.             .textAlign(TextAlign.Center)
  49.             .fontColor(Color.White)
  50.             .fontSize('12vp')
  51.         }.margin(5)
  52.         Column() {
  53.           Text("fontSize('12fp')")
  54.             .width(220)
  55.             .height(40)
  56.             .backgroundColor(0xF9CF93)
  57.             .textAlign(TextAlign.Center)
  58.             .fontColor(Color.White)
  59.             .fontSize('12fp')
  60.         }.margin(5)
  61.         Column() {
  62.           Text("width(px2vp(220))")
  63.             .width(px2vp(220))
  64.             .height(40)
  65.             .backgroundColor(0xF9CF93)
  66.             .textAlign(TextAlign.Center)
  67.             .fontColor(Color.White)
  68.             .fontSize('12fp')
  69.         }.margin(5)
  70.       }.width('100%')
  71.     }
  72.   }
  73. }
复制代码

体系枚举说明

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-appendix-enums-0000001478061741-V3
太多了,不一一列举了,先欣赏一遍,用的时间在查吧。
页面相关

Ability



  • Ability是应用所具备本领的抽象,也是应用程序的重要组成部分。一个应用可以具备多种本领(即可以包含多个Ability)
  • Ability可以分为FA(Feature Ability)和PA(Particle Ability)两种类型;
  • 在设置文件(config.json)中注册Ability时,可以通过设置Ability元素中的“type”属性来指定Ability模板类型,“type”的取值可以为“page”、“service”或“data”,分别代表Page模板、Service模板、Data模板。
Page Ability

  1. 其实这个东西和安卓的Activity意义差不多,就是提供一个和用户交互的窗口,而**AbilitySlice**其实就是相当于fragment,一个Page里面可以有多个AbilitySlice就是相当于一个Activity中有多个fragment,都是有独立的生命周期。
复制代码


  • setMainRoute:设置默认展示AbilitySlice
  • addActionRoute:添加其他的要展示的AbilitySlice,其中router要在abilities-skills-actions下界说
生命周期



  • onStart() 相当于安卓的onCreate(),仅执行一次,且是结构的初始化使用,调用后进入INACTIVE状态;
  • onActive()相当于安卓的onResume(),用户重新回到该page时回调;
  • onInactive()相当于安卓的onPause(),用户离开该page时调用;
  • onBackground()相当于安卓的onSaveInstanceState(),页面进入不可见状态,开释部分无用资源;
  • onForeground()相当于安卓的onRestoreInstanceState(),页面准备进入可见状态,部分资源需要重新获取或者初始化;
  • onStop()和安卓的名没咋变,功能也一样,页面销毁时调用
    原因如下:
    1、用户通过体系管理本领关闭指定Page,例如使用使命管理器关闭Page。
    2、用户行为触发Page的terminateAbility()方法调用,例如使用应用的退出功能。
    3、设置变动导致体系暂时销毁Page并重建。
    4、体系出于资源管理目的,自动触发对处于BACKGROUND状态Page的销毁。
页面切换

对应两个slice的生命周期方法回调顺序为:
FooAbilitySlice.onInactive() --> BarAbilitySlice.onStart() --> BarAbilitySlice.onActive() --> FooAbilitySlice.onBackground()


  • AbilitySlice同一page内切换使用present(new TargetSlice(), new Intent()),带返回的页面切换presentForResult(new TargetSlice(), new Intent(), 0),返回结果由导航目标AbilitySlice在其生命周期内通过setResult()进行设置,接收方通过onResult()接收。(PS:体系为每个Page维护了一个AbilitySlice实例的栈,当开辟者在调用present()或presentForResult()时指定的AbilitySlice实例已经在栈中存在时,则栈中位于此实例之上的AbilitySlice均会出栈并终止其生命周期)
  • 不同Page间导航,可以使用startAbility()或startAbilityForResult()方法,获得返回结果的回调为onAbilityResult()。在Ability中调用setResult()可以设置返回结
  • 跨设备迁徙,需要在需要迁徙的page中实现IAbilityContinuation接口
    1. 1、*onStartContinuation()*:Page请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移。
    2. 2、*onSaveData()*:如果onStartContinuation()返回true,则系统回调此方法,开发者在此回调中保存必须传递到另外设备上以便恢复Page状态的数据。
    3. 3、*onRestoreData()*:源侧设备上Page完成保存数据后,系统在目标侧设备上回调此方法,开发者在此回调中接受用于恢复Page状态的数据。注意,在目标侧设备上的Page会重新启动其生命周期,无论其启动模式如何配置。且系统回调此方法的时机在onStart()之前。
    4. 4、onCompleteContinuation()*:目标侧设备上恢复数据一旦完成,系统就会在源侧设备上回调Page的此方法,以便通知应用迁移流程已结束。开发者可以在此检查迁移结果是否成功,并在此处理迁移结束的动作,例如,应用可以在迁移完成后终止自身生命周期。
    5. 5、*onRemoteTerminated()*:如果开发者使用continueAbilityReversibly()而不是continueAbility(),则此后可以在源侧设备上使用reverseContinueAbility()进行回迁。这种场景下,相当于同一个Page(的两个实例)同时在两个设备上运行,迁移完成后,如果目标侧设备上Page因任何原因终止,则源侧Page通过此回调接收终止通知。
    6. 请求迁移:实现IAbilityContinuation的Page可以在其生命周期内,调用continueAbility()或continueAbilityReversibly()请求迁移。两者的区别是,通过后者发起的迁移此后可以进行回迁。
    7. 请求回迁:使用continueAbilityReversibly()请求迁移并完成后,源侧设备上已迁移的Page可以发起回迁,以便使用户活动重新回到此设备。(reverseContinueAbility())
    复制代码
Service Ability

基于Service模板的Ability(以下简称“Service”)主要用于背景运使用命(如执行音乐播放、文件下载等),但不提供用户交互界面。Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在背景继承运行。


  • Service是单实例的。在一个设备上,相同的Service只会存在一个实例
  • 如果多个Ability共用这个实例,只有当与Service绑定的所有Ability都退出后,Service才能够退出
  • 由于Service是在主线程里执行的,因此,如果在Service里面的使用时间过长,开辟者必须在Service里创建新的线程来处理(详见线程间通信),防止造成主线程阻塞,应用程序无响应
生命周期

  1. onStart()  
  2.    该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Intent应为空。
  3.    
  4. onCommand()
  5.    在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,用户可以在该方法中做一些调用统计、初始化类的操作。
  6.    
  7. onConnect()
  8.     在Ability和Service连接时调用,该方法返回IRemoteObject对象,用户可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。
  9.        
  10. onDisconnect()
  11.    在Ability与绑定的Service断开连接时调用。
  12.    
  13. onStop()
  14.    在Service销毁时调用。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。
复制代码
启动

和普通的页面跳转逻辑一致;如果Service尚未运行,则体系会先调用onStart()来初始化Service,再回调Service的onCommand()方法来启动Service。如果Service正在运行,则体系会直接回调Service的onCommand()方法来启动Service。
制止

Service一旦创建就会一直保持在背景运行,除非必须接纳内存资源,否则体系不会制止或销毁Service。开辟者可以在Service中通过terminateAbility()制止本Service或在其他Ability调用stopAbility()来制止Service。
连接

通过connectAbility() 连接回调,需要传入目标Service的Intent与IAbilityConnection的实例,其中intent的实现和页面跳转的intent设置基本一致。
service中的onConnect()需要返回一个IRemoteObject对象,HarmonyOS提供了IRemoteObject的默认实现,用户可以通过继承LocalRemoteObject来创建自界说的实现类
通用信息

.1、变乱

.1.1、点击变乱—onClick(event: (event?: ClickEvent) => void)

组件被点击时触发的变乱。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-click-0000001477981153-V3
例如:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct ClickExample {
  5.   @State text: string = ''
  6.   build() {
  7.     Column() {
  8.       Row({ space: 20 }) {
  9.         Button('Click').width(100).height(40)
  10.           .onClick((event: ClickEvent) => {
  11.             this.text = 'Click Point:' + '\n  screenX:' + event.screenX + '\n  screenY:' + event.screenY
  12.             + '\n  x:' + event.x + '\n  y:' + event.y + '\ntarget:' + '\n  component globalPos:('
  13.             + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\n  width:'
  14.             + event.target.area.width + '\n  height:' + event.target.area.height + '\ntimestamp' + event.timestamp;
  15.           })
  16.         Button('Click').width(200).height(50)
  17.           .onClick((event: ClickEvent) => {
  18.             this.text = 'Click Point:' + '\n  screenX:' + event.screenX + '\n  screenY:' + event.screenY
  19.             + '\n  x:' + event.x + '\n  y:' + event.y + '\ntarget:' + '\n  component globalPos:('
  20.             + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\n  width:'
  21.             + event.target.area.width + '\n  height:' + event.target.area.height + '\ntimestamp' + event.timestamp;
  22.           })
  23.       }.margin(20)
  24.       Text(this.text).margin(15)
  25.     }.width('100%')
  26.   }
  27. }
复制代码

.1.2、触摸变乱—onTouch(event: (event?: TouchEvent) => void)

当手指在组件上按下、滑动、抬起时触发。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-touch-0000001427902424-V3
例如:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct TouchExample {
  5.   @State text: string = ''
  6.   @State eventType: string = ''
  7.   build() {
  8.     Column() {
  9.       Button('Touch').height(40).width(100)
  10.         .onTouch((event: TouchEvent) => {
  11.           if (event.type === TouchType.Down) {
  12.             this.eventType = 'Down'
  13.           }
  14.           if (event.type === TouchType.Up) {
  15.             this.eventType = 'Up'
  16.           }
  17.           if (event.type === TouchType.Move) {
  18.             this.eventType = 'Move'
  19.           }
  20.           this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
  21.           + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
  22.           + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
  23.           + event.target.area.width + '\nheight:' + event.target.area.height
  24.         })
  25.       Button('Touch').height(50).width(200).margin(20)
  26.         .onTouch((event: TouchEvent) => {
  27.           if (event.type === TouchType.Down) {
  28.             this.eventType = 'Down'
  29.           }
  30.           if (event.type === TouchType.Up) {
  31.             this.eventType = 'Up'
  32.           }
  33.           if (event.type === TouchType.Move) {
  34.             this.eventType = 'Move'
  35.           }
  36.           this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: '
  37.           + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
  38.           + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
  39.           + event.target.area.width + '\nheight:' + event.target.area.height
  40.         })
  41.       Text(this.text)
  42.     }.width('100%').padding(30)
  43.   }
  44. }
复制代码

.1.3、挂载卸载变乱—onAppear(event: () => void)onDisAppear(event: () => void)

挂载卸载变乱指组件从组件树上挂载、卸载时触发的变乱。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-show-hide-0000001428061696-V3
例如:
  1. // xxx.ets
  2. import promptAction from '@ohos.promptAction'
  3. @Entry
  4. @Component
  5. struct AppearExample {
  6.   @State isShow: boolean = true
  7.   @State changeAppear: string = '点我卸载挂载组件'
  8.   private myText: string = 'Text for onAppear'
  9.   build() {
  10.     Column() {
  11.       Button(this.changeAppear)
  12.         .onClick(() => {
  13.           this.isShow = !this.isShow
  14.         }).margin(15)
  15.       if (this.isShow) {
  16.         Text(this.myText).fontSize(26).fontWeight(FontWeight.Bold)
  17.           .onAppear(() => {
  18.             promptAction.showToast({
  19.               message: 'The text is shown',
  20.               duration: 2000
  21.             })
  22.           })
  23.           .onDisAppear(() => {
  24.             promptAction.showToast({
  25.               message: 'The text is hidden',
  26.               duration: 2000
  27.             })
  28.           })
  29.       }
  30.     }.padding(30).width('100%')
  31.   }
  32. }
复制代码

.1.4、拖拽变乱

拖拽变乱指组件被长按后拖拽时触发的变乱。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-drag-drop-0000001427584820-V3
名称功能形貌onDragStart(event: (event?: DragEvent, extraParams?: string) => CustomBuilder | DragItemInfo)第一次拖拽此变乱绑定的组件时,触发回调onDragEnter(event: (event?: DragEvent, extraParams?: string) => void)拖拽进入组件范围内时,触发回调onDragMove(event: (event?: DragEvent, extraParams?: string) => void)拖拽在组件范围内移动时,触发回调onDragLeave(event: (event?: DragEvent, extraParams?: string) => void)拖拽离开组件范围内时,触发回调onDrop(event: (event?: DragEvent, extraParams?: string) => void)绑定此变乱的组件可作为拖拽开释目标,当在本组件范围内制止拖拽行为时,触发回调


.1.5、按键变乱(键盘使用)—onKeyEvent(event: (event?: KeyEvent) => void)

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-key-0000001427744780-V3
按键变乱指组件与键盘、遥控器等按键设备交互时触发的变乱,适用于所有可获焦组件,例如Button。对于Text,Image等默认不可获焦的组件,可以设置focusable属性为true后使用按键变乱。
例如:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct KeyEventExample {
  5.   @State text: string = ''
  6.   @State eventType: string = ''
  7.   build() {
  8.     Column() {
  9.       Button('KeyEvent')
  10.         .onKeyEvent((event: KeyEvent) => {
  11.           if (event.type === KeyType.Down) {
  12.             this.eventType = 'Down'
  13.           }
  14.           if (event.type === KeyType.Up) {
  15.             this.eventType = 'Up'
  16.           }
  17.           this.text = 'KeyType:' + this.eventType + '\nkeyCode:' + event.keyCode + '\nkeyText:' + event.keyText
  18.         })
  19.       Text(this.text).padding(15)
  20.     }.height(300).width('100%').padding(35)
  21.   }
  22. }
复制代码

.1.6、焦点变乱—onFocus(event: () => void) onBlur(event) => void)

焦点变乱指页面焦点在可获焦组件间移动时触发的变乱,组件可使用焦点变乱来处理相关逻辑。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-focus-event-0000001478181373-V3


  • 目前仅支持通过外接键盘的tab键、方向键触发。
  • 存在默认交互逻辑的组件例如Button、TextInput等,默认即为可获焦,Text、Image等组件则默认状态为不可获焦,不可获焦状态下,无法触发焦点变乱,需要设置focusable属性为true才可触发。
例如:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct FocusEventExample {
  5.   @State oneButtonColor: string = '#FFC0CB'
  6.   @State twoButtonColor: string = '#87CEFA'
  7.   @State threeButtonColor: string = '#90EE90'
  8.   build() {
  9.     Column({ space: 20 }) {
  10.       // 通过外接键盘的上下键可以让焦点在三个按钮间移动,按钮获焦时颜色变化,失焦时变回原背景色
  11.       Button('First Button')
  12.         .backgroundColor(this.oneButtonColor)
  13.         .width(260)
  14.         .height(70)
  15.         .fontColor(Color.Black)
  16.         .focusable(true)
  17.         .onFocus(() => {
  18.           this.oneButtonColor = '#FF0000'
  19.         })
  20.         .onBlur(() => {
  21.           this.oneButtonColor = '#FFC0CB'
  22.         })
  23.       Button('Second Button')
  24.         .backgroundColor(this.twoButtonColor)
  25.         .width(260)
  26.         .height(70)
  27.         .fontColor(Color.Black)
  28.         .focusable(true)
  29.         .onFocus(() => {
  30.           this.twoButtonColor = '#FF0000'
  31.         })
  32.         .onBlur(() => {
  33.           this.twoButtonColor = '#87CEFA'
  34.         })
  35.       Button('Third Button')
  36.         .backgroundColor(this.threeButtonColor)
  37.         .width(260)
  38.         .height(70)
  39.         .fontColor(Color.Black)
  40.         .focusable(true)
  41.         .onFocus(() => {
  42.           this.threeButtonColor = '#FF0000'
  43.         })
  44.         .onBlur(() => {
  45.           this.threeButtonColor = '#90EE90'
  46.         })
  47.     }.width('100%').margin({ top: 20 })
  48.   }
  49. }
复制代码

.1.7、鼠标变乱—onHover(event: (isHover?: boolean) => void)onMouse(event: (event?: MouseEvent) => void)

在鼠标的单个动作触发多个变乱时,变乱的顺序是固定的,鼠标变乱默认透传。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-mouse-key-0000001478341101-V3
例如:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct MouseEventExample {
  5.   @State hoverText: string = 'no hover';
  6.   @State mouseText: string = '';
  7.   @State action: string = '';
  8.   @State mouseBtn: string = '';
  9.   @State color: Color = Color.Blue;
  10.   build() {
  11.     Column({ space: 20 }) {
  12.       Button(this.hoverText)
  13.         .width(180).height(80)
  14.         .backgroundColor(this.color)
  15.         .onHover((isHover: boolean) => {
  16.           // 通过onHover事件动态修改按钮在是否有鼠标悬浮时的文本内容与背景颜色
  17.           if (isHover) {
  18.             this.hoverText = 'hover';
  19.             this.color = Color.Pink;
  20.           } else {
  21.             this.hoverText = 'no hover';
  22.             this.color = Color.Blue;
  23.           }
  24.         })
  25.       Button('onMouse')
  26.         .width(180).height(80)
  27.         .onMouse((event: MouseEvent) => {
  28.           switch (event.button) {
  29.             case MouseButton.None:
  30.               this.mouseBtn = 'None';
  31.               break;
  32.             case MouseButton.Left:
  33.               this.mouseBtn = 'Left';
  34.               break;
  35.             case MouseButton.Right:
  36.               this.mouseBtn = 'Right';
  37.               break;
  38.             case MouseButton.Back:
  39.               this.mouseBtn = 'Back';
  40.               break;
  41.             case MouseButton.Forward:
  42.               this.mouseBtn = 'Forward';
  43.               break;
  44.             case MouseButton.Middle:
  45.               this.mouseBtn = 'Middle';
  46.               break;
  47.           }
  48.           switch (event.action) {
  49.             case MouseAction.Hover:
  50.               this.action = 'Hover';
  51.               break;
  52.             case MouseAction.Press:
  53.               this.action = 'Press';
  54.               break;
  55.             case MouseAction.Move:
  56.               this.action = 'Move';
  57.               break;
  58.             case MouseAction.Release:
  59.               this.action = 'Release';
  60.               break;
  61.           }
  62.           this.mouseText = 'onMouse:\nButton = ' + this.mouseBtn +
  63.           '\nAction = ' + this.action + '\nXY=(' + event.x + ',' + event.y + ')' +
  64.           '\nscreenXY=(' + event.screenX + ',' + event.screenY + ')';
  65.         })
  66.       Text(this.mouseText)
  67.     }.padding({ top: 30 }).width('100%')
  68.   }
  69. }
复制代码
鼠标悬浮时改变文本内容与背景颜色:

鼠标点击时:

.1.8、组件区域变化变乱—onAreaChange(event: (oldValue: Area, newValue: Area) => void)

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-component-area-change-event-0000001478061665-V3
组件区域变化变乱指组件表现的尺寸、位置等发生变化时触发的变乱。
例如:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct AreaExample {
  5.   @State value: string = 'Text'
  6.   @State sizeValue: string = ''
  7.   build() {
  8.     Column() {
  9.       Text(this.value)
  10.         .backgroundColor(Color.Green).margin(30).fontSize(20)
  11.         .onClick(() => {
  12.           this.value = this.value + 'Text'
  13.         })
  14.         .onAreaChange((oldValue: Area, newValue: Area) => {
  15.           console.info(`Ace: on area change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`)
  16.           this.sizeValue = JSON.stringify(newValue)
  17.         })
  18.       Text('new area is: \n' + this.sizeValue).margin({ right: 30, left: 30 })
  19.     }
  20.     .width('100%').height('100%').margin({ top: 30 })
  21.   }
  22. }
复制代码

.1.9、组件可见区域变化变乱—onVisibleAreaChange(ratios: Array, event: (isVisible: boolean, currentRatio: number) => void)

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-component-visible-area-change-event-0000001477981161-V3
组件可见区域变化变乱是组件在屏幕中的表现区域面积变化时触发的变乱,提供了判定组件是否完全或部分表现在屏幕中的本领,适用于广告曝光埋点之类的场景。
例如:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct ScrollExample {
  5.   scroller: Scroller = new Scroller()
  6.   private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  7.   @State testTextStr: string = 'test'
  8.   @State testRowStr: string = 'test'
  9.   build() {
  10.     Column() {
  11.       Column() {
  12.         Text(this.testTextStr)
  13.           .fontSize(20)
  14.         Text(this.testRowStr)
  15.           .fontSize(20)
  16.       }
  17.       .height(100)
  18.       .backgroundColor(Color.Gray)
  19.       .opacity(0.3)
  20.       Scroll(this.scroller) {
  21.         Column() {
  22.           Text("Test Text Visible Change")
  23.             .fontSize(20)
  24.             .height(200)
  25.             .margin({ top: 50, bottom: 20 })
  26.             .backgroundColor(Color.Green)
  27.               // 通过设置ratios为[0.0, 1.0],实现当组件完全显示或完全消失在屏幕中时触发回调
  28.             .onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => {
  29.               console.info('Test Text isVisible: ' + isVisible + ', currentRatio:' + currentRatio)
  30.               if (isVisible && currentRatio >= 1.0) {
  31.                 console.info('Test Text is fully visible. currentRatio:' + currentRatio)
  32.                 this.testTextStr = 'Test Text is fully visible'
  33.               }
  34.               if (!isVisible && currentRatio <= 0.0) {
  35.                 console.info('Test Text is completely invisible.')
  36.                 this.testTextStr = 'Test Text is completely invisible'
  37.               }
  38.             })
  39.           Row() {
  40.             Text('Test Row Visible  Change')
  41.               .fontSize(20)
  42.               .margin({ bottom: 20 })
  43.           }
  44.           .height(200)
  45.           .backgroundColor(Color.Yellow)
  46.           .onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => {
  47.             console.info('Test Row isVisible:' + isVisible + ', currentRatio:' + currentRatio)
  48.             if (isVisible && currentRatio >= 1.0) {
  49.               console.info('Test Row is fully visible.')
  50.               this.testRowStr = 'Test Row is fully visible'
  51.             }
  52.             if (!isVisible && currentRatio <= 0.0) {
  53.               console.info('Test Row is is completely invisible.')
  54.               this.testRowStr = 'Test Row is is completely invisible'
  55.             }
  56.           })
  57.           ForEach(this.arr, (item) => {
  58.             Text(item.toString())
  59.               .width('90%')
  60.               .height(150)
  61.               .backgroundColor(0xFFFFFF)
  62.               .borderRadius(15)
  63.               .fontSize(16)
  64.               .textAlign(TextAlign.Center)
  65.               .margin({ top: 10 })
  66.           }, item => item)
  67.         }.width('100%')
  68.       }
  69.       .backgroundColor(0x317aff)
  70.       .scrollable(ScrollDirection.Vertical)
  71.       .scrollBar(BarState.On)
  72.       .scrollBarColor(Color.Gray)
  73.       .scrollBarWidth(10)
  74.       .onScroll((xOffset: number, yOffset: number) => {
  75.         console.info(xOffset + ' ' + yOffset)
  76.       })
  77.       .onScrollEdge((side: Edge) => {
  78.         console.info('To the edge')
  79.       })
  80.       .onScrollEnd(() => {
  81.         console.info('Scroll Stop')
  82.       })
  83.     }.width('100%').height('100%').backgroundColor(0xDCDCDC)
  84.   }
  85. }
复制代码

.2、通用属性

.2.1、尺寸相关

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-size-0000001428061700-V3
.2.1.1、width—设置组件自身的宽度

缺省时使用元素自身内容需要的宽度。若子组件的宽大于父组件的宽,则会画出父组件的范围。
单位:vp
.2.1.2、height—设置组件自身的高度

缺省时使用元素自身内容需要的高度。若子组件的高大于父组件的高,则会画出父组件的范围。
单位:vp
.2.1.3、size—设置高宽尺寸。

单位:vp
.2.1.4、padding—设置内边距属性

参数为Length类型时,四个方向内边距同时收效。
默认值:0
单位:vp
padding设置百分比时,上下左右内边距均以父容器的width作为基础值。
.2.1.5、margin—设置外边距属性

参数为Length类型时,四个方向外边距同时收效。
默认值:0
单位:vp
margin设置百分比时,上下左右外边距均以父容器的width作为基础值。
.2.1.6、layoutWeight—按权重设置宽高(仅在Row/Column/Flex结构中收效)

父容器尺寸确定时,设置了layoutWeight属性的子元素与兄弟元素占主轴尺寸按照权重进行分配,忽略元素自己尺寸设置,表示自适应占满剩余空间。
默认值:0
说明:
仅在Row/Column/Flex结构中收效。
可选值为大于即是0的数字,或者可以转换为数字的字符串。
.2.1.7、constraintSize—设置束缚尺寸,组件结构时,进行尺寸范围限制

constraintSize的优先级高于Width和Height。若设置的minWidth大于maxWidth,则minWidth收效,minHeight与maxHeight同理。
默认值:
{
minWidth: 0,
maxWidth: Infinity,
minHeight: 0,
maxHeight: Infinity
}

.2.2、位置相关

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-location-0000001427584824-V3
.2.2.1、align—设置元素内容在元素绘制区域内的对齐方式

默认值:Alignment.Center
.2.2.2、direction----设置元素程度方向的结构

默认值:Direction.Auto
.2.2.3、position—绝对定位,设置元素左上角相对于父容器左上角偏移位置

在结构容器中,设置该属性不影响父容器结构,仅在绘制时进行位置调解。
适用于置顶表现、悬浮按钮等组件在父容器中位置固定的场景。
.2.2.4、markAnchor—设置元素在位置定位时的锚点,以元素左上角作为基准点进行偏移

通常共同position和offset属性使用,单独使用时,效果类似offset
默认值:{x: 0,y: 0}
.2.2.5、offset—相对定位,设置元素相对于自身的偏移量

设置该属性,不影响父容器结构,仅在绘制时进行位置调解。
默认值:{x: 0,y: 0}
.2.2.6、alignRules—指定相对容器的对齐规则



  • left:设置左对齐参数。
  • right:设置右对齐参数。
  • middle:设置横向居中对齐方式的参数。
  • top:设置顶部对齐的参数。
  • bottom:设置底部对齐的参数。
  • center:设置纵向居中对齐方式的参数。
    left?: { anchor: string, align: HorizontalAlign }
    该接口支持在ArkTS卡片中使用。
    说明:
  • anchor:设置作为锚点的组件的id值。
  • align:设置相对于锚点组件的对齐方式。


.2.3、结构束缚

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-layout-constraints-0000001427744784-V3
.2.3.1、aspectRatio—指定当前组件的宽高比

指定当前组件的宽高比,aspectRatio = width/height。
.2.3.2、displayPriority—设置当前组件在结构容器中表现的优先级(仅在Row/Column/Flex(单行)容器组件中收效)

当父容器空间不敷时,低优先级的组件会被隐藏。
小数点后的数字不作优先级区分,即区间为[x, x + 1)内的数字视为相同优先级。例如:1.0与1.9为同一优先级。
图1 竖屏表现

图2 横屏表现

横屏表现

.2.4、Flex结构(子属性仅当父组件是 Flex、Column、Row 时收效)

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-flex-layout-0000001478181377-V3
.2.4.1、flexBasis—设置组件在父容器主轴方向上的基准尺寸

默认值:‘auto’(表示组件在主轴方向上的基准尺寸为组件本来的大小)。
不支持百分比设置
.2.4.2、flexGrow—设置父容器的剩余空间分配给此属性所在组件的比例

默认值:0
.2.4.3、flexShrink—设置父容器压缩尺寸分配给此属性所在组件的比例

父容器为Row、Column时,默认值:0
父容器为flex时,默认值:1
.2.4.4、alignSelf—子组件在父容器交织轴的对齐格式,会覆盖Flex结构容器中的alignItems设置

默认值:ItemAlign.Auto

.2.5、边框设置

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-border-0000001478341105-V3
.2.5.1、border—统一边框样式设置接口



  • width:设置边框宽度。
  • color:设置边框颜色。
  • radius:设置边框圆角半径。
  • style:设置边框样式。
说明:
边框宽度默认值为0,即不表现边框。
.2.5.2、borderStyle—设置元素的边框样式

默认值:BorderStyle.Solid
.2.5.3、borderWidth—设置元素的边框宽度,不支持百分比

.2.5.4、borderColor—设置元素的边框颜色

默认值:Color.Black
.2.5.5、borderRadius—设置元素的边框圆角半径,不支持百分比


.2.6、图片边框设置

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-border-image-0000001478061669-V3
.2.6.1、borderImage—图片边框或者渐变色边框设置接口




.2.7、背景设置

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-background-0000001477981165-V3
.2.7.1、backgroundColor—设置组件的背景致

.2.7.2、backgroundImage—背景图片

src:图片所在,支持网络图片资源和本舆图片资源所在(不支持svg类型的图片)。
repeat:设置背景图片的重复样式,默认不重复。当设置的背景图片为透明底色图片,且同时设置了backgroundColor时,二者叠加表现,背景颜色在最底部。
.2.7.3、backgroundImageSize—背景图片大小设置

设置背景图像的高度和宽度。当输入为{width: Length, height: Length}对象时,如果只设置一个属性,则第二个属性保持图片原始宽高比进行调解。默认保持原图的比例稳定。
width和height取值范围: [0, +∞)
默认值:ImageSize.Auto
说明:
设置为小于0的值时,按值为0表现。当设置了height未设置width时,width根据图片原始宽高比进行调解。
.2.7.4、backgroundImagePosition—设置背景图在组件中表现位置,即相对于组件左上角的坐标

默认值:{x: 0,y: 0}
x和y值设置百分比时,偏移量是相对组件自身宽高计算的。

.2.8、透明度设置

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-opacity-0000001427902432-V3
.2.8.1、opacity—元素的不透明度

取值范围为0到1,1表示不透明,0表示完全透明, 达到隐藏组件效果,但是在结构中占位。
说明:
子组件可以继承父组件的此属性。默认值:1

.2.9、显隐控制

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-visibility-0000001428061704-V3
.2.9.1、visibility—控制当前组件表现或隐藏

根据详细场景需要可使用条件渲染取代。
默认值:Visibility.Visible

.2.10、禁用控制

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-enable-0000001427584828-V3
组件是否可交互,可交互状态下响应点击变乱、触摸变乱、拖拽变乱、按键变乱、焦点变乱和鼠标变乱。
.2.10.1、enabled—是否启用

值为true表示组件可交互,响应点击等使用。
值为false表示组件不可交互,不响应点击等使用。
默认值:true

.2.11、浮层

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-overlay-0000001427744788-V3
设置组件的遮罩文本。
.2.11.1、overlay—在当前组件上,增加遮罩文本

value: 遮罩文本内容。
options: 文本定位,align设置文本相对于组件的方位,offset为文本基于自身左上角的偏移量。文本默认处于组件左上角。
两者都设置时效果重叠,文本相对于组件方位定位后再基于当前位置文本的左上角进行偏移。
默认值:options:{align: Alignment.TopStart,offset: { x: 0, y: 0}}

.2.12、Z序控制

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-z-order-0000001478181381-V3
组件的Z序,设置组件的堆叠顺序。
.2.12.1、zIndex—同一容器中兄弟组件表现层级关系

zIndex值越大,表现层级越高,即zIndex值大的组件会覆盖在zIndex值小的组件上方
Stack容器内子组件不设置zIndex的效果

Stack容器子组件设置zIndex后效果

.2.13、图形变动

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-transformation-0000001478341109-V3
用于对组件进行旋转、平移、缩放、矩阵变动等使用。
.2.13.1、rotate—可使组件在以组件左上角为坐标原点的坐标系中进行旋转(坐标系如下图所示)

其中,(x, y, z)指定一个矢量,作为旋转轴。


  • angle:旋转角度。取值为正时相对于旋转轴方向顺时针转动,取值为负时相对于旋转轴方向逆时针转动。取值可为string类型,如’90deg’。
  • centerX和centerY用于指定旋转的中心点。
旋转轴和旋转中心点都基于坐标系设定,组件发生位移时,坐标系不会随之移动。
默认值:{x: 0,y: 0,z: 0,centerX: ‘50%’,centerY: ‘50%’}
.2.13.2、translate—可使组件在以组件左上角为坐标原点的坐标系中进行移动(坐标系如下图所示)

其中,x,y,z的值分别表示在对应轴移动的距离,值为正时表示向对应轴的正向移动,值为负时表示向对应轴的反向移动。移动距离支持数字和字符串(比如’10px’,‘10%’)两种类型。
默认值:{x: 0,y: 0,z: 0}

.2.13.3、scale—可以分别设置X轴、Y轴、Z轴的缩放比例

默认值为1,同时可以通过centerX和centerY设置缩放的中心点。
默认值:{x: 1,y: 1,z: 1,centerX:‘50%’,centerY:‘50%’}
.2.13.4、transform—设置当前组件的变动矩阵


.2.14、图像效果

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-image-effect-0000001478061673-V3
设置组件的暗昧,阴影效果以及设置图片的图像效果。
.2.14.1、blur—为当前组件添加内容暗昧效果,入参为暗昧半径,暗昧半径越大越暗昧,为0时不暗昧

取值范围:[0, +∞)
.2.14.2、backdropBlur—为当前组件添加背景暗昧效果,入参为暗昧半径,暗昧半径越大越暗昧,为0时不暗昧

取值范围:[0, +∞)
.2.14.3、shadow—为当前组件添加阴影效果

入参为暗昧半径(必填)、阴影的颜色(可选,默认为灰色)、X轴的偏移量(可选,默认为0),Y轴的偏移量(可选,默认为0),偏移量单位为px
.2.14.4、grayscale—为当前组件添加灰度效果

值界说为灰度转换的比例,入参1.0则完全转为灰度图像,入参则0.0图像无变化,入参在0.0和1.0之间时,效果呈线性变化。(百分比)
取值范围:[0, 1]
说明:
设置小于0的值时,按值为0处理,设置大于1的值时,按值为1处理。
.2.14.5、brightness—为当前组件添加高光效果

入参为高光比例,值为1时没有效果,小于1时亮度变暗,0为全黑,大于1时亮度增加,数值越大亮度越大。
取值范围:[0, +∞)
说明:
设置小于0的值时,按值为0处理。
.2.14.6、saturate—为当前组件添加饱和度效果

饱和度为颜色中的含色因素和消色因素(灰)的比例,入参为1时,表现原图像,大于1时含色因素越大,饱和度越大;小于1时消色因素越大,饱和度越小。(百分比)
.2.14.7、contrast—为当前组件添加对比度效果

入参为对比度的值。值为1时,表现原图,大于1时,值越大对比度越高,图像越清楚醒目,小于1时,值越小对比度越低,当对比度为0时,图像变为全灰。(百分比)
取值范围:[0, +∞)
说明:
设置小于0的值时,按值为0处理。
.2.14.8、invert—反转输入的图像

入参为图像反转的比例,值为1时完全反转,值为0则图像无变化。(百分比)
取值范围:[0, 1]
说明:
设置小于0的值时,按值为0处理。
.2.14.9、sepia—将图像转换为深褐色

入参为图像反转的比例。值为1则完全是深褐色的,值为0图像无变化。 (百分比)
.2.14.10、hueRotate—色相旋转效果,输入参数为旋转角度

取值范围:(-∞, +∞)
说明:
色调旋转360度会表现原始颜色。先将色调旋转180 度,然后再旋转-180度会表现原始颜色。数据类型为number时,值为90和’90deg’效果一致。
.2.14.11、colorBlend—为当前组件添加颜色叠加效果,入参为叠加的颜色



.2.15、外形裁剪(圆角等其他使用处理)

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-sharp-clipping-0000001477981173-V3
用于对组件进行裁剪、遮罩处理。
.2.15.1、clip—参数为相应类型的组件,按指定的外形对当前组件进行裁剪;参数为boolean类型时,设置是否按照父容器边缘轮廓进行裁剪

默认值:false
.2.15.2、mask—在当前组件上加上指定外形的遮罩


.2.16、文本样式设置

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-text-style-0000001427902436-V3
针对包含文本元素的组件,设置文本样式。
.2.16.1、fontColor—设置字体颜色

.2.16.2、fontSize—设置字体大小

Length为number类型时,使用fp单位。字体默认大小16。不支持设置百分比字符串。
.2.16.3、fontStyle—设置字体样式

默认值:FontStyle.Normal
.2.16.4、fontWeight—设置文本的字体粗细

number类型取值[100, 900],取值隔断为100,默认为400,取值越大,字体越粗。string类型仅支持number类型取值的字符串情势,例如"400",以及"bold"、“bolder”、“lighter”、“regular”、“medium”,分别对应FontWeight中相应的枚举值。
默认值:FontWeight.Normal
.2.16.5、fontFamily—设置字体列表

默认字体’HarmonyOS Sans’,当前支持’HarmonyOS Sans’字体和注册自界说字体。
.2.16.6、lineHeight—设置文本的文本行高

设置值不大于0时,不限制文本行高,自适应字体大小,Length为number类型时单位为fp。
.2.16.7、decoration—设置文本装饰线样式及其颜色

默认值:{type: TextDecorationType.None,color:Color.Black}

.2.17、栅格设置

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-grid-0000001428061712-V3
栅格结构的列宽、列间距由距离最近的GridContainer父组件决定。使用栅格属性的组件树上至少需要有1个GridContainer容器组件。
.2.17.1、gridSpan—默认占用列数

指useSizeType属性没有设置对应尺寸的列数(span)时,占用的栅格列数。
说明:
设置了栅格span属性,组件的宽度由栅格结构决定。
默认值:1
.2.17.2、gridOffset—默认偏移列数

指useSizeType属性没有设置对应尺寸的偏移(offset)时, 当前组件沿着父组件Start方向,偏移的列数,也就是当前组件位于第n列。
说明:


  • 设置该属性后,当前组件在父组件程度方向的结构不再跟随父组件原有的结构方式,而是沿着父组件的Start方向偏移肯定位移。
  • 偏移位移 = (列宽 + 间距)* 列数。
  • 设置了偏移(gridOffset)的组件之后的兄弟组件会根据该组件进行相对结构,类似相对结构。
默认值:0
图1 设备宽度为SM

图2 设备宽度为MD

图3 设备宽度为LG

图4 单独设置gridSpan和gridOffset在特定屏幕大小下的效果与useSizeType效果一致

.2.18、颜色渐变

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-gradient-color-0000001427584832-V3
设置组件的颜色渐变效果。
.2.18.1、linearGradient—线性渐变



  • angle: 线性渐变的起始角度。0点方向顺时针旋转为正向角度。默认值:180
  • direction: 线性渐变的方向,设置angle后不收效。默认值:GradientDirection.Bottom
  • colors: 为渐变的颜色形貌。
  • repeating: 为渐变的颜色重复着色。默认值:false
.2.18.2、sweepGradient—角度渐变



  • center:为角度渐变的中心点,即相对于当前组件左上角的坐标。
  • start:角度渐变的出发点。默认值:0
  • end:角度渐变的终点。默认值:0
  • rotation: 角度渐变的旋转角度。默认值:0
  • colors: 为渐变的颜色形貌。
  • repeating: 为渐变的颜色重复着色。默认值:false
从API version 9开始,该接口支持在ArkTS卡片中使用。
说明:
设置为小于0的值时,按值为0处理。设置为大于360的值时,按值为360处理。当start、end、rotation的数据类型为string,值为"90"或"90%",与90效果一致。
.2.18.3、radialGradient—径向渐变



  • center:径向渐变的中心点,即相对于当前组件左上角的坐标。
  • radius:径向渐变的半径。取值范围 [0,+∞)说明:设置为小于的0值时,按值为0处理。
  • colors: 为渐变的颜色形貌。
  • repeating: 为渐变的颜色重复着色。默认值:false



.2.19、Popup控制

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-popup-0000001427744792-V3
给组件绑定popup弹窗,并设置弹窗内容,交互逻辑和表近况态。
.2.19.1、bindPopup—给组件绑定Popup弹窗,设置参数show为true弹出弹框

show: 弹窗表近况态,默认值为false,隐藏弹窗。popup弹窗必须等待页面全部构建完成才能展示,因此show不能在页面构建中设置为true,否则会导致popup弹窗表现位置及外形错误。
popup: 设置当前弹窗提示的参数。

.2.20、菜单控制

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-menu-0000001478181385-V3
为组件绑定弹出式菜单,弹出式菜单以垂直列表情势表现菜单项,可通过长按、点击或鼠标右键触发。
.2.20.1、bindMenu—给组件绑定菜单,点击后弹出菜单

弹出菜单项支持文本和自界说两种功能。
.2.20.2、bindContextMenu—给组件绑定菜单,触发方式为长按或者右键点击,弹出菜单项需要自界说



.2.21、焦点控制

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-focus-0000001478061677-V3
自界说组件的走焦效果,可设置组件是否走焦和详细的走焦顺序,tab键或者方向键切换焦点。
.2.21.1、focusable—设置当前组件是否可以获焦

存在默认交互逻辑的组件例如Button、TextInput等,默认即为可获焦,Text、Image等组件则默认状态为不可获焦。不可获焦状态下,无法触发焦点变乱。
.2.21.2、tabIndex—自界说组件tab键走焦本领

如有设置了tabIndex大于0的组件,则tab键走焦只会在tabIndex大于0的组件内按照tabIndex的值从小到大并循环依次走焦。若没有设置tabIndex大于0的组件,则tabIndex即是0的组件按照组件预设的走焦规则走焦。


  • tabIndex >= 0:表示元素是可聚焦的,并且可以通过tab键走焦来访问到该元素。
  • tabIndex < 0(通常是tabIndex = -1):表示元素是可聚焦的,但是不能通过tab键走焦来访问到该元素。
默认值:0
.2.21.3、defaultFocus—设置当前组件是否为当前页面上的默认焦点,仅在初次创建的页面第一次进入时收效

默认值:false
.2.21.4、groupDefaultFocus—设置当前组件是否为当前组件所在容器获焦时的默认焦点,仅在初次创建容器节点第一次获焦时收效

默认值:false
说明: 必须与tabIndex联合使用,当某个容器设置了tabIndex,且容器内某子组件设置了groupDefaultFocus,当该容器首次获焦时,会自动将焦点转移至该组件上。
.2.21.5、focusOnTouch—设置当前组件是否支持点击获焦本领

默认值:false
说明: 仅在组件可点击时才能正常获取焦点。
首次按下TAB键,焦点切换到defaultFocus绑定的组件上:

第二次按TAB键,焦点切换到tabIndex(1)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:

第三次按TAB键,焦点切换到tabIndex(2)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:

第四次按TAB键,焦点切换到tabIndex(3)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:

点击绑定了focusOnTouch的组件,组件自身获焦:

按下TAB键,激活焦点态表现。申请不存在的组件获焦:

申请不可获焦的组件获焦:

申请存在且可获焦的组件获焦:

.2.22悬浮态效果

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-hover-effect-0000001477981177-V3
设置组件的鼠标悬浮态表现效果。
.2.22.1、hoverEffect—设置当前组件悬停态下的悬浮效果

默认值:HoverEffect.Auto
.2.23、组件标识

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-component-id-0000001427902440-V3
id为组件的唯一标识,在整个应用内唯一。本模块提供组件标识相关接口,可以获取指定id组件的属性,也提供向指定id组件发送变乱的功能。
.2.23.1、id—组件的唯一标识,唯一性由使用者保证

.2.24、触摸热区设置

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-touch-target-0000001428061716-V3
适用于支持通用点击变乱、通用触摸变乱、通用手势处理的组件。
.2.24.1、responseRegion—设置一个或多个触摸热区,包罗位置和大小

默认触摸热区为整个组件,默认值:{x:0,y:0,width:‘100%’,height:‘100%’}

.2.25、多态样式

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-polymorphic-style-0000001427584836-V3
设置组件不同状态下的样式。
.2.25.1、stateStyles—设置组件不同状态的样式


.2.26、触摸测试控制

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-hit-test-behavior-0000001427744800-V3
设置组件的触摸测试类型。ArkUI开辟框架在处理触屏变乱时,会在触屏变乱触发前,进行按压点和组件区域的触摸测试来收集需要响应触屏变乱的组件,然后基于触摸测试结果分发相应的触屏变乱。hitTestBehavior属性可以设置不同的触摸测试响应模式,影响组件的触摸测试收集结果,最终影响后续的触屏变乱分发,详细影响参考HitTestMode枚举说明。
当Stack组件中有多个节点触摸区域重叠时,如两个节点,默认只会对表现在最上层的节点做触摸测试,若需要表现在下层的节点触发触摸测试,请给表现在上层的节点设置hitTestBehavior为HitTestMode.Transparent。
.2.26.1、hitTestBehavior—设置当前组件的触摸测试类型

默认值: HitTestMode.Default
.2.27、分布式迁徙标识

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-restoreid-0000001478341121-V3
组件的分布式迁徙标识,指明了该组件在分布式迁徙场景下可以将特定状态规复到对端设备。
.2.27.1、restoreId—标记支持分布式迁徙的组件Id,用于两头设备组件的配对

同一个应用中各个支持分布式迁徙组件的Id必须不同。
.2.28、点击控制

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-click-0000001478341113-V3
.2.28.1、touchable—设置当前组件是否可以响应点击变乱、触摸变乱等手指交互变乱。

默认值:true

.3、手势处理

.3.1、绑定手势方法

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-gesture-settings-0000001477981181-V3
为组件绑定不同类型的手势变乱,并设置变乱的响应方法。
.3.1.1、gesture—绑定手势



  • gesture: 绑定的手势类型,
  • mask: 变乱响应设置。
.3.1.2、priorityGesture—绑定优先辨认手势



  • gesture: 绑定的手势类型,
  • mask: 变乱响应设置。
1、默认情况下,子组件优先辨认通过gesture绑定的手势,当父组件设置priorityGesture时,父组件优先辨认priorityGesture绑定的手势。
2、长按手势时,设置触发长按的最短时间小的组件会优先响应,会忽略priorityGesture设置。
.3.1.3、parallelGesture—绑定可与子组件手势同时触发的手势



  • gesture: 绑定的手势类型。
  • mask: 变乱响应设置。
手势变乱为非冒泡变乱。父组件设置parallelGesture时,父子组件相同的手势变乱都可以触发,实现类似冒泡效果。若父子组件中同时绑定单击手势变乱和双击手势变乱,则只响应单击手势变乱。
例如:
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct GestureSettingsExample {
  5.   @State priorityTestValue: string = ''
  6.   @State parallelTestValue: string = ''
  7.   build() {
  8.     Column() {
  9.       Column() {
  10.         Text('TapGesture:' + this.priorityTestValue).fontSize(28)
  11.           .gesture(
  12.           TapGesture()
  13.             .onAction(() => {
  14.               this.priorityTestValue += '\nText'
  15.             }))
  16.       }
  17.       .height(200)
  18.       .width(250)
  19.       .padding(20)
  20.       .margin(20)
  21.       .border({ width: 3 })
  22.       // 设置为priorityGesture时,点击文本会忽略Text组件的TapGesture手势事件,优先识别父组件Column的TapGesture手势事件
  23.       .priorityGesture(
  24.       TapGesture()
  25.         .onAction((event: GestureEvent) => {
  26.           this.priorityTestValue += '\nColumn'
  27.         }), GestureMask.IgnoreInternal)
  28.       Column() {
  29.         Text('TapGesture:' + this.parallelTestValue).fontSize(28)
  30.           .gesture(
  31.           TapGesture()
  32.             .onAction(() => {
  33.               this.parallelTestValue += '\nText'
  34.             }))
  35.       }
  36.       .height(200)
  37.       .width(250)
  38.       .padding(20)
  39.       .margin(20)
  40.       .border({ width: 3 })
  41.       // 设置为parallelGesture时,点击文本会同时触发子组件Text与父组件Column的TapGesture手势事件
  42.       .parallelGesture(
  43.       TapGesture()
  44.         .onAction((event: GestureEvent) => {
  45.           this.parallelTestValue += '\nColumn'
  46.         }), GestureMask.Normal)
  47.     }
  48.   }
  49. }
复制代码

.3.2、手势类型

.3.2.1、TapGesture—支持单击、双击和多次点击变乱的辨认。

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-tapgesture-0000001428061720-V3
  1. 使用:TapGesture(value?: { count?: number, fingers?: number })
  2. 例如: Text('Click twice').fontSize(28)
  3.     .gesture(
  4.     TapGesture({ count: 2 })
  5.       .onAction((event: GestureEvent) => {
  6.         this.value = JSON.stringify(event.fingerList[0])
  7.       })
  8.     )
复制代码

.3.2.2、LongPressGesture—用于触发长按手势变乱,触发长按手势的最少手指数为1,最短长按时间为500毫秒

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-longpressgesture-0000001427584844-V3
  1. 使用:LongPressGesture(value?: { fingers?: number, repeat?: boolean, duration?: number })
  2. 例如:Text('LongPress onAction:' + this.count).fontSize(28)
  3.     // 单指长按文本触发该手势事件
  4.     .gesture(
  5.     LongPressGesture({ repeat: true })
  6.       // 由于repeat设置为true,长按动作存在时会连续触发,触发间隔为duration(默认值500ms)
  7.       .onAction((event: GestureEvent) => {
  8.         if (event.repeat) {
  9.           this.count++
  10.         }
  11.       })
  12.         // 长按动作一结束触发
  13.       .onActionEnd(() => {
  14.         this.count = 0
  15.       })
  16.     )
复制代码

.3.2.3、PanGesture—用于触发拖动手势变乱,滑动的最小距离为5vp时拖动手势辨认乐成

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-pangesture-0000001427744804-V3
  1. 使用:PanGesture(value?: { fingers?: number; direction?: PanDirection; distance?: number } | PanGestureOptions)
  2. 例如:Column() {
  3.     Text('PanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
  4.   }
  5.   .height(200)
  6.   .width(300)
  7.   .padding(20)
  8.   .border({ width: 3 })
  9.   .margin(50)
  10.   .translate({ x: this.offsetX, y: this.offsetY, z: 0 })// 以组件左上角为坐标原点进行移动
  11.   // 左右拖动触发该手势事件
  12.   .gesture(
  13.   PanGesture(this.panOption)
  14.     .onActionStart((event: GestureEvent) => {
  15.       console.info('Pan start')
  16.     })
  17.     .onActionUpdate((event: GestureEvent) => {
  18.       this.offsetX = this.positionX + event.offsetX
  19.       this.offsetY = this.positionY + event.offsetY
  20.     })
  21.     .onActionEnd(() => {
  22.       this.positionX = this.offsetX
  23.       this.positionY = this.offsetY
  24.       console.info('Pan end')
  25.     })
复制代码
向左拖动:

点击按钮修改PanGesture触发条件,双指向左下方拖动:

.3.2.4、PinchGesture—用于触发捏合手势,触发捏合手势的最少手指为2指,最大为5指,最小辨认距离为5vp

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-pinchgesture-0000001478181393-V3
  1. 使用:PinchGesture(value?: { fingers?: number, distance?: number })
  2. 例如:Column() {
  3.     Text('PinchGesture scale:\n' + this.scaleValue)
  4.     Text('PinchGesture center:\n(' + this.pinchX + ',' + this.pinchY + ')')
  5.   }
  6.   .height(200)
  7.   .width(300)
  8.   .padding(20)
  9.   .border({ width: 3 })
  10.   .margin({ top: 100 })
  11.   .scale({ x: this.scaleValue, y: this.scaleValue, z: 1 })
  12.   // 三指捏合触发该手势事件
  13.   .gesture(
  14.   PinchGesture({ fingers: 3 })
  15.     .onActionStart((event: GestureEvent) => {
  16.       console.info('Pinch start')
  17.     })
  18.     .onActionUpdate((event: GestureEvent) => {
  19.       this.scaleValue = this.pinchValue * event.scale
  20.       this.pinchX = event.pinchCenterX
  21.       this.pinchY = event.pinchCenterY
  22.     })
  23.     .onActionEnd(() => {
  24.       this.pinchValue = this.scaleValue
  25.       console.info('Pinch end')
  26.     })
  27.   )
复制代码

.3.2.5、RotationGesture—用于触发旋转手势变乱,触发旋转手势的最少手指为2指,最大为5指,最小改变度数为1度

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-rotationgesture-0000001478341125-V3
  1. 使用:RotationGesture(value?: { fingers?: number, angle?: number })
  2. 例如:Column() {
  3.     Text('RotationGesture angle:' + this.angle)
  4.   }
  5.   .height(200)
  6.   .width(300)
  7.   .padding(20)
  8.   .border({ width: 3 })
  9.   .margin(80)
  10.   .rotate({ angle: this.angle })
  11.   // 双指旋转触发该手势事件
  12.   .gesture(
  13.   RotationGesture()
  14.     .onActionStart((event: GestureEvent) => {
  15.       console.info('Rotation start')
  16.     })
  17.     .onActionUpdate((event: GestureEvent) => {
  18.       this.angle = this.rotateValue + event.angle
  19.     })
  20.     .onActionEnd(() => {
  21.       this.rotateValue = this.angle
  22.       console.info('Rotation end')
  23.     })
  24.   )
复制代码

.3.2.6、SwipeGesture—用于触发滑动变乱,滑动速度大于100vp/s时可辨认乐成

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-basic-gestures-swipegesture-0000001478061685-V3
  1. 使用:SwipeGesture(value?: { fingers?: number; direction?: SwipeDirection; speed?: number })
  2. 例如:Column() {
  3.     Text("SwipeGesture speed\n" + this.speed)
  4.     Text("SwipeGesture angle\n" + this.rotateAngle)
  5.   }
  6.   .border({ width: 3 })
  7.   .width(300)
  8.   .height(200)
  9.   .margin(100)
  10.   .rotate({ angle: this.rotateAngle })
  11.   // 单指竖直方向滑动时触发该事件
  12.   .gesture(
  13.   SwipeGesture({ direction: SwipeDirection.Vertical })
  14.     .onAction((event: GestureEvent) => {
  15.       this.speed = event.speed
  16.       this.rotateAngle = event.angle
  17.     })
  18.   )
复制代码

.3.3、组合手势—手势辨认组合,即多种手势组合为复合手势,支持连续辨认、并行辨认和互斥辨认

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-combined-gestures-0000001477981185-V3
  1. 使用:GestureGroup(mode: GestureMode, ...gesture: GestureType[])
  2. 例如:olumn() {
  3.   Text('sequence gesture\n' + 'LongPress onAction:' + this.count + '\nPanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
  4.     .fontSize(15)
  5. }
  6. .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
  7. .height(150)
  8. .width(200)
  9. .padding(20)
  10. .margin(20)
  11. .border({ width: 3, style: this.borderStyles })
  12. .gesture(
  13.   // 以下组合手势为顺序识别,当长按手势事件未正常触发时则不会触发拖动手势事件
  14. GestureGroup(GestureMode.Sequence,
  15. LongPressGesture({ repeat: true })
  16.   .onAction((event: GestureEvent) => {
  17.     if (event.repeat) {
  18.       this.count++
  19.     }
  20.     console.info('LongPress onAction')
  21.   })
  22.   .onActionEnd(() => {
  23.     console.info('LongPress end')
  24.   }),
  25. PanGesture()
  26.   .onActionStart(() => {
  27.     this.borderStyles = BorderStyle.Dashed
  28.     console.info('pan start')
  29.   })
  30.   .onActionUpdate((event: GestureEvent) => {
  31.     this.offsetX = this.positionX + event.offsetX
  32.     this.offsetY = this.positionY + event.offsetY
  33.     console.info('pan update')
  34.   })
  35.   .onActionEnd(() => {
  36.     this.positionX = this.offsetX
  37.     this.positionY = this.offsetY
  38.     this.borderStyles = BorderStyle.Solid
  39.     console.info('pan end')
  40.   })
  41. )
  42.   .onCancel(() => {
  43.     console.info('sequence gesture canceled')
  44.   })
复制代码
按顺序起首触发长按变乱:

按顺序起首触发长按变乱,长按变乱辨认结束之后,其次触发拖动变乱,向右下方拖动

自界说组件的生命周期

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/arkts-custom-component-lifecycle-0000001482395076-V3
自界说组件的生命周期回调函数用于通知用户该自界说组件的生命周期,这些回调函数是私有的,在运行时由开辟框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。
  1. aboutToAppear?(): void
  2.    aboutToAppear函数在创建自定义组件的新实例后,在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build()函数中生效。
  3. aboutToDisappear?(): void
  4.    aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。
  5. onPageShow?(): void
  6.    页面每次显示时触发一次,包括路由过程、应用进入前台等场景,仅@Entry装饰的自定义组件生效。
  7. onPageHide?(): void
  8.    页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景,仅@Entry装饰的自定义组件生效。
  9. onBackPress?(): void
  10.    当用户点击返回按钮时触发,仅@Entry装饰的自定义组件生效。
  11. onLayout?(children: Array<LayoutChild>, constraint: ConstraintSizeOptions): void
  12.    框架会在自定义组件布局时,将该自定义组件的子节点信息和自身的尺寸范围通过onLayout传递给该自定义组件。不允许在onLayout函数中改变状态变量。
  13. onMeasure?(children: Array<LayoutChild>, constraint: ConstraintSizeOptions): void
  14.    框架会在自定义组件确定尺寸时,将该自定义组件的子节点信息和自身的尺寸范围通过onMeasure传递给该自定义组件。不允许在onMeasure函数中改变状态变量。
复制代码
生命周期内部相关实例

  1. LayoutChild(子组件布局信息)
  2. LayoutBorderInfo(子组件border信息)
  3. LayoutInfo(子组件layout信息)
复制代码

部分情况的周期执行流程



  • 应用冷启动的初始化流程为:MyComponent aboutToAppear --> MyComponent build --> Child aboutToAppear --> Child build --> Child build执行完毕 --> MyComponent build执行完毕 --> Index onPageShow。
  • 点击“delete Child”,if绑定的this.showChild变成false,删除Child组件,会执行Child aboutToDisappear方法。
  • 点击“push to next page”,调用router.pushUrl接口,跳转到别的一个页面,当前Index页面隐藏,执行页面生命周期Index onPageHide。此处调用的是router.pushUrl接口,Index页面被隐藏,并没有销毁,以是只调用onPageHide。跳转到新页面后,执行初始化新页面的生命周期的流程。
  • 如果调用的是router.replaceUrl,则当前Index页面被销毁,执行的生命周期流程将变为:Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。上文已经提到,组件的销毁是从组件树上直接摘下子树,以是先调用父组件的aboutToDisappear,再调用子组件的aboutToDisappear,然后执行初始化新页面的生命周期流程。
  • 点击返回按钮,触发页面生命周期Index onBackPress,且触发返回一个页面后会导致当前Index页面被销毁。
  • 最小化应用或者应用进入背景,触发Index onPageHide。当前Index页面没有被销毁,以是并不会执行组件的aboutToDisappear。应用回到前台,执行Index onPageShow。
  • 退出应用,执行Index onPageHide --> MyComponent aboutToDisappear --> Child aboutToDisappear。
应用相关注解、变量、说明等

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/arkts-state-management-0000001504151156-V3
AppStorage(应用数据存储)

双向数据绑定—Link(‘PropA’)------(能从AppStorage取/设置)



  • 与AppStorage中对应的propName创建双向数据绑定。如果给定的propName在AppStorage中存在,返回与AppStorage中propName对应属性的双向绑定数据。
  • 双向绑定数据的修改会同步回AppStorage中,AppStorage会将变化同步到所有绑定该propName的数据和自界说组件中。
  • 如果AppStorage中不存在propName,则返回undefined。
    使用:static Link(propName: string): any
    例如:AppStorage.SetOrCreate(‘PropA’, 47);
    let linkToPropA1 = AppStorage.Link(‘PropA’);
    let linkToPropA2 = AppStorage.Link(‘PropA’); // linkToPropA2.get() == 47
    linkToPropA1.set(48); // 双向同步: linkToPropA1.get() == linkToPropA2.get() == 48
双向数据绑定—SetAndLink(‘PropB’, 49)------(AppStorage存在返回,不存在使用默认值设置)

与Link接口类似,如果给定的propName在AppStorage中存在,则返回该propName对应的属性的双向绑定数据。如果不存在,则使用defaultValue在AppStorage创建和初始化propName,返回其双向绑定数据。
  1. 使用:static SetAndLink<T>(propName: string, defaultValue: T): SubscribedAbstractProperty<T>
  2. 例如:AppStorage.SetOrCreate('PropA', 47);
  3.      let link1: SubscribedAbstractProperty<number> = AppStorage.SetAndLink('PropB', 49); // Create PropB 49
  4.      let link2: SubscribedAbstractProperty<number> = AppStorage.SetAndLink('PropA', 50); // PropA exists, remains 47
复制代码
取单向数据绑定—Prop(‘PropA’)------(只能从AppStorage取,不能设置)

与AppStorage中对应的propName创建单向属性绑定。如果给定的propName在AppStorage中存在,则返回与AppStorage中propName对应属性的单向绑定数据。如果AppStorage中不存在propName,则返回undefined。单向绑定数据的修改不会被同步回AppStorage中。
  1. 使用:static Prop(propName: string): any
  2. 例如:AppStorage.SetOrCreate('PropA', 47);
  3.      let prop1 = AppStorage.Prop('PropA');
  4.      let prop2 = AppStorage.Prop('PropA');
  5.      prop1.set(1); // one-way sync: prop1.get()=1; but prop2.get() == 47
复制代码
取单向数据绑定—SetAndProp(‘PropB’, 49)------(只能从AppStorage取,有值返回,无值使用默认值设置并返回)

与Prop接口类似。如果给定的propName在AppStorage存在,则返回该propName对应的属性的单向绑定数据。如果不存在,则使用defaultValue在AppStorage创建和初始化propName对应的属性,返回其单向绑定数据。
  1. 使用:static SetAndProp<S>(propName: string, defaultValue: S): SubscribedAbstractProperty<S>
  2. 例如:AppStorage.SetOrCreate('PropA', 47);
  3.      let prop: SubscribedAbstractProperty<number> = AppStorage.SetAndProp('PropB', 49); // PropA -> 47, PropB -> 49
复制代码
是否存在key判定—Has(‘simpleProp’)------(AppStorage是否存在key)

判定propName对应的属性是否在AppStorage中存在。
  1. 使用:static Has(propName: string): boolean
  2. 例如:AppStorage.Has('simpleProp');
复制代码
取值—Get(‘PropA’)—(AppStorage存在返回不存在返回undefined)

获取propName在AppStorage中对应的属性。如果不存在返回undefined。
  1. 使用:static Get<T>(propName: string): T | undefined
  2. 例如:AppStorage.SetOrCreate('PropA', 47);
  3.      let value: number = AppStorage.Get('PropA'); // 47
复制代码
设置值—Set(‘PropA’, 47) ------(AppStorage存在key切非空乐成,反之false)

在AppStorage中设置propName对应属性的值。如果newValue的值和propName对应属性的值相同,即不需要做赋值使用,状态变量不会通知UI革新propName对应属性的值。
  1. 使用:static Set<T>(propName: string, newValue: T): boolean
  2. 例如:AppStorage.SetOrCreate('PropA', 48);
  3.      let res: boolean = AppStorage.Set('PropA', 47) // true
  4.      let res1: boolean = AppStorage.Set('PropB', 47) // false
复制代码
设置/创建值—SetOrCreate(‘simpleProp’, 121)------(AppStorage存在则设置,不存在则创建值)



  • 如果propName已经在AppStorage中存在,并且newValue和propName对应属性的值不同,则设置propName对应属性的值为newValue,否则状态变量不会通知UI革新propName对应属性的值。
  • 如果propName不存在,则创建propName属性,值为newValue。setOrCreate只可以创建单个AppStorage的键值对,如果想创建多个AppStorage键值对,可以多次调用此方法。
    1. 使用:static SetOrCreate<T>(propName: string, newValue: T): void
    2. 例如:AppStorage.SetOrCreate('simpleProp', 121);
    复制代码
删除值—Delete(‘PropB’)------(未被绑定的可以,反之不可以)



  • 在AppStorage中删除propName对应的属性。
  • 在AppStorage中删除该属性的前提是必须保证该属性没有订阅者。如果有订阅者,则返回false。删除乐成返回true。
  • 属性的订阅者为Link、Prop等接口绑定的propName,以及@StorageLink(‘propName’)和@StorageProp(‘propName’)。这就意味着如果自界说组件中使用@StorageLink(‘propName’)和@StorageProp(‘propName’)或者SubscribedAbstractProperty实例仍然对propName有同步关系,则该属性不能从AppStorage中删除。
    1. 使用:static Delete(propName: string): boolean
    2. 例如:AppStorage.SetOrCreate('PropA', 47);
    3.      AppStorage.Link('PropA');
    4.      let res: boolean = AppStorage.Delete('PropA'); // false, PropA still has a subscriber
    5.      AppStorage.SetOrCreate('PropB', 48);
    6.      let res1: boolean = AppStorage.Delete('PropB'); // true, PropB is deleted from AppStorage successfully
    复制代码
key参数列表—Keys()------(获取所有的属性名)

返回AppStorage中所有的属性名。
  1. 使用:static Keys(): IterableIterator<string>
  2. 例如:AppStorage.SetOrCreate('PropB', 48);
  3.      let keys: IterableIterator<string> = AppStorage.Keys()
复制代码
删除所有属性—clear()

扫除AppStorage的所有的属性。在AppStorage中扫除所有属性的前提是,已经没有任何订阅者。如果有,则什么都不做返回false;删除乐成返回true。
  1. 使用:static Clear(): boolean
  2. 例如:AppStorage.SetOrCreate('PropA', 47);
  3.      let res: boolean = AppStorage.Clear(); // true, there are no subscribers
复制代码
属性是否是可变—IsMutable(‘simpleProp’)

返回AppStorage中propName对应的属性是否是可变的。
  1. 使用:static IsMutable(propName: string): boolean
  2. 例如:AppStorage.SetOrCreate('PropA', 47);
  3.      let res: boolean = AppStorage.IsMutable('simpleProp');
复制代码
属性数量—Size()

返回AppStorage中的属性数量。
  1. 使用:static Size(): number
  2. 例如:AppStorage.SetOrCreate('PropB', 48);
  3.      let res: number = AppStorage.Size(); // 1
复制代码
LocalStorage(当前页面数据存储)

函数列表基本上同AppStorage,会少几个函数,当时参数值以及界说基本一致,唯一不同的就是相对应的数据的作用域不同。
SubscribedAbstractProperty(AppStorage/LocalStorage部分函数返回值对象)

取值—get()

读取从AppStorage/LocalStorage同步属性的数据。
  1. 使用:abstract get(): T
  2. 例如:AppStorage.SetOrCreate('PropA', 47);
  3.      let prop1 = AppStorage.Prop('PropA');   
  4.      prop1.get(); //  prop1.get()=47
复制代码
设置值—set(1)

设置AppStorage/LocalStorage同步属性的数据。
  1. 使用:abstract set(newValue: T): void
  2. 例如:AppStorage.SetOrCreate('PropA', 47);
  3.      let prop1 = AppStorage.Prop('PropA');
  4.      prop1.set(1); //  prop1.get()=1
复制代码
PersistentStorage(数据持久化存储)

使参数持久化存储—PersistProp(‘highScore’, ‘0’)

将AppStorage中key对应的属性持久化到文件中。该接口的调用通常在访问AppStorage之前(AppStorage先PersistProp后的话大概会导致持久化存储的值被覆盖掉)。
作用实在就是从持久化存储中取出上一次存储的值,同时设置到AppStorage中,持久化中没有的话会从AppStorage将值持久化,AppStorage也没有的话会使用默认值初始化两个位置
确定属性的类型和值的顺序如下:


  • 如果PersistentStorage文件中存在key对应的属性,在AppStorage中创建对应的propName,并用在PersistentStorage中找到的key的属性初始化;
  • 如果PersistentStorage文件中没有查询到key对应的属性,则在AppStorage中查找key对应的属性。如果找到key对应的属性,则将该属性持久化;
  • 如果AppStorage也没查找到key对应的属性,则在AppStorage中创建key对应的属性。用defaultValue初始化其值,并将该属性持久化。
根据上述的初始化流程,如果AppStorage中有该属性,则会使用其值,覆盖掉PersistentStorage文件中的值。由于AppStorage是内存内数据,该行为会导致数据丧失持久化本领。示例请参考在PersistentStorage之前访问AppStorage中的属性。
AppStorage的属性向PersistentStorage中持久化的允许的类型是:


  • number,string,boolean,enum基础类型。
  • Object中可序列化的属性。
  • 不允许undefined和null。
    1. 使用:static PersistProp<T>(key: string, defaultValue: T): void
    2. 例如:PersistentStorage.PersistProp('highScore', '0');
    复制代码
删除指定参数持久化存储—DeleteProp(‘highScore’)

PersistProp的逆向使用。将key对应的属性从PersistentStorage删除,后续AppStorage的使用,对PersistentStorage不会再有影响。
  1. 使用:static DeleteProp(key: string): void
  2. 例如:PersistentStorage.DeleteProp('highScore');
复制代码
多条数据持久化存储—PersistProps([{},{}])

行为和PersistProp类似,不同在于可以一次性持久化多个数据,得当在应用启动的时间初始化。
  1. 使用:static PersistProps(properties: {key: string, defaultValue: any;}[]): void
  2. 例如:PersistentStorage.PersistProps([{ key: 'highScore', defaultValue: '0' }, { key: 'wightScore', defaultValue: '1' }]);
复制代码
返回所有持久化属性的key----keys()

返回所有持久化属性的key的数组。
  1. 使用:static Keys(): Array<string>
  2. 例如:let keys: Array<string> = PersistentStorage.Keys();
复制代码
Environment(设备环境信息)

将Environment的内置环境变量key存入AppStorage中—EnvProp(‘accessibilityEnabled’, ‘default’)



  • 将Environment的内置环境变量key存入AppStorage中。如果体系中未查询到Environment环境变量key的值,则使用默认值value,存入乐成,返回true。如果AppStorage已经有对应的key,则返回false。
  • 以是发起在程序启动的时间调用该接口。
  • 在没有调用EnvProp,就使用AppStorage读取环境变量是错误的。
    使用:static EnvProp(key: string, value: S): boolean
    例如:Environment.EnvProp(‘accessibilityEnabled’, ‘default’);
内置环境变量说明

key类型说明accessibilityEnabledstring无障碍屏幕朗读是否启用colorModeColorMode深淡色模式,可选值为:
- ColorMode.LIGHT:淡色模式;
- ColorMode.DARK:深色模式。fontScalenumber字体大小比例fontWeightScalenumber字重比例layoutDirectionLayoutDirection结构方向类型,可选值为:
- LayoutDirection.LTR:从左到右;
- LayoutDirection.RTL:从右到左。languageCodestring当前体系语言,小写字母,例如zh 将内置环境变量组存到AppStorage中—EnvProps([{},{}])

和EnvProp类似,不同点在于参数为数组,可以一次性初始化多个数据。发起在应用启动时调用,将体系环境变量批量存入AppStorage中。
  1. 使用:static EnvProps(props: {key: string; defaultValue: any;}[]): void
  2. 例如:Environment.EnvProps([{ key: 'accessibilityEnabled', defaultValue: 'default' }, { key: 'languageCode', defaultValue: 'en'}, { key: 'prop', defaultValue: 'hhhh' }]);
复制代码
属性key的数组—keys()

返回环境变量的属性key的数组。
  1. 使用:static Keys(): Array<string>
  2. 例如:Environment.EnvProps([{ key: 'accessibilityEnabled', defaultValue: 'default' }, { key: 'languageCode', defaultValue: 'en' }, { key: 'prop', defaultValue: 'hhhh' }]);
  3.      let keys: Array<string> = Environment.Keys(); // accessibilityEnabled, languageCode, prop
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表