• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ArkUI子系统Changelog
2
3## cl.arkui.1 弹窗类组件适配系统窗口安全区
4
5**访问级别**
6
7公开接口
8
9**变更原因**
10
11系统类型窗口下,弹窗类组件未避让安全区,导致弹窗显示内容与状态栏、导航条发生重叠
12
13**变更影响**
14
15该变更不涉及应用适配
16
17变更前:系统类型窗口下,弹窗类组件未避让安全区,显示内容与状态栏、导航条重叠
18
19变更后:系统类型窗口下,弹窗类组件避让安全区,显示内容与状态栏、导航条不重叠
20
21
22| 组件 | 变更前 | 变更后 |
23| :---: | :---: | :---: |
24| Menu (无预览图) | <img width=150px src="figures/avoidSafeArea/menu1_1.png"> <br> <img width=150px src="figures/avoidSafeArea/menu2_1.png"> | <img width=150px src="figures/avoidSafeArea/menu1_2.png"> <br> <img width=150px src="figures/avoidSafeArea/menu2_2.png"> |
25| Menu (有预览图) | <img width=150px src="figures/avoidSafeArea/menu3_1.png"> <br> <img width=150px src="figures/avoidSafeArea/menu4_1.png"> | <img width=150px src="figures/avoidSafeArea/menu3_2.png"> <br> <img width=150px src="figures/avoidSafeArea/menu4_2.png"> |
26| Popup | <img width=150px src="figures/avoidSafeArea/popup1_1.png"> <br> <img width=150px src="figures/avoidSafeArea/popup2_1.png"> | <img width=150px src="figures/avoidSafeArea/popup1_2.png"> <br> <img width=150px src="figures/avoidSafeArea/popup2_2.png"> |
27| Dialog | <img width=150px src="figures/avoidSafeArea/dialog1_1.png"> <br> <img width=150px src="figures/avoidSafeArea/dialog2_1.png"> | <img width=150px src="figures/avoidSafeArea/dialog1_2.png"> <br> <img width=150px src="figures/avoidSafeArea/dialog2_2.png"> |
28| Toast | <img width=150px src="figures/avoidSafeArea/toast1_1.png"> <br> <img width=150px src="figures/avoidSafeArea/toast2_1.png"> | <img width=150px src="figures/avoidSafeArea/toast1_2.png"> <br> <img width=150px src="figures/avoidSafeArea/toast2_2.png"> |
29
30**起始API Level**
31
32Menu: API 7
33
34Popup: API 7
35
36Dialog: API 7
37
38Toast: API 9
39
40**变更发生版本**
41
42从OpenHarmony SDK 5.1.0.50开始。
43
44**变更的接口/组件**
45
46Menu组件、Dialog组件、Popup组件、Toast组件。
47
48**适配指导**
49
50默认避让行为变更,无需适配,但应注意变更后的默认效果是否符合开发者预期,如不符合则应自定义修改效果控制变量以达到预期。
51
52## cl.arkui.2  animation动画接口在播放次数为无限循环时的行为变更
53
54**访问级别**
55
56公开接口
57
58**变更原因**
59
60布局过程中触发的同步回调里所做的修改,可能会被纳入animation的无限循环动画中,产生预期外的无限循环动画且无法停止。
61
62**变更影响**
63
64此变更涉及应用适配。
65
66变更前:在调用无限循环的animation动画接口时,若在布局过程中触发的同步回调里进行修改,这些修改可能会被纳入无限循环动画中,从而导致产生非预期的无限循环动画,且该动画将无法停止。
67
68变更后:在调用无限循环的animation动画接口时,为避免布局过程中触发的同步回调里所做的修改被纳入animation无限循环动画中,动画闭包开启前将执行最多两次额外刷新作为保护措施。对于两次额外刷新仍无法有效保护的场景,其表现将与原有行为一致,同样可能产生无限循环动画。
69
70**起始API Level**
71
72API 7
73
74**变更发生版本**
75
76从OpenHarmony SDK 5.1.0.49开始。
77
78**变更的接口/组件**
79
80common.d.ts文件animation接口。
81
82**适配指导**
83
84为避免布局过程中触发的同步回调里所做的修改被纳入animation无限循环动画,应将修改置于恰当的逻辑,即相对独立时机的事件中,如onClick事件。如果不需要产生动画,直接在onClick事件中设置即可,如果需要产生动画,需要在onClick事件中显式的将操作写入animateTo动画。
85适配后:
86
87```ts
88@Entry
89@Component
90struct AttrAnimationExample {
91  @State rotateAngle: number = 0
92  @State arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
93  scroller:Scroller = new Scroller();
94  @State h: number|string = "70%";
95
96  build() {
97    Column() {
98      List({space:10, scroller:this.scroller}) {
99        ForEach(this.arr, (index: number, item: number)=>{
100          ListItem() {
101            Text(item.toString())
102          }
103          .height(200)
104          .borderRadius(10)
105          .backgroundColor(0xDCDCDC)
106          .width("100%")
107        })
108      }
109      .width("100%")
110      .height(this.h)
111      // 在当前页面存在触发动效逻辑的情况下,不建议将操作放在同步回调中执行,建议写法参考onClick事件中的注释
112      // .onSizeChange((oldValue: SizeOptions, newValue: SizeOptions)=>{
113      //   this.scroller.scrollEdge(Edge.Bottom) // 同步回调中触发的操作可能会被纳入animation无限动画,产生预期外的效果
114      // })
115
116      Button('click')
117        .rotate({ angle: this.rotateAngle })
118        .animation({
119          duration: 1000,
120          curve: Curve.Linear,
121          iterations: -1, // 设置-1表示动画无限循环
122        })
123        .onClick(() => {
124          this.h = "80%"
125          this.rotateAngle = 360
126
127          //   无需产生动画,在onClick中直接设置即可
128          //   this.scroller.scrollEdge(Edge.Bottom)
129
130          //   需要产生动画,在animateTo中设置
131          //   animateTo({}, () => {
132          //     this.scroller.scrollEdge(Edge.Bottom)
133          //   })
134        })
135    }
136    .width('100%')
137  }
138}
139```
140
141## cl.arkui.3 滚动类组件(List、Scroll、Grid、WaterFlow)和Refresh组件过界跟手系数变更
142
143**访问级别**
144
145公开接口
146
147**变更原因**
148
149滚动类组件(List、Scroll、Grid、WaterFlow)和Refresh组件最大下拉过界距离太大,需要调整过界跟手系数,优化体验。
150
151**变更影响**
152
153此变更不涉及应用适配。
154
155| 变更前 | 变更后 |
156|---------|---------|
157| 滚动类组件和Refresh组件下拉过界时,相同手指滑动,下拉过界距离较大。<br> ![变更前](figures/list1.gif)       | 滚动类组件和Refresh组件下拉过界时,相同手指滑动,下拉过界距离较小。 <br> ![变更后](figures/list.gif)       |
158| <br> ![变更前](figures/list2.gif)       |  <br> ![变更后](figures/list3.gif)       |
159
160**起始API Level**
161
162API 7
163
164**变更发生版本**
165
166从OpenHarmony SDK 5.1.0.52开始。
167
168**变更的接口/组件**
169
170ArkUI 滚动类组件(List、Scroll、Grid、WaterFlow)和Refresh组件。
171
172**适配指导**
173
174变更后下拉过界效果更优,无需适配。
175
176## cl.arkui.4 轴事件支持BEGIN、END及CANCEL类型回调触发
177
178**访问级别**
179
180公开接口
181
182**变更原因**
183
184开发者无法监听到轴事件的BEGIN、END、CANCEL类型的事件回调。
185
186**变更影响**
187
188此变更不涉及应用适配。
189
190变更前:开发者通过OH_NativeXComponent_RegisterUIInputEventCallback接口监听轴事件回调,无法收到BEGIN、END、CANCEL类型的事件回调。
191
192变更后:开发者通过OH_NativeXComponent_RegisterUIInputEventCallback接口监听轴事件回调,可以收到BEGIN、END、CANCEL类型的事件回调。
193
194**起始API Level**
195
196API 12
197
198**变更发生版本**
199
200从OpenHarmony SDK 5.1.0.50开始。
201
202**变更的接口/组件**
203
204OH_NativeXComponent_RegisterUIInputEventCallback接口。
205
206**适配指导**
207
208默认行为变更,无需适配。
209
210## cl.arkui.6  CanvasRenderingContext2D的drawImage接口联合阴影绘制由阴影无法正确绘制变更为阴影正确绘制
211
212**访问级别**
213
214公开接口
215
216**变更原因**
217
218drawImage同名接口根据传入参数的不同,视为不同方法。当drawImage传入image、dx和dy三个参数,且与阴影颜色(shadowColor)、阴影偏置距离(shadowOffsetX和shadowOffsetY)联合绘制时,阴影无法正确绘制。变更后,阴影可以正确绘制。
219
220**变更影响**
221
222该变更涉及应用适配。
223
224- 变更前:当drawImage接口传入image、dx和dy三个参数,且与阴影进行联合绘制时,阴影无法正确绘制。
225- 变更后:当drawImage接口传入image、dx和dy三个参数,且与阴影进行联合绘制时,阴影可以正确绘制。
226
227|               变更前                |              变更后               |
228| :---------------------------------: | :-------------------------------: |
229| ![](figures/drawImage_without_shadow.jpg) | ![](figures/drawImage_with_shadow.jpg) |
230
231**起始API Level**
232
2339
234
235**变更发生版本**
236
237从OpenHarmony SDK 5.1.0.50 版本开始。
238
239**变更的接口/组件**
240
241CanvasRenderingContext2D的drawImage接口
242
243**适配指导**
244
245变更后,使用drawImage接口与阴影进行联合绘制时,阴影能够被正确绘制。
246
247**示例**
248
249```ts
250@Entry
251@Component
252struct Page1 {
253  private settings: RenderingContextSettings = new RenderingContextSettings(true)
254  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
255  private img: ImageBitmap = new ImageBitmap("common/images/example.png")
256
257  build() {
258    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
259      Canvas(this.context)
260        .width('100%')
261        .height('100%')
262        .onReady(() => {
263          this.context.shadowColor = "rgb(213,213,213)"
264          this.context.shadowOffsetX = 40
265          this.context.shadowOffsetY = 40
266          this.context.drawImage(this.img, 20, 20)
267        })
268    }
269    .width('100%')
270    .height('100%')
271  }
272}
273```
274
275## cl.arkui.7  CanvasRenderingContext2D的measureText接口测算文本的结果变更
276
277**访问级别**
278
279公开接口
280
281**变更原因**
282
283在运用measureText接口进行文本尺寸测量时,在下述场景1与场景2中,所测得的文本宽度呈现异常值:
284- 场景1:当Context与某一Canvas解除绑定后,再与另一Canvas重新绑定时,若未重新设定font属性,或在重新设定font属性时遗漏了font-size的指定,那么在绘制文本时将采用重置后的font-size(即默认值)。然而,在进行文本尺寸测量时,系统会错误地沿用前一Canvas中设定的font-size,从而导致文本宽度测量结果出现偏差。
285- 场景2:在font属性的设定过程中,若首次已明确指定font-style,而第二次设定了不同的font-style,虽然在绘制文本时会采用新设定的font-style,但在进行文本尺寸测量时,系统却依旧沿用上一次设定的font-style,同样造成文本宽度测量结果的不准确。
286
287**变更影响**
288
289该变更不涉及应用适配。
290
291使用measureText接口进行文本测算时:
292
293- 变更前:在场景1和场景2中,文本测算得到的文本宽度均为错误值。
294- 变更后:在场景1和场景2中,文本测算得到的文本宽度均为正确值。
295
296运行场景1的示例:
297
298```ts
299@Entry
300@Component
301struct example1 {
302  private settings: RenderingContextSettings = new RenderingContextSettings(true)
303  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
304  @State flag: boolean = false
305
306  build() {
307    Column() {
308      Button('transfer')
309        .position({x:200, y:0})
310        .width(100)
311        .height(40)
312        .onClick(() => {
313          this.flag = !this.flag
314        })
315      Canvas(this.context)
316        .position({x:100, y:45})
317        .width('300')
318        .height('100')
319        .backgroundColor('rgb(39,135,237)')
320        .onReady(() => {
321          this.context.textAlign = 'center'
322          this.context.font = '20vp'
323          this.context.fillText('width:' + this.context.measureText('Hello World').width, this.context.width/2, 30)
324        })
325      if (this.flag) {
326        Canvas(this.context)
327          .position({x:100, y:145})
328          .width('300')
329          .height('100')
330          .backgroundColor('rgb(213,213,213)')
331          .onReady(() => {
332            this.context.textAlign = 'center'
333            this.context.fillText('width:' + this.context.measureText('Hello World').width, this.context.width/2, 30)
334          })
335      }
336    }
337    .width('100%')
338    .height('100%')
339  }
340}
341```
342
343|                   变更前                   |                 变更后                  |
344| :----------------------------------------: | :-------------------------------------: |
345| ![](figures/measureText_1.gif) | ![](figures/measureText_2.gif) |
346
347运行场景2的示例:
348
349```ts
350@Entry
351@Component
352struct example2 {
353  private settings: RenderingContextSettings = new RenderingContextSettings(true)
354  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
355
356  build() {
357    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
358      Canvas(this.context)
359        .width('100%')
360        .height('100%')
361        .backgroundColor('rgb(255,192,0)')
362        .onReady(() => {
363          this.context.font = 'italic 25vp'
364          this.context.fillText('width:' + this.context.measureText('Hello World').width, 10, 50)
365          this.context.font = 'normal'
366          this.context.fillText('width:' + this.context.measureText('Hello World').width, 10, 100)
367        })
368    }
369    .width('100%')
370    .height('100%')
371  }
372}
373```
374
375|                   变更前                   |                 变更后                  |
376| :----------------------------------------: | :-------------------------------------: |
377| ![](figures/measureText_3.jpg) | ![](figures/measureText_4.jpg) |
378
379**起始API Level**
380
3819
382
383**变更发生版本**
384
385从OpenHarmony SDK 5.1.0.50 版本开始。
386
387**变更的接口/组件**
388
389CanvasRenderingContext2D的measureText接口
390
391**适配指导**
392
393无需适配,但应注意变更后的行为是否对整体应用逻辑产生影响。
394
395## cl.arkui.8 CanvasRenderingContext2D的miterLimit接口,当传入参数为0时,其异常值的处理方式发生变更
396
397**访问级别**
398
399公开接口
400
401**变更原因**
402
403CanvasRenderingContext2D的miterLimit接口,当传入参数为0时,未按照默认值设置参数,与文档所规定的处理异常值的方式不符。
404
405**变更影响**
406
407该变更涉及应用适配。
408
409|               变更前                |              变更后               |
410| :---------------------------------: | :-------------------------------: |
411| 当传入参数0为时,未按照默认值进行参数设置。<br>![](figures/miterLimit_1.jpeg) | 当传入参数为0时,按照默认值进行参数设置。<br>![](figures/miterLimit_2.jpeg) |
412
413**起始API Level**
414
4159
416
417**变更发生版本**
418
419从OpenHarmony SDK 5.1.0.50 版本开始。
420
421**变更的接口/组件**
422
423CanvasRenderingContext2D的miterLimit接口
424
425**适配指导**
426
427变更后,使用miterLimit接口,当传入参数0为时,按照默认值进行参数设置,即miterLimit被设置为10。
428
429**示例**
430
431```ts
432@Entry
433@Component
434struct MiterLimit {
435  private settings: RenderingContextSettings = new RenderingContextSettings(true)
436  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
437
438  build() {
439    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
440      Canvas(this.context)
441        .width('100%')
442        .height('100%')
443        .backgroundColor('rgb(213,213,213)')
444        .onReady(() => {
445          this.context.lineWidth = 10
446          this.context.lineJoin = 'miter'
447          this.context.miterLimit = 0
448          this.context.moveTo(50, 30)
449          this.context.lineTo(170, 90)
450          this.context.lineTo(50, 150)
451          this.context.stroke()
452        })
453    }
454    .width('100%')
455    .height('100%')
456  }
457}
458```
459
460## cl.arkui.9 弹出框标题换行优先策略及内容区默认对齐方式变更
461
462**访问级别**
463
464公开接口
465
466**变更原因**
467
468弹窗标题及内容风格优化,增强用户体验。
469
470**变更影响**
471
472此变更不涉及应用适配。
473
474变更点1:弹窗标题超长换行优先规则变更。
475
476| 变更前                                                                                 | 变更后                                                                            |
477|-------------------------------------------------------------------------------------|--------------------------------------------------------------------------------|
478| 弹窗标题超长时,优先缩小字号,最小至9vp,然后再换行展示。<br>  ![变更前](figures/advancedDialog/title_before.png) | 弹窗标题超长时,优先换行,再缩小字号展示,最小至9vp。<br>![变更后](figures/advancedDialog/title_after.png) |
479
480变更点2:弹窗内容超过一行时默认对齐行为变更。
481
482| 变更前                                                                  | 变更后                                                              |
483|----------------------------------------------------------------------|------------------------------------------------------------------|
484| 弹窗内容多行文本时居左对齐。<br> ![变更前](figures/advancedDialog/content_before.png) | 弹窗内容文本居中对齐。<br> ![变更后](figures/advancedDialog/content_after.png) |
485
486**起始API Level**
487
488API 10
489
490**变更发生版本**
491
492从OpenHarmony SDK 5.1.0.50开始。
493
494**变更的接口/组件**
495
496advancedDialog
497
498**适配指导**
499
500默认行为变更,无需适配。系统弹窗默认规格优化演进,若开发者有其他布局、样式诉求,建议使用CustomDialog自定义实现。