赞
踩
Stage模型与FA模型最大的区别在于: Stage模型中,多个应用组件共享同一个ArkTS引擎实例;而FA模型中,每个应用组件独享一个ArkTS引擎实例。因此在Stage模型中,应用组件之间可以方便的共享对象和状态,同时减少复杂应用运行对内存的占用。Stage模型作为主推的应用模型,开发者通过它能够更加便利地开发出分布式场景下的复杂应用。
一个应用包含一个或者多个Module,可以在DevEco Studio工程中创建一个或者多个Module
Module是HarmonyOS应用/服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/服务配置文件,每一个Module都可以独立进行编译和运行。Module分为“Ability”和“Library”两种类型
“Ability”类型的Module对应于编译后的HAP。
1、开发者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件,即HAP。HAP是HarmonyOS应用安装的基本单位,包含了编译后的代码、资源、三方库及配置文件。HAP可分为Entry和Feature两种类型。
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等文件。
“Library”类型的Module对应于HAR
“Library”类型的Module对应于HAR(Harmony Archive),或者HSP(Harmony Shared Package)。
为开发者提供4种像素单位,框架采用vp为基准数据单位。
PS:个人建议使用lpx,配置好配置文件,这里就可以按照UI设计稿实际的来,可以更好的实现设计效果
名称 | 描述 |
---|---|
px | 屏幕物理像素单位 |
vp | 屏幕密度相关像素,根据屏幕像素密度转换为屏幕物理像素,当数值不带单位时,默认单位vp。在实际宽度为1440物理像素的屏幕上,1vp约等于3px。 |
fp | 字体像素,与vp类似适用屏幕密度变化,随系统字体大小设置变化。 |
lpx | 视窗逻辑像素单位,lpx单位为实际屏幕宽度与逻辑宽度(通过designWidth配置)的比值,designWidth默认值为720。当designWidth为720时,在实际宽度为1440物理像素的屏幕上,1lpx为2px大小。 |
提供其他单位与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为单位的数值 |
例如:
// xxx.ets @Entry @Component struct Example { build() { Column() { Flex({ wrap: FlexWrap.Wrap }) { Column() { Text("width(220)") .width(220) .height(40) .backgroundColor(0xF9CF93) .textAlign(TextAlign.Center) .fontColor(Color.White) .fontSize('12vp') }.margin(5) Column() { Text("width('220px')") .width('220px') .height(40) .backgroundColor(0xF9CF93) .textAlign(TextAlign.Center) .fontColor(Color.White) }.margin(5) Column() { Text("width('220vp')") .width('220vp') .height(40) .backgroundColor(0xF9CF93) .textAlign(TextAlign.Center) .fontColor(Color.White) .fontSize('12vp') }.margin(5) Column() { Text("width('220lpx') designWidth:720") .width('220lpx') .height(40) .backgroundColor(0xF9CF93) .textAlign(TextAlign.Center) .fontColor(Color.White) .fontSize('12vp') }.margin(5) Column() { Text("width(vp2px(220) + 'px')") .width(vp2px(220) + 'px') .height(40) .backgroundColor(0xF9CF93) .textAlign(TextAlign.Center) .fontColor(Color.White) .fontSize('12vp') }.margin(5) Column() { Text("fontSize('12fp')") .width(220) .height(40) .backgroundColor(0xF9CF93) .textAlign(TextAlign.Center) .fontColor(Color.White) .fontSize('12fp') }.margin(5) Column() { Text("width(px2vp(220))") .width(px2vp(220)) .height(40) .backgroundColor(0xF9CF93) .textAlign(TextAlign.Center) .fontColor(Color.White) .fontSize('12fp') }.margin(5) }.width('100%') } } }
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-appendix-enums-0000001478061741-V3
太多了,不一一列举了,先浏览一遍,用的时候在查吧。
其实这个东西和安卓的Activity意义差不多,就是提供一个和用户交互的窗口,而**AbilitySlice**其实就是相当于fragment,一个Page里面可以有多个AbilitySlice就是相当于一个Activity中有多个fragment,都是有独立的生命周期。
对应两个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、*onStartContinuation()*:Page请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移。
2、*onSaveData()*:如果onStartContinuation()返回true,则系统回调此方法,开发者在此回调中保存必须传递到另外设备上以便恢复Page状态的数据。
3、*onRestoreData()*:源侧设备上Page完成保存数据后,系统在目标侧设备上回调此方法,开发者在此回调中接受用于恢复Page状态的数据。注意,在目标侧设备上的Page会重新启动其生命周期,无论其启动模式如何配置。且系统回调此方法的时机在onStart()之前。
4、onCompleteContinuation()*:目标侧设备上恢复数据一旦完成,系统就会在源侧设备上回调Page的此方法,以便通知应用迁移流程已结束。开发者可以在此检查迁移结果是否成功,并在此处理迁移结束的动作,例如,应用可以在迁移完成后终止自身生命周期。
5、*onRemoteTerminated()*:如果开发者使用continueAbilityReversibly()而不是continueAbility(),则此后可以在源侧设备上使用reverseContinueAbility()进行回迁。这种场景下,相当于同一个Page(的两个实例)同时在两个设备上运行,迁移完成后,如果目标侧设备上Page因任何原因终止,则源侧Page通过此回调接收终止通知。
请求迁移:实现IAbilityContinuation的Page可以在其生命周期内,调用continueAbility()或continueAbilityReversibly()请求迁移。两者的区别是,通过后者发起的迁移此后可以进行回迁。
请求回迁:使用continueAbilityReversibly()请求迁移并完成后,源侧设备上已迁移的Page可以发起回迁,以便使用户活动重新回到此设备。(reverseContinueAbility())
基于Service模板的Ability(以下简称“Service”)主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行。
onStart()
该方法在创建Service的时候调用,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Intent应为空。
onCommand()
在Service创建完成之后调用,该方法在客户端每次启动该Service时都会调用,用户可以在该方法中做一些调用统计、初始化类的操作。
onConnect()
在Ability和Service连接时调用,该方法返回IRemoteObject对象,用户可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。
onDisconnect()
在Ability与绑定的Service断开连接时调用。
onStop()
在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来创建自定义的实现类
组件被点击时触发的事件。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-click-0000001477981153-V3
例如:
// xxx.ets @Entry @Component struct ClickExample { @State text: string = '' build() { Column() { Row({ space: 20 }) { Button('Click').width(100).height(40) .onClick((event: ClickEvent) => { this.text = 'Click Point:' + '\n screenX:' + event.screenX + '\n screenY:' + event.screenY + '\n x:' + event.x + '\n y:' + event.y + '\ntarget:' + '\n component globalPos:(' + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\n width:' + event.target.area.width + '\n height:' + event.target.area.height + '\ntimestamp' + event.timestamp; }) Button('Click').width(200).height(50) .onClick((event: ClickEvent) => { this.text = 'Click Point:' + '\n screenX:' + event.screenX + '\n screenY:' + event.screenY + '\n x:' + event.x + '\n y:' + event.y + '\ntarget:' + '\n component globalPos:(' + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\n width:' + event.target.area.width + '\n height:' + event.target.area.height + '\ntimestamp' + event.timestamp; }) }.margin(20) Text(this.text).margin(15) }.width('100%') } }
当手指在组件上按下、滑动、抬起时触发。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-touch-0000001427902424-V3
例如:
// xxx.ets @Entry @Component struct TouchExample { @State text: string = '' @State eventType: string = '' build() { Column() { Button('Touch').height(40).width(100) .onTouch((event: TouchEvent) => { if (event.type === TouchType.Down) { this.eventType = 'Down' } if (event.type === TouchType.Up) { this.eventType = 'Up' } if (event.type === TouchType.Move) { this.eventType = 'Move' } this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: ' + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:(' + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:' + event.target.area.width + '\nheight:' + event.target.area.height }) Button('Touch').height(50).width(200).margin(20) .onTouch((event: TouchEvent) => { if (event.type === TouchType.Down) { this.eventType = 'Down' } if (event.type === TouchType.Up) { this.eventType = 'Up' } if (event.type === TouchType.Move) { this.eventType = 'Move' } this.text = 'TouchType:' + this.eventType + '\nDistance between touch point and touch element:\nx: ' + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:(' + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:' + event.target.area.width + '\nheight:' + event.target.area.height }) Text(this.text) }.width('100%').padding(30) } }
挂载卸载事件指组件从组件树上挂载、卸载时触发的事件。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-show-hide-0000001428061696-V3
例如:
// xxx.ets import promptAction from '@ohos.promptAction' @Entry @Component struct AppearExample { @State isShow: boolean = true @State changeAppear: string = '点我卸载挂载组件' private myText: string = 'Text for onAppear' build() { Column() { Button(this.changeAppear) .onClick(() => { this.isShow = !this.isShow }).margin(15) if (this.isShow) { Text(this.myText).fontSize(26).fontWeight(FontWeight.Bold) .onAppear(() => { promptAction.showToast({ message: 'The text is shown', duration: 2000 }) }) .onDisAppear(() => { promptAction.showToast({ message: 'The text is hidden', duration: 2000 }) }) } }.padding(30).width('100%') } }
拖拽事件指组件被长按后拖拽时触发的事件。
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) | 绑定此事件的组件可作为拖拽释放目标,当在本组件范围内停止拖拽行为时,触发回调 |
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-events-key-0000001427744780-V3
按键事件指组件与键盘、遥控器等按键设备交互时触发的事件,适用于所有可获焦组件,例如Button。对于Text,Image等默认不可获焦的组件,可以设置focusable属性为true后使用按键事件。
例如:
// xxx.ets @Entry @Component struct KeyEventExample { @State text: string = '' @State eventType: string = '' build() { Column() { Button('KeyEvent') .onKeyEvent((event: KeyEvent) => { if (event.type === KeyType.Down) { this.eventType = 'Down' } if (event.type === KeyType.Up) { this.eventType = 'Up' } this.text = 'KeyType:' + this.eventType + '\nkeyCode:' + event.keyCode + '\nkeyText:' + event.keyText }) Text(this.text).padding(15) }.height(300).width('100%').padding(35) } }
焦点事件指页面焦点在可获焦组件间移动时触发的事件,组件可使用焦点事件来处理相关逻辑。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-focus-event-0000001478181373-V3
例如:
// xxx.ets @Entry @Component struct FocusEventExample { @State oneButtonColor: string = '#FFC0CB' @State twoButtonColor: string = '#87CEFA' @State threeButtonColor: string = '#90EE90' build() { Column({ space: 20 }) { // 通过外接键盘的上下键可以让焦点在三个按钮间移动,按钮获焦时颜色变化,失焦时变回原背景色 Button('First Button') .backgroundColor(this.oneButtonColor) .width(260) .height(70) .fontColor(Color.Black) .focusable(true) .onFocus(() => { this.oneButtonColor = '#FF0000' }) .onBlur(() => { this.oneButtonColor = '#FFC0CB' }) Button('Second Button') .backgroundColor(this.twoButtonColor) .width(260) .height(70) .fontColor(Color.Black) .focusable(true) .onFocus(() => { this.twoButtonColor = '#FF0000' }) .onBlur(() => { this.twoButtonColor = '#87CEFA' }) Button('Third Button') .backgroundColor(this.threeButtonColor) .width(260) .height(70) .fontColor(Color.Black) .focusable(true) .onFocus(() => { this.threeButtonColor = '#FF0000' }) .onBlur(() => { this.threeButtonColor = '#90EE90' }) }.width('100%').margin({ top: 20 }) } }
在鼠标的单个动作触发多个事件时,事件的顺序是固定的,鼠标事件默认透传。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-mouse-key-0000001478341101-V3
例如:
// xxx.ets @Entry @Component struct MouseEventExample { @State hoverText: string = 'no hover'; @State mouseText: string = ''; @State action: string = ''; @State mouseBtn: string = ''; @State color: Color = Color.Blue; build() { Column({ space: 20 }) { Button(this.hoverText) .width(180).height(80) .backgroundColor(this.color) .onHover((isHover: boolean) => { // 通过onHover事件动态修改按钮在是否有鼠标悬浮时的文本内容与背景颜色 if (isHover) { this.hoverText = 'hover'; this.color = Color.Pink; } else { this.hoverText = 'no hover'; this.color = Color.Blue; } }) Button('onMouse') .width(180).height(80) .onMouse((event: MouseEvent) => { switch (event.button) { case MouseButton.None: this.mouseBtn = 'None'; break; case MouseButton.Left: this.mouseBtn = 'Left'; break; case MouseButton.Right: this.mouseBtn = 'Right'; break; case MouseButton.Back: this.mouseBtn = 'Back'; break; case MouseButton.Forward: this.mouseBtn = 'Forward'; break; case MouseButton.Middle: this.mouseBtn = 'Middle'; break; } switch (event.action) { case MouseAction.Hover: this.action = 'Hover'; break; case MouseAction.Press: this.action = 'Press'; break; case MouseAction.Move: this.action = 'Move'; break; case MouseAction.Release: this.action = 'Release'; break; } this.mouseText = 'onMouse:\nButton = ' + this.mouseBtn + '\nAction = ' + this.action + '\nXY=(' + event.x + ',' + event.y + ')' + '\nscreenXY=(' + event.screenX + ',' + event.screenY + ')'; }) Text(this.mouseText) }.padding({ top: 30 }).width('100%') } }
鼠标悬浮时改变文本内容与背景颜色:
鼠标点击时:
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-component-area-change-event-0000001478061665-V3
组件区域变化事件指组件显示的尺寸、位置等发生变化时触发的事件。
例如:
// xxx.ets @Entry @Component struct AreaExample { @State value: string = 'Text' @State sizeValue: string = '' build() { Column() { Text(this.value) .backgroundColor(Color.Green).margin(30).fontSize(20) .onClick(() => { this.value = this.value + 'Text' }) .onAreaChange((oldValue: Area, newValue: Area) => { console.info(`Ace: on area change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`) this.sizeValue = JSON.stringify(newValue) }) Text('new area is: \n' + this.sizeValue).margin({ right: 30, left: 30 }) } .width('100%').height('100%').margin({ top: 30 }) } }
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-component-visible-area-change-event-0000001477981161-V3
组件可见区域变化事件是组件在屏幕中的显示区域面积变化时触发的事件,提供了判断组件是否完全或部分显示在屏幕中的能力,适用于广告曝光埋点之类的场景。
例如:
// xxx.ets @Entry @Component struct ScrollExample { scroller: Scroller = new Scroller() private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] @State testTextStr: string = 'test' @State testRowStr: string = 'test' build() { Column() { Column() { Text(this.testTextStr) .fontSize(20) Text(this.testRowStr) .fontSize(20) } .height(100) .backgroundColor(Color.Gray) .opacity(0.3) Scroll(this.scroller) { Column() { Text("Test Text Visible Change") .fontSize(20) .height(200) .margin({ top: 50, bottom: 20 }) .backgroundColor(Color.Green) // 通过设置ratios为[0.0, 1.0],实现当组件完全显示或完全消失在屏幕中时触发回调 .onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => { console.info('Test Text isVisible: ' + isVisible + ', currentRatio:' + currentRatio) if (isVisible && currentRatio >= 1.0) { console.info('Test Text is fully visible. currentRatio:' + currentRatio) this.testTextStr = 'Test Text is fully visible' } if (!isVisible && currentRatio <= 0.0) { console.info('Test Text is completely invisible.') this.testTextStr = 'Test Text is completely invisible' } }) Row() { Text('Test Row Visible Change') .fontSize(20) .margin({ bottom: 20 }) } .height(200) .backgroundColor(Color.Yellow) .onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => { console.info('Test Row isVisible:' + isVisible + ', currentRatio:' + currentRatio) if (isVisible && currentRatio >= 1.0) { console.info('Test Row is fully visible.') this.testRowStr = 'Test Row is fully visible' } if (!isVisible && currentRatio <= 0.0) { console.info('Test Row is is completely invisible.') this.testRowStr = 'Test Row is is completely invisible' } }) ForEach(this.arr, (item) => { Text(item.toString()) .width('90%') .height(150) .backgroundColor(0xFFFFFF) .borderRadius(15) .fontSize(16) .textAlign(TextAlign.Center) .margin({ top: 10 }) }, item => item) }.width('100%') } .backgroundColor(0x317aff) .scrollable(ScrollDirection.Vertical) .scrollBar(BarState.On) .scrollBarColor(Color.Gray) .scrollBarWidth(10) .onScroll((xOffset: number, yOffset: number) => { console.info(xOffset + ' ' + yOffset) }) .onScrollEdge((side: Edge) => { console.info('To the edge') }) .onScrollEnd(() => { console.info('Scroll Stop') }) }.width('100%').height('100%').backgroundColor(0xDCDCDC) } }
缺省时使用元素自身内容需要的宽度。若子组件的宽大于父组件的宽,则会画出父组件的范围。
单位:vp
缺省时使用元素自身内容需要的高度。若子组件的高大于父组件的高,则会画出父组件的范围。
单位:vp
单位:vp
参数为Length类型时,四个方向内边距同时生效。
默认值:0
单位:vp
padding设置百分比时,上下左右内边距均以父容器的width作为基础值。
参数为Length类型时,四个方向外边距同时生效。
默认值:0
单位:vp
margin设置百分比时,上下左右外边距均以父容器的width作为基础值。
父容器尺寸确定时,设置了layoutWeight属性的子元素与兄弟元素占主轴尺寸按照权重进行分配,忽略元素本身尺寸设置,表示自适应占满剩余空间。
默认值:0
说明:
仅在Row/Column/Flex布局中生效。
可选值为大于等于0的数字,或者可以转换为数字的字符串。
constraintSize的优先级高于Width和Height。若设置的minWidth大于maxWidth,则minWidth生效,minHeight与maxHeight同理。
默认值:
{
minWidth: 0,
maxWidth: Infinity,
minHeight: 0,
maxHeight: Infinity
}
默认值:Alignment.Center
默认值:Direction.Auto
在布局容器中,设置该属性不影响父容器布局,仅在绘制时进行位置调整。
适用于置顶显示、悬浮按钮等组件在父容器中位置固定的场景。
通常配合position和offset属性使用,单独使用时,效果类似offset
默认值:{x: 0,y: 0}
设置该属性,不影响父容器布局,仅在绘制时进行位置调整。
默认值:{x: 0,y: 0}
指定当前组件的宽高比,aspectRatio = width/height。
当父容器空间不足时,低优先级的组件会被隐藏。
小数点后的数字不作优先级区分,即区间为[x, x + 1)内的数字视为相同优先级。例如:1.0与1.9为同一优先级。
图1 竖屏显示
图2 横屏显示
横屏显示
默认值:‘auto’(表示组件在主轴方向上的基准尺寸为组件原本的大小)。
不支持百分比设置
默认值:0
父容器为Row、Column时,默认值:0
父容器为flex时,默认值:1
默认值:ItemAlign.Auto
说明:
边框宽度默认值为0,即不显示边框。
默认值:BorderStyle.Solid
默认值:Color.Black
src:图片地址,支持网络图片资源和本地图片资源地址(不支持svg类型的图片)。
repeat:设置背景图片的重复样式,默认不重复。当设置的背景图片为透明底色图片,且同时设置了backgroundColor时,二者叠加显示,背景颜色在最底部。
设置背景图像的高度和宽度。当输入为{width: Length, height: Length}对象时,如果只设置一个属性,则第二个属性保持图片原始宽高比进行调整。默认保持原图的比例不变。
width和height取值范围: [0, +∞)
默认值:ImageSize.Auto
说明:
设置为小于0的值时,按值为0显示。当设置了height未设置width时,width根据图片原始宽高比进行调整。
默认值:{x: 0,y: 0}
x和y值设置百分比时,偏移量是相对组件自身宽高计算的。
取值范围为0到1,1表示不透明,0表示完全透明, 达到隐藏组件效果,但是在布局中占位。
说明:
子组件可以继承父组件的此属性。默认值:1
根据具体场景需要可使用条件渲染代替。
默认值:Visibility.Visible
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-enable-0000001427584828-V3
组件是否可交互,可交互状态下响应点击事件、触摸事件、拖拽事件、按键事件、焦点事件和鼠标事件。
值为true表示组件可交互,响应点击等操作。
值为false表示组件不可交互,不响应点击等操作。
默认值:true
value: 遮罩文本内容。
options: 文本定位,align设置文本相对于组件的方位,offset为文本基于自身左上角的偏移量。文本默认处于组件左上角。
两者都设置时效果重叠,文本相对于组件方位定位后再基于当前位置文本的左上角进行偏移。
默认值:options:{align: Alignment.TopStart,offset: { x: 0, y: 0}}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-z-order-0000001478181381-V3
组件的Z序,设置组件的堆叠顺序。
zIndex值越大,显示层级越高,即zIndex值大的组件会覆盖在zIndex值小的组件上方
Stack容器内子组件不设置zIndex的效果
Stack容器子组件设置zIndex后效果
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-transformation-0000001478341109-V3
用于对组件进行旋转、平移、缩放、矩阵变换等操作。
其中,(x, y, z)指定一个矢量,作为旋转轴。
旋转轴和旋转中心点都基于坐标系设定,组件发生位移时,坐标系不会随之移动。
默认值:{x: 0,y: 0,z: 0,centerX: ‘50%’,centerY: ‘50%’}
其中,x,y,z的值分别表示在对应轴移动的距离,值为正时表示向对应轴的正向移动,值为负时表示向对应轴的反向移动。移动距离支持数字和字符串(比如’10px’,‘10%’)两种类型。
默认值:{x: 0,y: 0,z: 0}
默认值为1,同时可以通过centerX和centerY设置缩放的中心点。
默认值:{x: 1,y: 1,z: 1,centerX:‘50%’,centerY:‘50%’}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-image-effect-0000001478061673-V3
设置组件的模糊,阴影效果以及设置图片的图像效果。
取值范围:[0, +∞)
取值范围:[0, +∞)
入参为模糊半径(必填)、阴影的颜色(可选,默认为灰色)、X轴的偏移量(可选,默认为0),Y轴的偏移量(可选,默认为0),偏移量单位为px
值定义为灰度转换的比例,入参1.0则完全转为灰度图像,入参则0.0图像无变化,入参在0.0和1.0之间时,效果呈线性变化。(百分比)
取值范围:[0, 1]
说明:
设置小于0的值时,按值为0处理,设置大于1的值时,按值为1处理。
入参为高光比例,值为1时没有效果,小于1时亮度变暗,0为全黑,大于1时亮度增加,数值越大亮度越大。
取值范围:[0, +∞)
说明:
设置小于0的值时,按值为0处理。
饱和度为颜色中的含色成分和消色成分(灰)的比例,入参为1时,显示原图像,大于1时含色成分越大,饱和度越大;小于1时消色成分越大,饱和度越小。(百分比)
入参为对比度的值。值为1时,显示原图,大于1时,值越大对比度越高,图像越清晰醒目,小于1时,值越小对比度越低,当对比度为0时,图像变为全灰。(百分比)
取值范围:[0, +∞)
说明:
设置小于0的值时,按值为0处理。
入参为图像反转的比例,值为1时完全反转,值为0则图像无变化。(百分比)
取值范围:[0, 1]
说明:
设置小于0的值时,按值为0处理。
入参为图像反转的比例。值为1则完全是深褐色的,值为0图像无变化。 (百分比)
取值范围:(-∞, +∞)
说明:
色调旋转360度会显示原始颜色。先将色调旋转180 度,然后再旋转-180度会显示原始颜色。数据类型为number时,值为90和’90deg’效果一致。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-sharp-clipping-0000001477981173-V3
用于对组件进行裁剪、遮罩处理。
默认值:false
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-text-style-0000001427902436-V3
针对包含文本元素的组件,设置文本样式。
Length为number类型时,使用fp单位。字体默认大小16。不支持设置百分比字符串。
默认值:FontStyle.Normal
number类型取值[100, 900],取值间隔为100,默认为400,取值越大,字体越粗。string类型仅支持number类型取值的字符串形式,例如"400",以及"bold"、“bolder”、“lighter”、“regular”、“medium”,分别对应FontWeight中相应的枚举值。
默认值:FontWeight.Normal
默认字体’HarmonyOS Sans’,当前支持’HarmonyOS Sans’字体和注册自定义字体。
设置值不大于0时,不限制文本行高,自适应字体大小,Length为number类型时单位为fp。
默认值:{type: TextDecorationType.None,color:Color.Black}
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-grid-0000001428061712-V3
栅格布局的列宽、列间距由距离最近的GridContainer父组件决定。使用栅格属性的组件树上至少需要有1个GridContainer容器组件。
指useSizeType属性没有设置对应尺寸的列数(span)时,占用的栅格列数。
说明:
设置了栅格span属性,组件的宽度由栅格布局决定。
默认值:1
指useSizeType属性没有设置对应尺寸的偏移(offset)时, 当前组件沿着父组件Start方向,偏移的列数,也就是当前组件位于第n列。
说明:
默认值:0
图1 设备宽度为SM
图2 设备宽度为MD
图3 设备宽度为LG
图4 单独设置gridSpan和gridOffset在特定屏幕大小下的效果与useSizeType效果一致
从API version 9开始,该接口支持在ArkTS卡片中使用。
说明:
设置为小于0的值时,按值为0处理。设置为大于360的值时,按值为360处理。当start、end、rotation的数据类型为string,值为"90"或"90%",与90效果一致。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-popup-0000001427744792-V3
给组件绑定popup弹窗,并设置弹窗内容,交互逻辑和显示状态。
show: 弹窗显示状态,默认值为false,隐藏弹窗。popup弹窗必须等待页面全部构建完成才能展示,因此show不能在页面构建中设置为true,否则会导致popup弹窗显示位置及形状错误。
popup: 配置当前弹窗提示的参数。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-menu-0000001478181385-V3
为组件绑定弹出式菜单,弹出式菜单以垂直列表形式显示菜单项,可通过长按、点击或鼠标右键触发。
弹出菜单项支持文本和自定义两种功能。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-focus-0000001478061677-V3
自定义组件的走焦效果,可设置组件是否走焦和具体的走焦顺序,tab键或者方向键切换焦点。
存在默认交互逻辑的组件例如Button、TextInput等,默认即为可获焦,Text、Image等组件则默认状态为不可获焦。不可获焦状态下,无法触发焦点事件。
若有配置了tabIndex大于0的组件,则tab键走焦只会在tabIndex大于0的组件内按照tabIndex的值从小到大并循环依次走焦。若没有配置tabIndex大于0的组件,则tabIndex等于0的组件按照组件预设的走焦规则走焦。
默认值:0
默认值:false
默认值:false
说明: 必须与tabIndex联合使用,当某个容器设置了tabIndex,且容器内某子组件设置了groupDefaultFocus,当该容器首次获焦时,会自动将焦点转移至该组件上。
默认值:false
说明: 仅在组件可点击时才能正常获取焦点。
首次按下TAB键,焦点切换到defaultFocus绑定的组件上:
第二次按TAB键,焦点切换到tabIndex(1)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:
第三次按TAB键,焦点切换到tabIndex(2)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:
第四次按TAB键,焦点切换到tabIndex(3)的容器上,且自动走到其内部的groupDefaultFocus绑定的组件上:
点击绑定了focusOnTouch的组件,组件自身获焦:
按下TAB键,激活焦点态显示。申请不存在的组件获焦:
申请不可获焦的组件获焦:
申请存在且可获焦的组件获焦:
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-hover-effect-0000001477981177-V3
设置组件的鼠标悬浮态显示效果。
默认值:HoverEffect.Auto
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-component-id-0000001427902440-V3
id为组件的唯一标识,在整个应用内唯一。本模块提供组件标识相关接口,可以获取指定id组件的属性,也提供向指定id组件发送事件的功能。
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-touch-target-0000001428061716-V3
适用于支持通用点击事件、通用触摸事件、通用手势处理的组件。
默认触摸热区为整个组件,默认值:{x:0,y:0,width:‘100%’,height:‘100%’}
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。
默认值: HitTestMode.Default
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-restoreid-0000001478341121-V3
组件的分布式迁移标识,指明了该组件在分布式迁移场景下可以将特定状态恢复到对端设备。
同一个应用中各个支持分布式迁移组件的Id必须不同。
默认值:true
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-gesture-settings-0000001477981181-V3
为组件绑定不同类型的手势事件,并设置事件的响应方法。
1、默认情况下,子组件优先识别通过gesture绑定的手势,当父组件配置priorityGesture时,父组件优先识别priorityGesture绑定的手势。
2、长按手势时,设置触发长按的最短时间小的组件会优先响应,会忽略priorityGesture设置。
手势事件为非冒泡事件。父组件设置parallelGesture时,父子组件相同的手势事件都可以触发,实现类似冒泡效果。若父子组件中同时绑定单击手势事件和双击手势事件,则只响应单击手势事件。
例如:
// xxx.ets @Entry @Component struct GestureSettingsExample { @State priorityTestValue: string = '' @State parallelTestValue: string = '' build() { Column() { Column() { Text('TapGesture:' + this.priorityTestValue).fontSize(28) .gesture( TapGesture() .onAction(() => { this.priorityTestValue += '\nText' })) } .height(200) .width(250) .padding(20) .margin(20) .border({ width: 3 }) // 设置为priorityGesture时,点击文本会忽略Text组件的TapGesture手势事件,优先识别父组件Column的TapGesture手势事件 .priorityGesture( TapGesture() .onAction((event: GestureEvent) => { this.priorityTestValue += '\nColumn' }), GestureMask.IgnoreInternal) Column() { Text('TapGesture:' + this.parallelTestValue).fontSize(28) .gesture( TapGesture() .onAction(() => { this.parallelTestValue += '\nText' })) } .height(200) .width(250) .padding(20) .margin(20) .border({ width: 3 }) // 设置为parallelGesture时,点击文本会同时触发子组件Text与父组件Column的TapGesture手势事件 .parallelGesture( TapGesture() .onAction((event: GestureEvent) => { this.parallelTestValue += '\nColumn' }), GestureMask.Normal) } } }
使用:TapGesture(value?: { count?: number, fingers?: number })
例如: Text('Click twice').fontSize(28)
.gesture(
TapGesture({ count: 2 })
.onAction((event: GestureEvent) => {
this.value = JSON.stringify(event.fingerList[0])
})
)
使用:LongPressGesture(value?: { fingers?: number, repeat?: boolean, duration?: number }) 例如:Text('LongPress onAction:' + this.count).fontSize(28) // 单指长按文本触发该手势事件 .gesture( LongPressGesture({ repeat: true }) // 由于repeat设置为true,长按动作存在时会连续触发,触发间隔为duration(默认值500ms) .onAction((event: GestureEvent) => { if (event.repeat) { this.count++ } }) // 长按动作一结束触发 .onActionEnd(() => { this.count = 0 }) )
使用:PanGesture(value?: { fingers?: number; direction?: PanDirection; distance?: number } | PanGestureOptions) 例如:Column() { Text('PanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY) } .height(200) .width(300) .padding(20) .border({ width: 3 }) .margin(50) .translate({ x: this.offsetX, y: this.offsetY, z: 0 })// 以组件左上角为坐标原点进行移动 // 左右拖动触发该手势事件 .gesture( PanGesture(this.panOption) .onActionStart((event: GestureEvent) => { console.info('Pan start') }) .onActionUpdate((event: GestureEvent) => { this.offsetX = this.positionX + event.offsetX this.offsetY = this.positionY + event.offsetY }) .onActionEnd(() => { this.positionX = this.offsetX this.positionY = this.offsetY console.info('Pan end') })
向左拖动:
点击按钮修改PanGesture触发条件,双指向左下方拖动:
使用:PinchGesture(value?: { fingers?: number, distance?: number }) 例如:Column() { Text('PinchGesture scale:\n' + this.scaleValue) Text('PinchGesture center:\n(' + this.pinchX + ',' + this.pinchY + ')') } .height(200) .width(300) .padding(20) .border({ width: 3 }) .margin({ top: 100 }) .scale({ x: this.scaleValue, y: this.scaleValue, z: 1 }) // 三指捏合触发该手势事件 .gesture( PinchGesture({ fingers: 3 }) .onActionStart((event: GestureEvent) => { console.info('Pinch start') }) .onActionUpdate((event: GestureEvent) => { this.scaleValue = this.pinchValue * event.scale this.pinchX = event.pinchCenterX this.pinchY = event.pinchCenterY }) .onActionEnd(() => { this.pinchValue = this.scaleValue console.info('Pinch end') }) )
使用:RotationGesture(value?: { fingers?: number, angle?: number }) 例如:Column() { Text('RotationGesture angle:' + this.angle) } .height(200) .width(300) .padding(20) .border({ width: 3 }) .margin(80) .rotate({ angle: this.angle }) // 双指旋转触发该手势事件 .gesture( RotationGesture() .onActionStart((event: GestureEvent) => { console.info('Rotation start') }) .onActionUpdate((event: GestureEvent) => { this.angle = this.rotateValue + event.angle }) .onActionEnd(() => { this.rotateValue = this.angle console.info('Rotation end') }) )
使用:SwipeGesture(value?: { fingers?: number; direction?: SwipeDirection; speed?: number }) 例如:Column() { Text("SwipeGesture speed\n" + this.speed) Text("SwipeGesture angle\n" + this.rotateAngle) } .border({ width: 3 }) .width(300) .height(200) .margin(100) .rotate({ angle: this.rotateAngle }) // 单指竖直方向滑动时触发该事件 .gesture( SwipeGesture({ direction: SwipeDirection.Vertical }) .onAction((event: GestureEvent) => { this.speed = event.speed this.rotateAngle = event.angle }) )
使用:GestureGroup(mode: GestureMode, ...gesture: GestureType[]) 例如:olumn() { Text('sequence gesture\n' + 'LongPress onAction:' + this.count + '\nPanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY) .fontSize(15) } .translate({ x: this.offsetX, y: this.offsetY, z: 0 }) .height(150) .width(200) .padding(20) .margin(20) .border({ width: 3, style: this.borderStyles }) .gesture( // 以下组合手势为顺序识别,当长按手势事件未正常触发时则不会触发拖动手势事件 GestureGroup(GestureMode.Sequence, LongPressGesture({ repeat: true }) .onAction((event: GestureEvent) => { if (event.repeat) { this.count++ } console.info('LongPress onAction') }) .onActionEnd(() => { console.info('LongPress end') }), PanGesture() .onActionStart(() => { this.borderStyles = BorderStyle.Dashed console.info('pan start') }) .onActionUpdate((event: GestureEvent) => { this.offsetX = this.positionX + event.offsetX this.offsetY = this.positionY + event.offsetY console.info('pan update') }) .onActionEnd(() => { this.positionX = this.offsetX this.positionY = this.offsetY this.borderStyles = BorderStyle.Solid console.info('pan end') }) ) .onCancel(() => { console.info('sequence gesture canceled') })
按顺序首先触发长按事件:
按顺序首先触发长按事件,长按事件识别结束之后,其次触发拖动事件,向右下方拖动
https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/arkts-custom-component-lifecycle-0000001482395076-V3
自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。
aboutToAppear?(): void aboutToAppear函数在创建自定义组件的新实例后,在执行其build()函数之前执行。允许在aboutToAppear函数中改变状态变量,更改将在后续执行build()函数中生效。 aboutToDisappear?(): void aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。 onPageShow?(): void 页面每次显示时触发一次,包括路由过程、应用进入前台等场景,仅@Entry装饰的自定义组件生效。 onPageHide?(): void 页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景,仅@Entry装饰的自定义组件生效。 onBackPress?(): void 当用户点击返回按钮时触发,仅@Entry装饰的自定义组件生效。 onLayout?(children: Array<LayoutChild>, constraint: ConstraintSizeOptions): void 框架会在自定义组件布局时,将该自定义组件的子节点信息和自身的尺寸范围通过onLayout传递给该自定义组件。不允许在onLayout函数中改变状态变量。 onMeasure?(children: Array<LayoutChild>, constraint: ConstraintSizeOptions): void 框架会在自定义组件确定尺寸时,将该自定义组件的子节点信息和自身的尺寸范围通过onMeasure传递给该自定义组件。不允许在onMeasure函数中改变状态变量。
LayoutChild(子组件布局信息)
LayoutBorderInfo(子组件border信息)
LayoutInfo(子组件layout信息)
与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
与Link接口类似,如果给定的propName在AppStorage中存在,则返回该propName对应的属性的双向绑定数据。如果不存在,则使用defaultValue在AppStorage创建和初始化propName,返回其双向绑定数据。
使用:static SetAndLink<T>(propName: string, defaultValue: T): SubscribedAbstractProperty<T>
例如:AppStorage.SetOrCreate('PropA', 47);
let link1: SubscribedAbstractProperty<number> = AppStorage.SetAndLink('PropB', 49); // Create PropB 49
let link2: SubscribedAbstractProperty<number> = AppStorage.SetAndLink('PropA', 50); // PropA exists, remains 47
与AppStorage中对应的propName建立单向属性绑定。如果给定的propName在AppStorage中存在,则返回与AppStorage中propName对应属性的单向绑定数据。如果AppStorage中不存在propName,则返回undefined。单向绑定数据的修改不会被同步回AppStorage中。
使用:static Prop(propName: string): any
例如:AppStorage.SetOrCreate('PropA', 47);
let prop1 = AppStorage.Prop('PropA');
let prop2 = AppStorage.Prop('PropA');
prop1.set(1); // one-way sync: prop1.get()=1; but prop2.get() == 47
与Prop接口类似。如果给定的propName在AppStorage存在,则返回该propName对应的属性的单向绑定数据。如果不存在,则使用defaultValue在AppStorage创建和初始化propName对应的属性,返回其单向绑定数据。
使用:static SetAndProp<S>(propName: string, defaultValue: S): SubscribedAbstractProperty<S>
例如:AppStorage.SetOrCreate('PropA', 47);
let prop: SubscribedAbstractProperty<number> = AppStorage.SetAndProp('PropB', 49); // PropA -> 47, PropB -> 49
判断propName对应的属性是否在AppStorage中存在。
使用:static Has(propName: string): boolean
例如:AppStorage.Has('simpleProp');
获取propName在AppStorage中对应的属性。如果不存在返回undefined。
使用:static Get<T>(propName: string): T | undefined
例如:AppStorage.SetOrCreate('PropA', 47);
let value: number = AppStorage.Get('PropA'); // 47
在AppStorage中设置propName对应属性的值。如果newValue的值和propName对应属性的值相同,即不需要做赋值操作,状态变量不会通知UI刷新propName对应属性的值。
使用:static Set<T>(propName: string, newValue: T): boolean
例如:AppStorage.SetOrCreate('PropA', 48);
let res: boolean = AppStorage.Set('PropA', 47) // true
let res1: boolean = AppStorage.Set('PropB', 47) // false
如果propName已经在AppStorage中存在,并且newValue和propName对应属性的值不同,则设置propName对应属性的值为newValue,否则状态变量不会通知UI刷新propName对应属性的值。
如果propName不存在,则创建propName属性,值为newValue。setOrCreate只可以创建单个AppStorage的键值对,如果想创建多个AppStorage键值对,可以多次调用此方法。
使用:static SetOrCreate<T>(propName: string, newValue: T): void
例如:AppStorage.SetOrCreate('simpleProp', 121);
在AppStorage中删除propName对应的属性。
在AppStorage中删除该属性的前提是必须保证该属性没有订阅者。如果有订阅者,则返回false。删除成功返回true。
属性的订阅者为Link、Prop等接口绑定的propName,以及@StorageLink(‘propName’)和@StorageProp(‘propName’)。这就意味着如果自定义组件中使用@StorageLink(‘propName’)和@StorageProp(‘propName’)或者SubscribedAbstractProperty实例依旧对propName有同步关系,则该属性不能从AppStorage中删除。
使用:static Delete(propName: string): boolean
例如:AppStorage.SetOrCreate('PropA', 47);
AppStorage.Link('PropA');
let res: boolean = AppStorage.Delete('PropA'); // false, PropA still has a subscriber
AppStorage.SetOrCreate('PropB', 48);
let res1: boolean = AppStorage.Delete('PropB'); // true, PropB is deleted from AppStorage successfully
返回AppStorage中所有的属性名。
使用:static Keys(): IterableIterator<string>
例如:AppStorage.SetOrCreate('PropB', 48);
let keys: IterableIterator<string> = AppStorage.Keys()
清除AppStorage的所有的属性。在AppStorage中清除所有属性的前提是,已经没有任何订阅者。如果有,则什么都不做返回false;删除成功返回true。
使用:static Clear(): boolean
例如:AppStorage.SetOrCreate('PropA', 47);
let res: boolean = AppStorage.Clear(); // true, there are no subscribers
返回AppStorage中propName对应的属性是否是可变的。
使用:static IsMutable(propName: string): boolean
例如:AppStorage.SetOrCreate('PropA', 47);
let res: boolean = AppStorage.IsMutable('simpleProp');
返回AppStorage中的属性数量。
使用:static Size(): number
例如:AppStorage.SetOrCreate('PropB', 48);
let res: number = AppStorage.Size(); // 1
函数列表基本上同AppStorage,会少几个函数,当时参数值以及定义基本一致,唯一不同的就是相对应的数据的作用域不同。
读取从AppStorage/LocalStorage同步属性的数据。
使用:abstract get(): T
例如:AppStorage.SetOrCreate('PropA', 47);
let prop1 = AppStorage.Prop('PropA');
prop1.get(); // prop1.get()=47
设置AppStorage/LocalStorage同步属性的数据。
使用:abstract set(newValue: T): void
例如:AppStorage.SetOrCreate('PropA', 47);
let prop1 = AppStorage.Prop('PropA');
prop1.set(1); // prop1.get()=1
将AppStorage中key对应的属性持久化到文件中。该接口的调用通常在访问AppStorage之前(AppStorage先PersistProp后的话可能会导致持久化存储的值被覆盖掉)。
作用其实就是从持久化存储中取出上一次存储的值,同时设置到AppStorage中,持久化中没有的话会从AppStorage将值持久化,AppStorage也没有的话会使用默认值初始化两个位置
确定属性的类型和值的顺序如下:
根据上述的初始化流程,如果AppStorage中有该属性,则会使用其值,覆盖掉PersistentStorage文件中的值。由于AppStorage是内存内数据,该行为会导致数据丧失持久化能力。示例请参考在PersistentStorage之前访问AppStorage中的属性。
AppStorage的属性向PersistentStorage中持久化的允许的类型是:
number,string,boolean,enum基础类型。
Object中可序列化的属性。
不允许undefined和null。
使用:static PersistProp<T>(key: string, defaultValue: T): void
例如:PersistentStorage.PersistProp('highScore', '0');
PersistProp的逆向操作。将key对应的属性从PersistentStorage删除,后续AppStorage的操作,对PersistentStorage不会再有影响。
使用:static DeleteProp(key: string): void
例如:PersistentStorage.DeleteProp('highScore');
行为和PersistProp类似,不同在于可以一次性持久化多个数据,适合在应用启动的时候初始化。
使用:static PersistProps(properties: {key: string, defaultValue: any;}[]): void
例如:PersistentStorage.PersistProps([{ key: 'highScore', defaultValue: '0' }, { key: 'wightScore', defaultValue: '1' }]);
返回所有持久化属性的key的数组。
使用:static Keys(): Array<string>
例如:let keys: Array<string> = PersistentStorage.Keys();
将Environment的内置环境变量key存入AppStorage中。如果系统中未查询到Environment环境变量key的值,则使用默认值value,存入成功,返回true。如果AppStorage已经有对应的key,则返回false。
所以建议在程序启动的时候调用该接口。
在没有调用EnvProp,就使用AppStorage读取环境变量是错误的。
使用:static EnvProp(key: string, value: S): boolean
例如:Environment.EnvProp(‘accessibilityEnabled’, ‘default’);
key | 类型 | 说明 |
---|---|---|
accessibilityEnabled | string | 无障碍屏幕朗读是否启用 |
colorMode | ColorMode | 深浅色模式,可选值为: - ColorMode.LIGHT:浅色模式; - ColorMode.DARK:深色模式。 |
fontScale | number | 字体大小比例 |
fontWeightScale | number | 字重比例 |
layoutDirection | LayoutDirection | 布局方向类型,可选值为: - LayoutDirection.LTR:从左到右; - LayoutDirection.RTL:从右到左。 |
languageCode | string | 当前系统语言,小写字母,例如zh |
和EnvProp类似,不同点在于参数为数组,可以一次性初始化多个数据。建议在应用启动时调用,将系统环境变量批量存入AppStorage中。
使用:static EnvProps(props: {key: string; defaultValue: any;}[]): void
例如:Environment.EnvProps([{ key: 'accessibilityEnabled', defaultValue: 'default' }, { key: 'languageCode', defaultValue: 'en'}, { key: 'prop', defaultValue: 'hhhh' }]);
返回环境变量的属性key的数组。
使用:static Keys(): Array<string>
例如:Environment.EnvProps([{ key: 'accessibilityEnabled', defaultValue: 'default' }, { key: 'languageCode', defaultValue: 'en' }, { key: 'prop', defaultValue: 'hhhh' }]);
let keys: Array<string> = Environment.Keys(); // accessibilityEnabled, languageCode, prop
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。