1# ArkUI子系统Changelog 2 3## cl.arkui.1 半模态SIDE侧边样式新增避让软键盘能力 4 5**访问级别** 6 7公开接口 8 9**变更原因** 10 11[bindSheet](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#bindsheet)半模态弹窗侧边样式默认支持避让软键盘,提升易用性。 12 13**变更影响** 14 15此变更涉及应用适配。 16 17- 变更前:当半模态样式指定为[SheetType](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#sheettype11枚举说明)的SIDE侧边样式时,[bindSheet](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#bindsheet)的属性keyboardAvoidMode设置为[SheetKeyboardAvoidMode](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#sheetkeyboardavoidmode13枚举说明)的避让软键盘方式无效,半模态默认不避让软键盘,需要开发者自定义避让软键盘。 18 19- 变更后:当半模态样式指定为[SheetType](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#sheettype11枚举说明)的SIDE侧边样式时,[bindSheet](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#bindsheet)的属性keyboardAvoidMode设置为[SheetKeyboardAvoidMode](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#sheetkeyboardavoidmode13枚举说明)的避让软键盘方式将生效,半模态支持避让软键盘,默认值为SheetKeyboardAvoidMode.TRANSLATE_AND_SCROLL。若开发者希望自定义避让软键盘,则需设置属性keyboardAvoidMode = SheetKeyboardAvoidMode.NONE。 20 21**起始API Level** 22 23API 20 24 25**变更发生版本** 26 27从OpenHarmony SDK 6.0.0.39开始。 28 29**变更的接口/组件** 30 31涉及接口: 32[bindSheet](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#bindsheet)的keyboardAvoidMode属性。 33 34[SheetType](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#sheettype11枚举说明)的SIDE半模态侧边样式。 35 36**适配指导** 37 38默认行为变更,当半模态样式指定为[SheetType](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#sheettype11枚举说明)的SIDE侧边样式时,若开发者期望自定义避让软键盘,则需要设置[bindSheet](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#bindsheet)的属性keyboardAvoidMode = [SheetKeyboardAvoidMode](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#sheetkeyboardavoidmode13枚举说明).NONE。 39 40若开发者期望采用半模态控件自带的避让软键盘能力,则可以设置[bindSheet](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#bindsheet)的属性keyboardAvoidMode = [SheetKeyboardAvoidMode](../../../application-dev/reference/apis-arkui/arkui-ts/ts-universal-attributes-sheet-transition.md#sheetkeyboardavoidmode13枚举说明)的其他枚举值,或者不设置属性keyboardAvoidMode,采用默认值。 41 42## cl.arkui.2 通用属性drawModifier接口行为变更 43 44**访问级别** 45 46公开接口 47 48**变更原因** 49 50(1)当drawModifier接口参数从DrawModifier对象变为undefined时,实际生效的仍是原来的DrawModifier对象。开发者无法重置其值,这与通用属性接口的规范不符。 51 52(2)当前实现中,若组件设置了drawModifier属性,则默认会在生命周期的布局阶段之后触发重绘。对于绘制内容和尺寸均未发生变化的场景,这将导致多余的重绘,造成性能损耗。因此,调整设置drawModifier的节点的重绘规则,默认仅执行过测量过程的节点才进行重绘。 53 54**变更影响** 55 56此变更涉及应用适配。 57 58- 变更前:(1)drawModifier接口参数从DrawModifier对象变为undefined后,生效的仍旧是原来的DrawModifier对象。(2)任何组件,只要设置了drawModifier属性,即使跳过测量,也会触发重绘。 59 60- 变更后:(1)drawModifier接口参数从DrawModifier对象变为undefined后,会将原来设置的值重置为undefined。(2)若容器组件设置了drawModifier属性,则当其跳过测量时,不执行重绘。其他组件的重绘触发机制与是否使用drawModifier属性无关。 61 62**起始API Level** 63 6412 65 66**变更发生版本** 67 68从OpenHarmony SDK 6.0.0.39开始。 69 70**变更的接口/组件** 71 72drawModifier 73 74**适配指导** 75 76(1)变更前,this.modifier = undefined;不会清除组件上生效的DrawModifier对象,而变更后则会完成清除。因此,若想保持行为不变,需要注释或删除这一行代码。 77 78(2)若开发者的自定义绘制内容变化逻辑受到本次变更影响,在受影响属性变化的代码后加入invalidate以主动触发重绘,即可完成适配。 79 80具体适配方案可参考下文示例。 81 82```ts 83import { drawing } from '@kit.ArkGraphics2D'; 84 85class MyFrontDrawModifier extends DrawModifier { 86 public scaleX: number = 1; 87 public scaleY: number = 1; 88 public uiContext: UIContext; 89 90 constructor(uiContext: UIContext) { 91 super(); 92 this.uiContext = uiContext; 93 } 94 95 drawFront(context: DrawContext): void { 96 const brush = new drawing.Brush(); 97 brush.setColor({ 98 alpha: 255, 99 red: 0, 100 green: 0, 101 blue: 255 102 }); 103 context.canvas.attachBrush(brush); 104 const halfWidth = context.size.width / 2; 105 const halfHeight = context.size.width / 2; 106 const radiusScale = (this.scaleX + this.scaleY) / 2; 107 context.canvas.drawCircle(this.uiContext.vp2px(halfWidth), this.uiContext.vp2px(halfHeight), this.uiContext.vp2px(20 * radiusScale)); 108 } 109} 110 111@Entry 112@Component 113struct DrawModifierExample { 114 @State public modifierToBeCleared: DrawModifier | undefined = new MyFrontDrawModifier(this.getUIContext()); 115 public modifierToBeChanged: MyFrontDrawModifier = new MyFrontDrawModifier(this.getUIContext()); 116 @State public testWidth: number = 100; 117 118 build() { 119 Column() { 120 Button("clearModifier").onClick(() => { 121 // 变更前:下面代码不生效,Row组件仍旧绑定原本的modifier 122 this.modifierToBeCleared = undefined; 123 // 规避方法:变更前若想清空Text组件的自定义绘制效果,可将其绑定的变量变为基类对象 124 this.modifierToBeCleared = new DrawModifier(); 125 // 变更后:若开发者期望行为和变更前保持一致,即下面代码不生效的话,只需要注释掉这一行即可 126 // this.modifierToBeCleared = undefined; 127 }) 128 Column() { 129 Row() 130 .width(100) 131 .height(100) 132 .margin(10) 133 .backgroundColor(Color.Gray) 134 .drawModifier(this.modifierToBeCleared) 135 } 136 .margin({ bottom: 50 }) 137 Button('changeModifier') 138 .onClick(() => { 139 this.testWidth++; 140 this.modifierToBeChanged.scaleX += 0.1; 141 this.modifierToBeChanged.scaleY += 0.1; 142 // 变更前自动更新,变更后需要手动调用invalidate方法适配 143 this.modifierToBeChanged?.invalidate(); 144 }) 145 Column() { 146 Row() 147 .width(100) 148 .height(100) 149 .margin(10) 150 .backgroundColor(Color.Gray) 151 .drawModifier(this.modifierToBeChanged) 152 Row() { 153 Text("hello world") 154 .width(this.testWidth) 155 .height(100) 156 } 157 } 158 .width(300) 159 .height(300) 160 } 161 } 162} 163``` 164 165## cl.arkui.3 CanvasRenderer的font接口支持自定义字体行为变更 166 167**访问级别** 168 169公开接口 170 171**变更原因** 172 173增强基础能力,CanvasRenderer的font接口支持设置自定义字体。 174 175**变更影响** 176 177此变更涉及应用适配。 178 179变更前,CanvasRenderer的font接口设置自定义字体不生效,绘制字体显示为默认字体。 180 181变更后,CanvasRenderer的font接口设置自定义字体生效,绘制字体显示为自定义字体。 182 183```ts 184import { text } from "@kit.ArkGraphics2D" 185 186// xxx.ets 187@Entry 188@Component 189struct FontDemo { 190 private settings: RenderingContextSettings = new RenderingContextSettings(true) 191 private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings) 192 193 build() { 194 Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { 195 Canvas(this.context) 196 .width('100%') 197 .height('100%') 198 .backgroundColor('rgb(213,213,213)') 199 .onReady(() => { 200 let fontCollection = text.FontCollection.getGlobalInstance(); 201 fontCollection.loadFontSync('HarmonyOS_Sans_Thin_Italic', $rawfile("HarmonyOS_Sans_Thin_Italic.ttf")) 202 this.context.font = "50px HarmonyOS_Sans_Thin_Italic" 203 this.context.fillText("Hello World", 20, 60) 204 }) 205 } 206 .width('100%') 207 .height('100%') 208 } 209} 210``` 211 212| 变更前 | 变更后 | 213| :----------------------------------------: | :-------------------------------------: | 214|  |  | 215 216**起始API Level** 217 218API 8 219 220**变更发生版本** 221 222从OpenHarmony SDK 6.0.0.39开始。 223 224**变更的接口/组件** 225 226CanvasRenderingContext2D和OffscreenCanvasRenderingContext2D的font接口。 227 228**适配指导** 229 230变更后,CanvasRenderer的font接口设置自定义字体生效。若需保持变更前的默认字体行为,可以不设置自定义字体。 231