harmony 鸿蒙ArkUI子系统Changelog
ArkUI子系统Changelog
cl.arkui.1 通用属性drawModifier接口变更
访问级别
公开接口
变更原因
当drawModifier接口参数从DrawModifier对象变为undefined时,实际生效的仍是原来的DrawModifier对象。开发者无法重置其值,这与通用属性接口的规范不符。
变更影响
此变更涉及应用适配。
变更前: drawModifier接口参数从DrawModifier对象变为undefined后,生效的仍旧是原来的DrawModifier对象。
变更后:drawModifier接口参数从DrawModifier对象变为undefined后,会将原来设置的值重置为undefined。
起始API Level
12
变更发生版本
从OpenHarmony SDK 6.0.1.2开始。
适配指导
变更前,this.modifier = undefined;不会清除组件上生效的DrawModifier对象,而变更后则会完成清除。因此,若想保持行为不变,需要注释或删除这一行代码。
import { drawing } from '@kit.ArkGraphics2D';
class MyFrontDrawModifier extends DrawModifier {
public scaleX: number = 1;
public scaleY: number = 1;
drawFront(context: DrawContext): void {
const brush = new drawing.Brush();
brush.setColor({
alpha: 255,
red: 0,
green: 0,
blue: 255
});
context.canvas.attachBrush(brush);
const halfWidth = context.size.width / 2;
const halfHeight = context.size.width / 2;
const radiusScale = (this.scaleX + this.scaleY) / 2;
context.canvas.drawCircle(vp2px(halfWidth), vp2px(halfHeight), vp2px(20 * radiusScale));
}
}
@Entry
@Component
struct DrawModifierExample {
@State modifier: DrawModifier|undefined = new MyFrontDrawModifier();
build() {
Column() {
Button("清除modifier").onClick(() => {
// 变更前:下面代码不生效,Text组件仍旧绑定原本的modifier
this.modifier = undefined;
// 规避方法:变更前若想清空Text组件的自定义绘制效果,可将其绑定的变量变为基类对象
this.modifier = new DrawModifier();
// 变更后:若开发者期望行为和变更前保持一致,即下面代码不生效的话,只需要注释掉这一行即可
// this.modifier = undefined;
})
Row() {
Text()
.width(100)
.height(100)
.margin(10)
.backgroundColor(Color.Gray)
.drawModifier(this.modifier)
}
}
}
}
cl.arkui.2 默认深浅色切换流程变更
访问级别
其他
变更原因
针对深浅色模式切换等系统配置的热更新场景,当前的实现方式会导致整个组件树重新构建,进而使得TS层的UI代码重新执行。在页面结构较为复杂时,这种处理方式会显著降低时间性能。我们需要对此进行优化。
变更影响
此变更涉及应用适配
变更前:系统配置热更新场景下,组件树重新构建,相关属性设置的代码重新执行,存在大量不涉及深浅色变更的冗余开销。
变更后:开发者在属性中调用的方法不会再被触发。因此,如果有开发者在属性设置中使用了函数的方式去适配深浅色变化,那么变更后将会失效。
起始API Level
不涉及API
变更发生版本
从OpenHarmony SDK 6.0.1.2开始。
变更的接口/组件
不涉及具体接口/组件
适配指导
上面的适配方式虽然在旧版本能够生效,但并不是合理的适配方式,变更后将不再支持。 开发者可以根据自己的业务场景,按照如下正确方式进行深浅色模式适配: 方法一:对于仅仅是深浅色模式下显示类资源的自定义配置场景,比如上面代码中的背景色切换,推荐开发者采用资源目录配置的方式适配深浅色。 参考开发指南:应用深浅色适配 方法二:对于在不同颜色模式下有比较复杂的定制业务逻辑的场景,开发者需要在Ability类提供的系统配置变更回调中监听配置变更,当深浅等配置变化时通过绑定状态变量等方式进行适配,参考API文档 下面是一个简单的例子:
@Entry
@Component
struct Index {
// 深浅色适配函数
getBackgroundColor(): ResourceColor {
// let isDark = getSystemColorMode(); 通过媒体查询等方式获取当前系统颜色模式
// some other codes 其他的定制逻辑
return isDark ? Color.Blue : Color.Black; // 返回自定义颜色值
}
build() {
RelativeContainer() {
Column()
.width(100)
.height(100)
// 依赖backgroundColor()属性设置接口重新执行,才会重新执行getBackgroundColor()完成正确切换
.backgroundColor(this.getBackgroundColor())
}
.height('100%')
.width('100%')
}
}
1、通过程序启动时,在UIAbility中重写onConfigurationUpdate监听配置变化。
// EntryAbility.ts
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
AppStorage.setOrCreate('currentColorMode', this.context.config.colorMode);
}
onConfigurationUpdate(newConfig: Configuration): void {
AppStorage.setOrCreate('currentColorMode', newConfig.colorMode);
}
2、在需要适配的地方通过AppStorage能力进行适配。
import { ConfigurationConstant } from '@kit.AbilityKit';
@Entry
@Component
struct Index {
@State isDark: boolean = false;
@StorageProp('currentColorMode') @Watch('onColorModeChange') currentMode: number =
ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT;
onColorModeChange(): void {
// 也可以实现更加复杂的应用自定义的适配逻辑,这里用一个颜色变量的设置作为简单例子
this.isDark = (this.currentMode === ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT) ? false : true;
this.columColor = this.isDark ? Color.Blue : Color.Black;
}
getBackgroundColor(): ResourceColor {
return this.isDark ? Color.Blue : Color.Black;
}
// 通过状态变量触发页面更新逻辑
@State columColor: ResourceColor = Color.Black;
build() {
RelativeContainer() {
Column()
.width(100)
.height(100)
.backgroundColor(this.getBackgroundColor())// 变更前
.backgroundColor(this.columColor)
}
.height('100%')
.width('100%')
}
}
cl.arkui.3 drawModifier接口通过取消多余重绘达实现性能优化
访问级别
公开
变更原因
当前实现中,若组件设置了drawModifier属性,则默认会在生命周期的布局阶段之后触发重绘。对于绘制内容和尺寸均未发生变化的场景,这将导致多余的重绘,造成性能损耗。因此,调整设置drawModifier的节点的重绘规则,默认仅执行过测量过程的节点才进行重绘。
变更影响
此变更涉及应用适配
变更前:任何组件,只要设置了drawModifier属性,即使跳过测量,也会触发重绘
变更后:若容器组件设置了drawModifier属性,则当其跳过测量时,不执行重绘。其他组件的重绘触发机制与是否使用drawModifier属性无关。
起始API Level
12
变更发生版本
从OpenHarmony SDK 6.0.1.2开始。
变更的接口/组件
drawModifier
适配指导
若开发者的自定义绘制内容变化逻辑受到本次变更影响,在受影响属性变化的代码后加入invalidate以主动触发重绘,即可完成适配。具体适配方案可参考下文示例。
// index.ets
import { drawing } from '@kit.ArkGraphics2D';
class MyFontDrawModifier extends DrawModifier {
public scaleX: number = 1;
public scaleY: number = 1;
drawFront(context: DrawContext): void {
const brush = new drawing.Brush();
brush.setColor({
alpha: 255,
red: 0,
green: 0,
blue: 255
});
context.canvas.attachBrush(brush);
const halfWidth = context.size.width / 2;
const halfHeight = context.size.width / 2;
const radiusScale = (this.scaleX + this.scaleY) / 2;
context.canvas.drawCircle(vp2px(halfWidth), vp2px(halfHeight), vp2px(20 * radiusScale));
}
}
@Entry
@Component
struct DrawModifierExample {
private fontModifier: MyFontDrawModifier = new MyFontDrawModifier();
@State testWidth: number = 100;
build() {
Column() {
Button('changeModifier')
.onClick(() => {
this.testWidth++;
this.fontModifier.scaleX += 0.1;
this.fontModifier.scaleY += 0.1;
// 适配手动调用invalidate方法
this.fontModifier.invalidate();
})
Column() {
Row()
.width(50)
.height(50)
.drawModifier(this.fontModifier)
Row() {
Text("hello word")
.width(this.testWidth)
.height(100)
}
}
.width(100)
.height(100)
}
}
}
cl.arkui.4 WithTheme组件设置colorMode后效果异常问题修复
访问级别
公开
变更原因
WithTheme组件指定局部主题的能力对某些组件不生效。例如:通过WithTheme设置主题深浅色为DARK或LIGHT后,Button子组件使用的资源仍会依循系统深浅色变化。
变更影响
此变更涉及应用适配
变更前:WithTheme组件设置了主题后,其子组件的主题仍旧跟随系统切换。
变更后:WithTheme组件设置了主题后,其中的子组件使用指定的主题,不跟随系统切换。
变更涉及组件范围
变更前部分组件未适配WithTheme,因此其作为WithTheme子组件不受指定的主题影响,因此变更后这部分组件的行为会受到影响。变更前后会受到影响的具体组件类型列表如下:
TextArea、Search、Button、DatePicker、TextPicker、TimePicker、AlphabetIndexer、Swiper、Scroll、Tabs、TabContent、RichEditor、Menu、MenuItem、Counter、Progress、TextClock、LoadingProgress。
起始API Level
12
变更发生版本
从OpenHarmony SDK 6.0.1.2开始。
变更的接口/组件
WithTheme
适配指导
变更后,WithTheme组件指定的主题对子组件生效。若需适配,应针对发生变化的组件增加WithTheme,并指定其主题跟随系统,例如设置colorMode属性为SYSTEM。
// index.ets
@Entry
@Component
struct Index {
build() {
Column() {
// 设置组件为深色模式
WithTheme({ colorMode: ThemeColorMode.DARK }) {
// 适配:设置colorMode为ThemeColorMode.SYSTEM
Column() {
Text('WithTheme')
.fontSize(40)
.fontWeight(FontWeight.Bold)
Text('DARK')
.fontSize(40)
.fontWeight(FontWeight.Bold)
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height('33%')
.backgroundColor($r('sys.color.background_primary'))
}
}
.height('100%')
.expandSafeArea([SafeAreaType.SYSTEM],
[SafeAreaEdge.TOP, SafeAreaEdge.END, SafeAreaEdge.BOTTOM, SafeAreaEdge.START])
}
}
cl.arkui.5 ListItem组件创建行为变更
访问级别
公开接口
变更原因
如果ListItem组件不是通过LazyForEach和Repeat动态生成,创建ListItem时会执行两次ListItem的属性方法,需要优化为只执行一次属性方法以提升性能。
变更影响
此变更涉及应用适配,只涉及ListItem组件。
变更前:如果ListItem组件不是通过LazyForEach和Repeat动态生成,创建ListItem时会执行两次ListItem的属性方法。
变更后:ListItem在创建时只执行一次属性方法。
如下代码运行后,变更前会打印两次“GetWidth”,变更后只会打印一次“GetWidth”。
@Entry
@Component
struct ListItemExample {
getWidth(): string {
console.log("GetWidth");
return "100%"
}
build() {
Column() {
List({ space: 20, initialIndex: 0 }) {
ListItem() {
Text('Item')
}
.width(this.getWidth())
}.width('90%')
}.width('100%').height('100%')
}
}
起始API Level
API 7
变更发生版本 从OpenHarmony SDK 6.0.1.2开始。
变更的接口/组件
ListItem组件。
适配指导
需要排查ListItem属性方法中是否有调用函数获取属性值,排查函数调用次数是否对业务有影响,如果有影响需要根据实际业务场景适配。
cl.arkui.6 FullScreenLaunchComponent嵌入式运行元服务内容区避让系统安全区行为变更
访问级别
公开接口
变更原因
通过FullScreenLaunchComponent拉起嵌入式运行元服务时,元服务的windowMode为undefined, 元服务的页面内容在任何场景下都不会避让系统安全区,嵌入式运行元服务和跳出式运行元服务页面默认避让行为不一致,需要元服务的开发者针对嵌入式场景主动做避让适配。
变更影响
此变更涉及应用适配。
说明:宿主是拉起方,即FullScreenLaunchComponent组件使用方,提供方是被嵌入式运行的元服务。
变更前:提供方的windowMode不跟随宿主,默认值为undefined,所有场景下,元服务的页面内容都不会默认避让系统安全区,需要提供方开发者主动避让。
变更后:提供方的windowMode跟随宿主保持一致,在宿主windowMode为全屏显示的场景下,并且提供方未主动设置页面为沉浸式,提供方页面会默认避让系统安全区,无需提供方开发者主动避让
变更前 | 变更后 |
---|---|
![]() |
![]() |
起始API Level
API 12
变更发生版本 从OpenHarmony SDK 6.0.1.2开始。
变更的接口/组件
FullScreenLaunchComponent组件及嵌入式拉起的元服务。
适配指导
宿主的targetsdkversion >= 20。
- 建议宿主应用在6.0及以上版本使用嵌入式运行元服务,5.x版本建议使用跳出式运行元服务,提供方元服务无需在嵌入式场景主动避让适配。
- 如果宿主应用需要在5.x使用嵌入式运行元服务,需要提供方元服务针对嵌入式场景做适配,需要判断提供方元服务的ohos.extra.atomicservice.param.key.isFollowHostWindowMode,如果ohos.extra.atomicservice.param.key.isFollowHostWindowMode为true,无需主动避让适配;否则需要主动避让适配。
宿主的targetsdkversion < 20。
- 不建议宿主应用使用嵌入式运行元服务,建议使用跳出式运行元服务。
- 如果宿主应用需要使用嵌入式运行元服务,提供方元服务需要判断ohos.extra.atomicservice.param.key.isFollowHostWindowMode,若ohos.extra.atomicservice.param.key.isFollowHostWindowMode为true,无需主动避让适配;否则需要主动避让适配。
ts export default class AtomicServiceAbility extends EmbeddableUIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); if (want.parameters) { hilog.info(0x0000, 'testTag', '%{public}s', 'followed host window mode' + want.parameters['ohos.extra.atomicservice.param.key.isFollowHostWindowMode']); } } }
你可能感兴趣的鸿蒙文章
harmony 鸿蒙OpenHarmony Docker镜像
harmony 鸿蒙OpenHarmony Docker Image
harmony 鸿蒙IDL Specifications and User Guide (for System Applications Only)
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦