• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# FolderStack
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @fenglinbailu-->
5<!--Designer: @lanshouren-->
6<!--Tester: @liuli0427-->
7<!--Adviser: @HelloCrease-->
8
9FolderStack继承于Stack(层叠布局)控件,新增了<!--RP1-->折叠屏悬停<!--RP1End-->能力,通过在配置项[FolderStackOptions](#folderstackoptions18对象说明)的upperItems数组上设置子组件id,使相应子组件自动避让折叠屏折痕区后移到上半屏。
10
11>  **说明:**
12>
13>  该组件从API version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
14>
15>  该组件的悬停态能力针对<!--RP2-->双折叠<!--RP2End-->设计,只在双折叠设备生效。
16>
17>  当该组件的父组件为[if/else条件渲染节点](../../../ui/state-management/arkts-rendering-control-ifelse.md)时,折叠屏悬停能力将会失效。
18
19
20## 子组件
21
22可以包含多个子组件。
23
24
25## 接口
26
27FolderStack(options?: FolderStackOptions)
28
29**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
30
31**系统能力:** SystemCapability.ArkUI.ArkUI.Full
32
33**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
34
35**参数:**
36
37| 参数名       | 类型                                    | 必填 | 说明                                                                 |
38| ------------ | ------------------------------------------- | ---- |----------------------------------------------------------------------|
39| options |  [FolderStackOptions](#folderstackoptions18对象说明) | 否   | FolderStack的配置项。 |
40
41## FolderStackOptions<sup>18+</sup>对象说明
42
43> **说明:**
44>
45> 为规范匿名对象的定义,API 18版本修改了此处的元素定义。其中,保留了历史匿名对象的起始版本信息,会出现外层元素@since版本号高于内层元素版本号的情况,但这不影响接口的使用。
46
47**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
48
49**系统能力:** SystemCapability.ArkUI.ArkUI.Full
50
51**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
52
53| 名称 | 类型 | 只读 | 可选 | 说明 |
54| -------- | -------- | -------- | -------- | -------- |
55| upperItems<sup>11+</sup> |    Array<string\>  | 否 | 是  | FolderStack的配置项。<br/>upperItems:定义悬停态会被移到上半屏的子组件的id,组件id在此数组中的子组件悬停触发时自动避让折叠屏折痕区后移到上半屏,其它组件堆叠在下半屏区域。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
56
57## 属性
58
59>  **说明:**
60>
61>  设置offset和margin属性,可能会导致上下半屏遮挡折痕区,不建议开发者使用。
62
63除支持[通用属性](ts-component-general-attributes.md)外,还支持以下属性:
64
65### alignContent
66
67alignContent(value: Alignment)
68
69设置子组件在容器内的对齐方式。该属性与[通用属性align](ts-universal-attributes-location.md)同时设置时,后设置的属性生效。
70
71**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
72
73**系统能力:** SystemCapability.ArkUI.ArkUI.Full
74
75**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
76
77**参数:**
78
79| 参数名 | 类型                                        | 必填 | 说明                                                    |
80| ------ | ------------------------------------------- | ---- | ------------------------------------------------------- |
81| value  | [Alignment](ts-appendix-enums.md#alignment) | 是   | 子组件在容器内的对齐方式。<br/>默认值:Alignment.Center <br />非法值:按默认值处理。 |
82
83### enableAnimation
84
85enableAnimation(value: boolean)
86
87设置是否使用默认动效。
88
89**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
90
91**系统能力:** SystemCapability.ArkUI.ArkUI.Full
92
93**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
94
95**参数:**
96
97| 参数名 | 类型                                        | 必填 | 说明                                |
98| ------ | ------------------------------------------- | ---- | ----------------------------------- |
99| value  | boolean | 是   | 是否使用默认动效。<br/>默认值:true,设置true表示使用默认动效,设置false表示不使用默认动效。<br />非法值:按默认值处理。 |
100
101### autoHalfFold
102
103autoHalfFold(value: boolean)
104
105设置是否开启自动旋转,仅在系统自动旋转关闭时该属性生效。
106
107**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
108
109**系统能力:** SystemCapability.ArkUI.ArkUI.Full
110
111**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
112
113**参数:**
114
115| 参数名 | 类型    | 必填 | 说明                                |
116| ------ | ------- | ---- | ----------------------------------- |
117| value  | boolean | 是   | 是否开启自动旋转。<br/>默认值:true,设置true表示FolderStack在[半折叠状态](ts-appendix-enums.md#foldstatus11)进行布局时开启自动旋转,设置false表示关闭自动旋转。该属性不区分设备类型。<br />非法值:按默认值处理。 |
118
119## 事件
120
121除支持[通用事件](ts-component-general-events.md)外,还支持以下事件:
122
123### onFolderStateChange
124
125onFolderStateChange(callback: OnFoldStatusChangeCallback)
126
127当折叠状态改变的时候回调,仅在横屏状态下生效。
128
129**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
130
131**系统能力:** SystemCapability.ArkUI.ArkUI.Full
132
133**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
134
135**参数:**
136
137| 参数名     | 类型                                            | 必填 | 说明                 |
138| ---------- | ----------------------------------------------- | ---- | -------------------- |
139| callback | [OnFoldStatusChangeCallback](#onfoldstatuschangecallback18) | 是   | 当前设备的折叠状态。 |
140
141
142### onHoverStatusChange<sup>12+</sup>
143
144onHoverStatusChange(handler: OnHoverStatusChangeCallback)
145
146当悬停状态改变的时候回调。
147
148**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
149
150**系统能力:** SystemCapability.ArkUI.ArkUI.Full
151
152**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
153
154**参数:**
155
156| 参数名     | 类型                                            | 必填 | 说明                 |
157| ---------- | ----------------------------------------------- | ---- | -------------------- |
158| handler | [OnHoverStatusChangeCallback](#onhoverstatuschangecallback18) | 是   | 当悬停状态改变的时候触发回调。 |
159
160## OnHoverStatusChangeCallback<sup>18+</sup>
161
162type OnHoverStatusChangeCallback = (param: HoverEventParam) => void
163
164当悬停状态改变的时候触发回调。
165
166**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
167
168**系统能力:** SystemCapability.ArkUI.ArkUI.Full
169
170**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
171
172**参数:**
173
174| 参数名     | 类型                                            | 必填 | 说明                 |
175| ---------- | ----------------------------------------------- | ---- | -------------------- |
176| param | [HoverEventParam](#hovereventparam12对象说明) | 是   | 当悬停状态改变的时候触发回调。 |
177
178## OnFoldStatusChangeCallback<sup>18+</sup>
179
180type OnFoldStatusChangeCallback = (event: OnFoldStatusChangeInfo) => void
181
182当前设备的折叠状态。
183
184**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
185
186**系统能力:** SystemCapability.ArkUI.ArkUI.Full
187
188**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
189
190**参数:**
191
192| 参数名     | 类型                                            | 必填 | 说明                 |
193| ---------- | ----------------------------------------------- | ---- | -------------------- |
194| event | [OnFoldStatusChangeInfo](#onfoldstatuschangeinfo18) | 是   | 当前设备的折叠状态。 |
195
196
197## OnFoldStatusChangeInfo<sup>18+</sup>
198
199当折叠状态改变的时候回调,仅在横屏状态下生效。
200
201> **说明:**
202>
203> 为规范匿名对象的定义,API 18版本修改了此处的元素定义。其中,保留了历史匿名对象的起始版本信息,会出现外层元素@since版本号高于内层元素版本号的情况,但这不影响接口的使用。
204
205**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
206
207**系统能力:** SystemCapability.ArkUI.ArkUI.Full
208
209**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
210
211| 名称 | 类型 | 只读 | 可选 | 说明 |
212| -------- | -------- | -------- | -------- | -------- |
213| foldStatus<sup>11+</sup> | [FoldStatus](ts-appendix-enums.md#foldstatus11) | 否 | 否   | 当前设备的折叠状态。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
214
215## HoverEventParam<sup>12+</sup>对象说明
216
217**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
218
219**系统能力:** SystemCapability.ArkUI.ArkUI.Full
220
221**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
222
223| 名称 | 类型 | 只读 | 可选 | 说明 |
224| -------- | -------- | -------- | -------- | -------- |
225| foldStatus       | [FoldStatus](ts-appendix-enums.md#foldstatus11)             | 否 | 否   | 当前设备的折叠状态。 |
226| isHoverMode      | boolean                                                     | 否 | 否   | 当前是否为悬停态。设置为true时表示当前为悬停态,设置为false时表示当前为非悬停态。  |
227| appRotation      | [AppRotation](ts-appendix-enums.md#approtation12)           | 否 | 否   | 当前应用方向。    |
228| windowStatusType | [WindowStatusType](#windowstatustype12) | 否 | 否   | 窗口模式枚举。    |
229
230## WindowStatusType<sup>12+</sup>
231
232type WindowStatusType = WindowStatusType
233
234窗口模式枚举。
235
236**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
237
238**系统能力:** SystemCapability.ArkUI.ArkUI.Full
239
240**设备行为差异:** 该接口在Wearable设备上使用时,应用程序运行异常,异常信息中提示接口未定义,在其他设备中可正常调用。
241
242| 类型        | 说明                 |
243| ---------- | ---------------------|
244| [WindowStatusType](../arkts-apis-window-e.md#windowstatustype11)  | 窗口模式枚举。 |
245
246## 示例
247
248### 示例1(FolderStack折叠屏悬停能力)
249
250该示例实现了折叠屏悬停能力。
251
252```ts
253@Entry
254@Component
255struct Index {
256  @State len_wid: number = 480
257  @State w: string = "40%"
258
259  build() {
260    Column() {
261      // upperItems将所需要的悬停到上半屏的id放入upperItems传入,其余组件会堆叠在下半屏区域
262      FolderStack({ upperItems: ["upperitemsId"] }) {
263        // 此Column会自动上移到上半屏
264        Column() {
265          Text("video zone").height("100%").width("100%").textAlign(TextAlign.Center).fontSize(25)
266        }.backgroundColor('rgb(0, 74, 175)').width("100%").height("100%").id("upperitemsId")
267
268        // 下列两个Column堆叠在下半屏区域
269        Column() {
270          Text("video title")
271            .width("100%")
272            .height(50)
273            .textAlign(TextAlign.Center)
274            .backgroundColor('rgb(213, 213, 213)')
275            .fontSize(25)
276        }.width("100%").height("100%").justifyContent(FlexAlign.Start)
277
278        Column() {
279          Text("video bar ")
280            .width("100%")
281            .height(50)
282            .textAlign(TextAlign.Center)
283            .backgroundColor('rgb(213, 213, 213)')
284            .fontSize(25)
285        }.width("100%").height("100%").justifyContent(FlexAlign.End)
286      }
287      .backgroundColor('rgb(39, 135, 217)')
288      // 是否启动动效
289      .enableAnimation(true)
290      // 是否自动旋转
291      .autoHalfFold(true)
292      // folderStack回调 当折叠状态改变时回调
293      .onFolderStateChange((msg) => {
294        if (msg.foldStatus === FoldStatus.FOLD_STATUS_EXPANDED) {
295          console.info("The device is currently in the expanded state")
296        } else if (msg.foldStatus === FoldStatus.FOLD_STATUS_HALF_FOLDED) {
297          console.info("The device is currently in the half folded state")
298        } else {
299          // .............
300        }
301      })
302      // hoverStatusChange回调 当悬停状态改变时回调
303      .onHoverStatusChange((msg) => {
304        console.info('this foldStatus:' + msg.foldStatus);
305        console.info('this isHoverMode:' + msg.isHoverMode);
306        console.info('this appRotation:' + msg.appRotation);
307        console.info('this windowStatusType:' + msg.windowStatusType);
308      })
309      // folderStack如果不撑满页面全屏,作为普通Stack使用
310      .alignContent(Alignment.Bottom)
311      .height("100%")
312      .width("100%")
313      .backgroundColor('rgb(39, 135, 217)')
314
315    }
316    .height("100%")
317    .width("100%")
318    .borderWidth(1)
319    .borderColor('rgb(213, 213, 213)')
320    .backgroundColor('rgb(0, 74, 175)')
321    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])
322  }
323}
324```
325**图1** 横屏展开
326</br> ![FolderStack01.png](figures/FolderStack01.png)
327</br> **图2** 横屏半折叠
328</br> ![FolderStack02.png](figures/FolderStack02.png)
329
330### 示例2(使用attributeModifier动态设置FolderStack组件的属性及方法)
331
332该示例展示了如何使用attributeModifier动态设置FolderStack组件的onFolderStateChange和onHoverStatusChange方法。
333
334```ts
335// xxx.ets
336class MyFolderStackModifier implements AttributeModifier<FolderStackAttribute> {
337  applyNormalAttribute(instance: FolderStackAttribute): void {
338    // folderStack回调 当折叠状态改变时回调
339    instance.onFolderStateChange((msg) => {
340      if (msg.foldStatus === FoldStatus.FOLD_STATUS_EXPANDED) {
341        console.info("The device is currently in the expanded state")
342      } else if (msg.foldStatus === FoldStatus.FOLD_STATUS_HALF_FOLDED) {
343        console.info("The device is currently in the half folded state")
344      } else if (msg.foldStatus === FoldStatus.FOLD_STATUS_FOLDED) {
345        console.info("The device is currently in the folded state")
346      } else {
347        // .............
348      }
349    })
350    // hoverStatusChange回调 当悬停状态改变时回调
351    instance.onHoverStatusChange((msg) => {
352      console.info('this foldStatus:' + msg.foldStatus);
353      console.info('this isHoverMode:' + msg.isHoverMode);
354      console.info('this appRotation:' + msg.appRotation);
355      console.info('this windowStatusType:' + msg.windowStatusType);
356    })
357  }
358}
359
360@Entry
361@Component
362struct attributeDemo {
363  @State modifier: MyFolderStackModifier = new MyFolderStackModifier()
364
365  build() {
366    Column() {
367      // upperItems将所需要的悬停到上半屏的id放入upperItems传入,其余组件会堆叠在下半屏区域
368      FolderStack({ upperItems: ["upperitemsId"] }) {
369        // 此Column会自动上移到上半屏
370        Column() {
371          Text("video zone").height("100%").width("100%").textAlign(TextAlign.Center).fontSize(25)
372        }.backgroundColor('rgb(0, 74, 175)').width("100%").height("100%").id("upperitemsId")
373
374        // 下列两个Column堆叠在下半屏区域
375        Column() {
376          Text("video title")
377            .width("100%")
378            .height(50)
379            .textAlign(TextAlign.Center)
380            .backgroundColor('rgb(213, 213, 213)')
381            .fontSize(25)
382        }.width("100%").height("100%").justifyContent(FlexAlign.Start)
383
384        Column() {
385          Text("video bar ")
386            .width("100%")
387            .height(50)
388            .textAlign(TextAlign.Center)
389            .backgroundColor('rgb(213, 213, 213)')
390            .fontSize(25)
391        }.width("100%").height("100%").justifyContent(FlexAlign.End)
392      }
393      .backgroundColor('rgb(39, 135, 217)')
394      // 是否启动动效
395      .enableAnimation(true)
396      // 是否自动旋转
397      .autoHalfFold(true)
398      .attributeModifier(this.modifier)
399      // folderStack如果不撑满页面全屏,作为普通Stack使用
400      .alignContent(Alignment.Bottom)
401      .height("100%")
402      .width("100%")
403      .backgroundColor('rgb(39, 135, 217)')
404    }
405    .height("100%")
406    .width("100%")
407    .borderWidth(1)
408    .borderColor('rgb(213, 213, 213)')
409    .backgroundColor('rgb(0, 74, 175)')
410    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])
411  }
412}
413```
414
415**图1** 横屏展开
416</br> 预期日志:
417</br> The device is currently in the expanded state
418</br> this foldStatus:1
419</br> this isHoverMode:0
420</br> this appRotation:3
421</br> this windowStatusType:1
422</br> ![FolderStack03](figures/FolderStack03.png)
423</br> **图2** 横屏半折叠
424</br> 预期日志:
425</br> The device is currently in the half folded state
426</br> this foldStatus:3
427</br> this isHoverMode:1
428</br> this appRotation:3
429</br> this windowStatusType:1
430</br> ![FolderStack04](figures/FolderStack04.png)