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 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>|List首次布局将从index为1的ListItem开始布局。</br>| 226 227场景2:List设置initialIndex为0 (默认也是0),并在首次布局前调用scrollEdge(Edge.Bottom)。 228 229| 变更前 | 变更后 | 230|------ |--------| 231|List首次布局将展示在顶部,即index为0的ListItem处于顶部。</br>|List首次布局将展示在底部,即index为最大值的ListItem处于底部。</br>| 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的优先级。