• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ArkUI子系统Changelog
2
3## cl.arkui.1  CanvasRenderingContext2D的drawImage接口默认单位变更
4
5**访问级别**
6
7公开接口
8
9**变更原因**
10
11当drawImage传入9个参数时,若首个参数(image)为PixelMap类型,则第2至第5个参数(sx、sy、sw和sh)以px为单位进行解析。与文档描述不一致,且绘制得到的图片大小存在问题。
12
13**变更影响**
14
15该变更涉及应用适配。
16
17当drawImage传入9个参数时,且首个参数为PixelMap类型时:
18
19- 变更前:第2至第5个参数都会以px为单位进行解析。
20- 变更后:第2至第5个参数会以vp为单位进行解析。
21
22||               变更前                |              变更后               |
23| :-: | :---------------------------------: | :-------------------------------: |
24| 第2至第5个参数以vp为单位传入 | ![](figures/before_drawimage_change_1.jpeg) | ![](figures/after_drawimage_change_1.jpeg) |
25| 第2至第5个参数以px为单位传入 | ![](figures/before_drawimage_change_2.jpeg) | ![](figures/after_drawimage_change_2.jpeg) |
26
27**起始API Level**
28
299
30
31**变更发生版本**
32
33从OpenHarmony SDK 5.1.0.48 版本开始。
34
35**变更的接口/组件**
36
37CanvasRenderingContext2D的drawImage接口
38
39**适配指导**
40
41变更后,使用drawImage接口时,若传入9个参数,且首个参数为PixelMap类型时,要注意第2至第5个参数会以vp为单位进行解析。
42
43**示例**
44
45```ts
46import { image } from '@kit.ImageKit'
47
48@Entry
49@Component
50struct Demo {
51  private settings: RenderingContextSettings = new RenderingContextSettings(true)
52  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
53
54  build() {
55    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
56      Canvas(this.context)
57        .width('100%')
58        .height('100%')
59        .onReady(() => {
60          let context = getContext(this)
61          let imageSourceApi = image.createImageSource(context.filesDir + "/view.jpg")
62          let pixelmap = imageSourceApi.createPixelMapSync();
63          let imageInfo = pixelmap.getImageInfoSync()
64          let width = px2vp(imageInfo.size.width)
65          let height = px2vp(imageInfo.size.height)
66          this.context.drawImage(pixelmap, 0, 0, width, height, 50, 50, 250, 200)
67          this.context.drawImage(pixelmap, 0, 0, imageInfo.size.width, imageInfo.size.height, 50, 300, 250, 200)
68        })
69    }
70    .width('100%')
71    .height('100%')
72  }
73}
74```
75
76## cl.arkui.2 Canvas路径绘制未指定起始点和绘制方法number类型参数传NaN和Infinity值的行为变更。
77
78**访问级别**
79
80公开接口
81
82**变更原因**
83
84使用Canvas绘制路径时,如果没有使用moveTo方法指定路径起始点,会默认从画布左上角(0,0)开始绘制路径;某些绘制方法的number类型参数传入NaN或Infinity值时,部分内容无法绘制。这些行为与W3C的行为不一致。
85
86**变更影响**
87
88此变更涉及应用适配。
89
90变更前:使用Canvas绘制路径时,如果没有使用moveTo方法指定路径起始点,会默认从画布左上角(0,0)开始绘制路径;任一路径绘制方法的number类型参数传入NaN或Infinity值时,整个路径无法绘制。对画布进行缩放、旋转、移动或使用变换矩阵进行图形变化时,number类型参数传入NaN或Infinity值,后面执行的方法无法绘制。
91
92变更后:使用Canvas绘制路径时,如果没有使用moveTo方法指定路径起始点,会以第一个有效的路径绘制方法的前两位number参数作为路径起始点;传入NaN或Infinity值的路径绘制方法不做处理,根据有效的路径参数进行绘制。对画布进行缩放、旋转、移动或使用变换矩阵进行图形变化时,number类型参数传入NaN或Infinity值,其他传入有效参数的方法正常绘制。
93
94具体接口的差异如下:
95
96| 方法 | 变更前 | 变更后 |
97|---------|---------|---------|
98|lineTo|如果没有使用moveTo方法指定路径起始点,会默认从画布左上角(0,0)开始绘制路径;<br>任一路径绘制方法的number类型参数传入NaN或Infinity值时,整个路径无法绘。|如果没有使用moveTo方法指定路径起始点,会以第一个有效的路径绘制方法的前两位number参数作为路径起始点;<br>路径绘制方法的number类型参数传入NaN或Infinity值时,该方法不生效。其他传入有效参数的路径绘制方法正常绘制。|
99|arcTo|如果没有使用moveTo方法指定路径起始点,会默认从画布左上角(0,0)开始绘制路径;<br>任一路径绘制方法的number类型参数传入NaN或Infinity值时,整个路径无法绘制。|如果没有使用moveTo方法指定路径起始点,会以第一个有效的路径绘制方法的前两位number参数作为路径起始点;<br>路径绘制方法的number类型参数传入NaN或Infinity值时,该方法不生效。其他传入有效参数的路径绘制方法正常绘制。|
100|bezierCurveTo|如果没有使用moveTo方法指定路径起始点,会默认从画布左上角(0,0)开始绘制路径;<br>任一路径绘制方法的number类型参数传入NaN或Infinity值时,整个路径无法绘制。|如果没有使用moveTo方法指定路径起始点,会以第一个有效的路径绘制方法的前两位number参数作为路径起始点;<br>路径绘制方法的number类型参数传入NaN或Infinity值时,该方法不生效。其他传入有效参数的路径绘制方法正常绘制。|
101|quadraticCurveTo|如果没有使用moveTo方法指定路径起始点,会默认从画布左上角(0,0)开始绘制路径;<br>任一路径绘制方法的number类型参数传入NaN或Infinity值时,整个路径无法绘制。|如果没有使用moveTo方法指定路径起始点,会以第一个有效的路径绘制方法的前两位number参数作为路径起始点;<br>路径绘制方法的number类型参数传入NaN或Infinity值时,该方法不生效。其他传入有效参数的路径绘制方法正常绘制。|
102|moveTo|任一路径绘制方法的number类型参数传入NaN或Infinity值时,整个路径无法绘制。|路径绘制方法的number类型参数传入NaN或Infinity值时,该方法不生效。其他传入有效参数的路径绘制方法正常绘制。|
103|arc|任一路径绘制方法的number类型参数传入NaN或Infinity值时,整个路径无法绘制。|路径绘制方法的number类型参数传入NaN或Infinity值时,该方法不生效。其他传入有效参数的路径绘制方法正常绘制。|
104|ellipse|任一路径绘制方法的number类型参数传入NaN或Infinity值时,整个路径无法绘制。|路径绘制方法的number类型参数传入NaN或Infinity值时,该方法不生效。其他传入有效参数的路径绘制方法正常绘制。|
105|rect|任一路径绘制方法的number类型参数传入NaN或Infinity值时,整个路径无法绘制。|路径绘制方法的number类型参数传入NaN或Infinity值时,该方法不生效。其他传入有效参数的路径绘制方法正常绘制。|
106|globalAlpha|绘制方法的number类型参数传入NaN或Infinity值,在该方法后执行的绘制方法无法绘制。|number类型参数传入NaN或Infinity值参数时该方法不生效。其他传入有效参数的绘制方法正常绘制。|
107|rotate|绘制方法的number类型参数传入NaN或Infinity值,在该方法后执行的绘制方法无法绘制。|number类型参数传入NaN或Infinity值参数时该方法不生效。其他传入有效参数的绘制方法正常绘制。|
108|scale|绘制方法的number类型参数传入NaN或Infinity值,在该方法后执行的绘制方法无法绘制。|number类型参数传入NaN或Infinity值参数时该方法不生效。其他传入有效参数的绘制方法正常绘制。|
109|transform|绘制方法的number类型参数传入NaN或Infinity值,在该方法后执行的绘制方法无法绘制。|number类型参数传入NaN或Infinity值参数时该方法不生效。其他传入有效参数的绘制方法正常绘制。|
110|setTransform|绘制方法的number类型参数传入NaN或Infinity值,在该方法后执行的绘制方法无法绘制。|number类型参数传入NaN或Infinity值参数时该方法不生效。其他传入有效参数的绘制方法正常绘制。|
111|translate|绘制方法的number类型参数传入NaN或Infinity值,在该方法后执行的绘制方法无法绘制。|number类型参数传入NaN或Infinity值参数时该方法不生效。其他传入有效参数的绘制方法正常绘制。|
112|lineDashOffset|设置了虚线样式的线条绘制出来是实线。|设置了虚线样式的线条绘制出来是虚线。|
113
114| 说明 | 示例 | 变更前 | 变更后 |
115|---------|---------|---------|---------|
116| 路径绘制方法传NaN| context.moveTo(0, 0)<br>context.lineTo(NaN, 100)<br>context.lineTo(100, 100)<br>context.lineTo(200, 100) | 无绘制内容 | ![NaN_after](figures/Canvas_lineTo_before.png) |
117| lineTo未指定起始点 | context.lineTo(100, 100)<br>context.lineTo(200, 100) |![变更前路径从左上角开始](figures/Canvas_lineTo_before.png)|![变更后路径从第一个绘制方法的前两位参数开始](figures/Canvas_lineTo_after.png)|
118| arcTo未指定起始点 | context.arcTo(150, 20, 150, 70, 50) |![变更前路径从左上角开始](figures/Canvas_arcTo_before.png)|![变更后路径从第一个绘制方法的前两位参数开始](figures/Canvas_arcTo_after.png)|
119| bezierCurveTo未指定起始点 | context.bezierCurveTo(20, 100, 200, 100, 200, 20)|![变更前路径从左上角开始](figures/Canvas_bezierCurveTo_before.png)|![变更后路径从第一个绘制方法的前两位参数开始](figures/Canvas_bezierCurveTo_after.png)|
120| quadraticCurveTo未指定起始点 | context.quadraticCurveTo(100, 100, 200, 20)|![变更前路径从左上角开始](figures/Canvas_quadraticCurveTo_before.png)|![变更后路径从第一个绘制方法的前两位参数开始](figures/Canvas_quadraticCurveTo_after.png)|
121
122**起始API Level**
123
124API 9
125
126**变更发生版本**
127
128从OpenHarmony 5.1.0.48 版本开始。
129
130**变更的接口/组件**
131
132CanvasRenderingContext2D
133
134OffscreenCanvasRenderingContext2D
135
136Path2D
137
138**适配指导**
139
140number类型参数传入NaN和Infinity值时,属于异常值处理。变更后的行为可能影响整体应用逻辑,若出现不需要的绘制内容,请删除对应的绘制逻辑。若需路径起点从(0, 0)出发,可使用moveTo(0, 0)。
141
142```ts
143// xxx.ets
144@Entry
145@Component
146struct LineTo {
147  private settings: RenderingContextSettings = new RenderingContextSettings(true)
148  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
149
150  build() {
151    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
152      Canvas(this.context)
153        .width('100%')
154        .height('100%')
155        .backgroundColor('#ffff00')
156        .onReady(() =>{
157          this.context.beginPath()
158          this.context.moveTo(0, 0) // 指定绘制路径的起点为(0, 0)
159          this.context.lineTo(280, 160)
160          this.context.stroke()
161        })
162    }
163    .width('100%')
164    .height('100%')
165  }
166}
167```