1# ArkUI子系统Changelog
2
3## cl.arkui.1 FrameNode的isAttached接口返回值含义发生变更
4
5**访问级别**
6
7公开接口
8
9**变更原因**
10
11用户使用FrameNode的isAttached接口时,实际返回当前节点是否可见,即通用属性中的Visibility是否为Visible,而非当前节点是否被挂载到主节点树上。
12
13**变更影响**
14
15该变更为不兼容变更。
16
17变更前:返回当前节点是否可见。
18
19变更后:返回当前节点是否被挂载到主节点树上。
20
21不兼容场景:
22当用户通过该接口获取目标节点是否被挂载到主节点树上,而目标节点为节点树上的不可见节点或未上树的可见节点时,会出现不兼容情况; 例如:
23```ts
24import { FrameNode, NodeController } from '@ohos.arkui.node';
25import { UIContext } from '@ohos.arkui.UIContext';
26
27class MyNodeController extends NodeController {
28  private rootNode: FrameNode | null = null;
29  private notAttachedNode: FrameNode | null = null;
30  private notVisibleNode: FrameNode | null = null;
31
32  makeNode(uiContext: UIContext) {
33    this.rootNode = new FrameNode(uiContext);
34    this.notAttachedNode = new FrameNode(uiContext);
35    this.notVisibleNode = new FrameNode(uiContext);
36    this.notVisibleNode.commonAttribute.visibility(Visibility.Hidden);
37    this.rootNode.appendChild(this.notVisibleNode);
38    return this.rootNode;
39  }
40
41  printInfo(): void {
42    if (this.notVisibleNode) {
43      // 主节点树上的不可见节点,变更前为false,变更后为true
44      console.log('notVisibleNode:', this.notVisibleNode.isAttached());
45    }
46    if (this.notAttachedNode) {
47      // 未上树的可见节点,变更前为true,变更后为false
48      console.log('notAttachedNode:', this.notAttachedNode.isAttached());
49    }
50  }
51}
52
53@Entry
54@Component
55struct MyComponent {
56  @State myNodeController: MyNodeController = new MyNodeController();
57
58  build() {
59    Column() {
60      NodeContainer(this.myNodeController)
61      Button('click').onClick(() => {
62        this.myNodeController.printInfo();
63      })
64    }
65    .width('100%')
66    .alignItems(HorizontalAlign.Center)
67  }
68}
69```
70
71**起始API Level**
72
73API 12
74
75**变更发生版本**
76
77从OpenHarmony SDK 5.0.0.57开始。
78
79**变更的接口/组件**
80
81FrameNode.d.ts文件isAttached接口。
82
83**适配指导**
84
85```ts
86// 变更前FrameNode的isAttached接口行为和isVisible接口一致,若需保持变更前行为,使用isVisible接口替换即可。
87node.isAttached(); // 变更前
88node.isVisible(); // 变更后
89```
90
91## cl.arkui.2 RenderNode的rotation接口角度单位从vp变为度
92
93**访问级别**
94
95公开接口
96
97**变更原因**
98
99用户使用RenderNode的rotation接口时,传入的默认角度单位是vp,这不是正常规格的角度单位,需要变更为度。
100
101**变更影响**
102
103该变更为不兼容变更。
104
105变更前:角度单位为vp,需要经过px2vp单位转换才能转为角度。
106
107变更后:角度单位为度,直接传入数值即可,无需单位转换。
108
109不兼容场景:
110当用户通过该接口设置RenderNode的旋转时,会出现不兼容情况; 例如:
111```ts
112import { FrameNode, NodeController, RenderNode, UIContext } from '@kit.ArkUI';
113
114class MyNodeController extends NodeController {
115  private rootNode: FrameNode | null = null;
116
117  makeNode(uiContext: UIContext) {
118    this.rootNode = new FrameNode(uiContext);
119
120    // 直接传入90
121    const renderNodeSrc = new RenderNode();
122    renderNodeSrc.backgroundColor = 0xffdddddd;
123    renderNodeSrc.frame = { x: 10, y: 110, width: 200, height: 100 };
124    const renderNodeDst  = new RenderNode();
125    renderNodeDst.backgroundColor = 0xfffcc0ea;
126    renderNodeDst.frame = { x: 10, y: 110, width: 200, height: 100 };
127    renderNodeDst.rotation = { x: 0, y: 0, z: 90 };
128
129    // 传入px2vp(90)
130    const renderNodeSrc1 = new RenderNode();
131    renderNodeSrc1.backgroundColor = 0xffdddddd;
132    renderNodeSrc1.frame = { x: 10, y: 360, width: 200, height: 100 };
133    const renderNodeDst1  = new RenderNode();
134    renderNodeDst1.backgroundColor = 0xfffcc0ea;
135    renderNodeDst1.frame = { x: 10, y: 360, width: 200, height: 100 };
136    renderNodeDst1.rotation = { x: 0, y: 0, z: px2vp(90) };
137
138    // 传入vp2px(90)
139    const renderNodeSrc2 = new RenderNode();
140    renderNodeSrc2.backgroundColor = 0xffdddddd;
141    renderNodeSrc2.frame = { x: 10, y: 610, width: 200, height: 100 };
142    const renderNodeDst2  = new RenderNode();
143    renderNodeDst2.backgroundColor = 0xfffcc0ea;
144    renderNodeDst2.frame = { x: 10, y: 610, width: 200, height: 100 };
145    renderNodeDst2.rotation = { x: 0, y: 0, z: vp2px(90) };
146
147    const rootRenderNode = this.rootNode.getRenderNode();
148    rootRenderNode?.appendChild(renderNodeSrc);
149    rootRenderNode?.appendChild(renderNodeDst);
150    rootRenderNode?.appendChild(renderNodeSrc1);
151    rootRenderNode?.appendChild(renderNodeDst1);
152    rootRenderNode?.appendChild(renderNodeSrc2);
153    rootRenderNode?.appendChild(renderNodeDst2);
154
155    return this.rootNode;
156  }
157}
158
159@Entry
160@Component
161struct MyComponent {
162  @State myNodeController: MyNodeController = new MyNodeController();
163
164  build() {
165    Row() {
166      Column() {
167        Text('90')
168        Text('px2vp(90)')
169        Text('vp2px(90)')
170      }
171      .justifyContent(FlexAlign.SpaceAround)
172      .height('100%')
173      .width('30%')
174      NodeContainer(this.myNodeController)
175        .height('100%')
176        .width('70%')
177    }
178    .width('100%')
179    .alignItems(VerticalAlign.Top)
180  }
181}
182```
183
184![demoRenderNodeRotation](figures/demoRenderNodeRotation.png)
185
186**起始API Level**
187
188API 12
189
190**变更发生版本**
191
192从OpenHarmony SDK 5.0.0.57开始。
193
194**变更的接口/组件**
195
196RenderNode.d.ts文件rotation接口。
197
198**适配指导**
199
200```ts
201// 变更前RenderNode的rotation接口的旋转角度单位为“vp”,变更后单位为“度”,若需保持变更前行为,使用vp2px进行单位转换即可。
202renderNode.rotation = { x: 0, y: 0, z: 90 }; // 变更前
203renderNode.rotation = { x: 0, y: 0, z: vp2px(90) }; // 变更后
204```
205
206## cl.arkui.3 List组件首次创建布局时,Scroller控制器的跳转方法优先级变更为高于initialIndex的优先级
207
208**访问级别**
209
210公开接口
211
212**变更原因**
213
214initialIndex仅支持设定起始index,并默认将列表头部对齐,这使得开发者无法自定义对齐策略。scrollToIndex允许指定index与对齐方式,然而其效果会被 initialIndex覆盖。因此,需要提升scrollToIndex的优先级,使其高于initialIndex。这样一来,在组件初次布局时,如果开发者希望设定起始index并同时指定对齐方式,即可通过使用scrollToIndex来达成目标。
215
216
217**变更影响**
218
219该变更为不兼容变更。
220
221场景1:List设置initialIndex为0 (默认也是0),并在首次布局前调用scrollToIndex(1)。
222
223| 变更前 | 变更后 |
224|------ |--------|
225|List首次布局将从index为0的ListItem开始布局。</br>![listdemo1](figures/listdemo1.png)|List首次布局将从index为1的ListItem开始布局。</br>![listdemo2](figures/listdemo2.png)|
226
227场景2:List设置initialIndex为0 (默认也是0),并在首次布局前调用scrollEdge(Edge.Bottom)。
228
229| 变更前 | 变更后 |
230|------ |--------|
231|List首次布局将展示在顶部,即index为0的ListItem处于顶部。</br>![listdemo1](figures/listdemo1.png)|List首次布局将展示在底部,即index为最大值的ListItem处于底部。</br>![listdemo3](figures/listdemo3.png)|
232
233
234**起始API Level**
235
236API 7
237
238**变更发生版本**
239
240从OpenHarmony 5.0.0.57开始。
241
242**变更的接口/组件**
243
244List组件的initialIndex接口和Scroller控制器的跳转接口(scrollToIndex、scrollToItemInGroup和scrollEdge)。
245
246**适配指导**
247
248需要对使用List组件的页面进行排查,检查是否在onAppear或其他List组件首次布局之前的阶段,同时设置了initialIndex并调用了scrollToIndex,、scrollToItemInGroup或scrollEdge接口。在变更后,initialIndex的生效优先级将低于scrollToIndex、scrollToItemInGroup或scrollEdge的优先级。