• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.NONE20
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| ![](figures/canvasFontBefore.jpg) | ![](figures/canvasFontAfter.jpg) |
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