【鸿蒙next开辟】ArkUI框架:ArkTS组件-FoldSplitContainer

打印 上一主题 下一主题

主题 1962|帖子 1962|积分 5886

 往期鸿蒙5.0全套实战文章必看:(文中附带鸿蒙5.0全栈学习资料)



  • 鸿蒙开辟核心知识点,看这篇文章就够了
  • 最新版!鸿蒙HarmonyOS Next应用开辟实战学习门路
  • 鸿蒙HarmonyOS NEXT开辟技术最全学习门路指南
  • 鸿蒙应用开辟实战项目,看这一篇文章就够了(部分项目附源码)

FoldSplitContainer

FoldSplitContainer分栏结构,实现折叠屏二分栏、三分栏在展开态、悬停态以及折叠态的地区控制。
   说明
  该组件从API Version 12开始支持。后续版本如有新增内容,则接纳上角标单独标记该内容的起始版本。
  子组件


FoldSplitContainer

FoldSplitContainer({
primary: Callback<void>,
secondary: Callback<void>,
extra?: Callback<void>,
expandedLayoutOptions: ExpandedRegionLayoutOptions,
hoverModeLayoutOptions: HoverModeRegionLayoutOptions,
foldedLayoutOptions: FoldedRegionLayoutOptions,
animationOptions?: AnimateParam,
onHoverStatusChange?: OnHoverStatusChangeHandler
})
装饰器范例:@Component
元服务API: 从API version 12开始,该接口支持在元服务中利用。
系统本领: SystemCapability.ArkUI.ArkUI.Full
参数:
名称参数范例必填装饰器范例说明primary()=>void是@BuilderParam重要地区回调函数。secondary()=>void是@BuilderParam次要地区回调函数。extra()=>void否@BuilderParam扩展地区回调函数,不传入的环境,没有对应地区。expandedLayoutOptionsExpandedRegionLayoutOptions是@Prop展开态结构信息。hoverModeLayoutOptionsHoverModeRegionLayoutOptions是@Prop悬停态结构信息。foldedLayoutOptionsFoldedRegionLayoutOptions是@Prop折叠态结构信息。animationOptionsAnimateParam | null否@Prop设置动画效果相关的参数,null表现表现关闭动效。onHoverStatusChangeOnHoverStatusChangeHandler否-折叠屏进入或退出悬停模式时触发的回调函数。 ExpandedRegionLayoutOptions

装饰器范例:@Prop
元服务API: 从API version 12开始,该接口支持在元服务中利用。
系统本领: SystemCapability.ArkUI.ArkUI.Full
展开态结构信息。
名称范例必填说明isExtraRegionPerpendicularboolean否扩展地区是否从上到下贯穿整个组件,当且仅当extra有效时此字段才生效。默认值:true。verticalSplitRationumber否重要地区与次要地区之间的高度比例。默认值:PresetSplitRatio.LAYOUT_1V1。horizontalSplitRationumber否重要地区与扩展地区之间的宽度比例,当且仅当extra有效时此字段才生效。默认值:PresetSplitRatio.LAYOUT_3V2。extraRegionPositionExtraRegionPosition否扩展地区的位置信息,当且仅当isExtraRegionPerpendicular = false有效时此字段才生效。默认值:ExtraRegionPosition.top。 HoverModeRegionLayoutOptions

装饰器范例:@Prop
元服务API: 从API version 12开始,该接口支持在元服务中利用。
系统本领: SystemCapability.ArkUI.ArkUI.Full
悬停态结构信息。
名称范例必填说明showExtraRegionboolean否可折叠屏幕在半折叠状态下是否显示扩展地区。默认值:false。horizontalSplitRationumber否重要地区与扩展地区之间的宽度比例,当且仅当extra有效时此字段才生效。默认值:PresetSplitRatio.LAYOUT_3V2。extraRegionPositionExtraRegionPosition否扩展地区的位置信息,当且仅当showExtraRegion时此字段才生效。默认值:ExtraRegionPosition.top。   说明
  1.装备处于悬停态时,存在避让地区,结构计算需要考虑避让地区对结构的影响。
  2.在悬停模式下,屏幕上半部分用于显示,下半部分用于操作。
  FoldedRegionLayoutOptions

装饰器范例:@Prop
元服务API: 从API version 12开始,该接口支持在元服务中利用。
系统本领: SystemCapability.ArkUI.ArkUI.Full
折叠态结构信息。
名称范例必填说明verticalSplitRationumber是重要地区与次要地区之间的高度比例。默认值:PresetSplitRatio.LAYOUT_1V1。 OnHoverStatusChangeHandler

元服务API: 从API version 12开始,该接口支持在元服务中利用。
onHoverStatusChange事故处理。
名称范例必填说明callback(status: HoverModeStatus) => void是折叠屏进入或退出悬停模式时触发的回调函数。 HoverModeStatus

元服务API: 从API version 12开始,该接口支持在元服务中利用。
系统本领: SystemCapability.ArkUI.ArkUI.Full
折叠态结构信息。
名称范例必填说明foldStatusFoldStatus10+是装备的折叠状态。isHoverModeboolean是app当前是否处于悬停态。appRotationnumber是应用旋转角度。windowStatusTypeWindowStatusType11+是窗口模式。 ExtraRegionPosition

元服务API: 从API version 12开始,该接口支持在元服务中利用。
扩展地区位置信息。
名称值描述top1扩展地区在组件上半地区。bottom2扩展地区在组件下半地区。 PresetSplitRatio

元服务API: 从API version 12开始,该接口支持在元服务中利用。
地区比例。
名称值描述LAYOUT_1V111:1比例。LAYOUT_3V21.53:2比例。LAYOUT_2V30.66666666666666662:3比例。 示例

示例1(设置二分栏)

该示例实现了折叠屏二分栏在展开态、悬停态以及折叠态的地区控制。
  1. import { FoldSplitContainer } from '@kit.ArkUI';
  2. @Entry
  3. @Component
  4. struct TwoColumns {
  5.   @Builder
  6.   privateRegion() {
  7.     Text("Primary")
  8.       .backgroundColor('rgba(255, 0, 0, 0.1)')
  9.       .fontSize(28)
  10.       .textAlign(TextAlign.Center)
  11.       .height('100%')
  12.       .width('100%')
  13.   }
  14.   @Builder
  15.   secondaryRegion() {
  16.     Text("Secondary")
  17.       .backgroundColor('rgba(0, 255, 0, 0.1)')
  18.       .fontSize(28)
  19.       .textAlign(TextAlign.Center)
  20.       .height('100%')
  21.       .width('100%')
  22.   }
  23.   build() {
  24.     RelativeContainer() {
  25.       FoldSplitContainer({
  26.         primary: () => {
  27.           this.privateRegion()
  28.         },
  29.         secondary: () => {
  30.           this.secondaryRegion()
  31.         }
  32.       })
  33.     }
  34.     .height('100%')
  35.     .width('100%')
  36.   }
  37. }
复制代码
折叠态展开态悬停态

  

  

  示例2(设置三分栏)

该示例实现了折叠屏三分栏在展开态、悬停态以及折叠态的地区控制。
  1. import { FoldSplitContainer } from '@kit.ArkUI';
  2. @Entry
  3. @Component
  4. struct ThreeColumns {
  5.   @Builder
  6.   privateRegion() {
  7.     Text("Primary")
  8.       .backgroundColor('rgba(255, 0, 0, 0.1)')
  9.       .fontSize(28)
  10.       .textAlign(TextAlign.Center)
  11.       .height('100%')
  12.       .width('100%')
  13.   }
  14.   @Builder
  15.   secondaryRegion() {
  16.     Text("Secondary")
  17.       .backgroundColor('rgba(0, 255, 0, 0.1)')
  18.       .fontSize(28)
  19.       .textAlign(TextAlign.Center)
  20.       .height('100%')
  21.       .width('100%')
  22.   }
  23.   @Builder
  24.   extraRegion() {
  25.     Text("Extra")
  26.       .backgroundColor('rgba(0, 0, 255, 0.1)')
  27.       .fontSize(28)
  28.       .textAlign(TextAlign.Center)
  29.       .height('100%')
  30.       .width('100%')
  31.   }
  32.   build() {
  33.     RelativeContainer() {
  34.       FoldSplitContainer({
  35.         primary: () => {
  36.           this.privateRegion()
  37.         },
  38.         secondary: () => {
  39.           this.secondaryRegion()
  40.         },
  41.         extra: () => {
  42.           this.extraRegion()
  43.         }
  44.       })
  45.     }
  46.     .height('100%')
  47.     .width('100%')
  48.   }
  49. }
复制代码
折叠态展开态悬停态

  

  

  示例3(展开态结构信息)

该示例通过设置ExpandedRegionLayoutOptions实现折叠屏展开态的结构信息。
  1. import {
  2.   FoldSplitContainer,
  3.   PresetSplitRatio,
  4.   ExtraRegionPosition,
  5.   ExpandedRegionLayoutOptions,
  6.   HoverModeRegionLayoutOptions,
  7.   FoldedRegionLayoutOptions
  8. } from '@kit.ArkUI';
  9. @Component
  10. struct Region {
  11.   @Prop title: string;
  12.   @BuilderParam content: () => void;
  13.   @Prop compBackgroundColor: string;
  14.   build() {
  15.     Column({ space: 8 }) {
  16.       Text(this.title)
  17.         .fontSize("24fp")
  18.         .fontWeight(600)
  19.       Scroll() {
  20.         this.content()
  21.       }
  22.       .layoutWeight(1)
  23.       .width("100%")
  24.     }
  25.     .backgroundColor(this.compBackgroundColor)
  26.     .width("100%")
  27.     .height("100%")
  28.     .padding(12)
  29.   }
  30. }
  31. const noop = () => {
  32. };
  33. @Component
  34. struct SwitchOption {
  35.   @Prop label: string = ""
  36.   @Prop value: boolean = false
  37.   public onChange: (checked: boolean) => void = noop;
  38.   build() {
  39.     Row() {
  40.       Text(this.label)
  41.       Blank()
  42.       Toggle({ type: ToggleType.Switch, isOn: this.value })
  43.         .onChange((isOn) => {
  44.           this.onChange(isOn);
  45.         })
  46.     }
  47.     .backgroundColor(Color.White)
  48.     .borderRadius(8)
  49.     .padding(8)
  50.     .width("100%")
  51.   }
  52. }
  53. interface RadioOptions {
  54.   label: string;
  55.   value: Object | undefined | null;
  56.   onChecked: () => void;
  57. }
  58. @Component
  59. struct RadioOption {
  60.   @Prop label: string;
  61.   @Prop value: Object | undefined | null;
  62.   @Prop options: Array<RadioOptions>;
  63.   build() {
  64.     Row() {
  65.       Text(this.label)
  66.       Blank()
  67.       Column({ space: 4 }) {
  68.         ForEach(this.options, (option: RadioOptions) => {
  69.           Row() {
  70.             Radio({
  71.               group: this.label,
  72.               value: JSON.stringify(option.value),
  73.             })
  74.               .checked(this.value === option.value)
  75.               .onChange((checked) => {
  76.                 if (checked) {
  77.                   option.onChecked();
  78.                 }
  79.               })
  80.             Text(option.label)
  81.           }
  82.         })
  83.       }
  84.       .alignItems(HorizontalAlign.Start)
  85.     }
  86.     .alignItems(VerticalAlign.Top)
  87.     .backgroundColor(Color.White)
  88.     .borderRadius(8)
  89.     .padding(8)
  90.     .width("100%")
  91.   }
  92. }
  93. @Entry
  94. @Component
  95. struct Index {
  96.   @State expandedRegionLayoutOptions: ExpandedRegionLayoutOptions = {
  97.     horizontalSplitRatio: PresetSplitRatio.LAYOUT_3V2,
  98.     verticalSplitRatio: PresetSplitRatio.LAYOUT_1V1,
  99.     isExtraRegionPerpendicular: true,
  100.     extraRegionPosition: ExtraRegionPosition.TOP
  101.   };
  102.   @State foldingRegionLayoutOptions: HoverModeRegionLayoutOptions = {
  103.     horizontalSplitRatio: PresetSplitRatio.LAYOUT_3V2,
  104.     showExtraRegion: false,
  105.     extraRegionPosition: ExtraRegionPosition.TOP
  106.   };
  107.   @State foldedRegionLayoutOptions: FoldedRegionLayoutOptions = {
  108.     verticalSplitRatio: PresetSplitRatio.LAYOUT_1V1
  109.   };
  110.   @Builder
  111.   MajorRegion() {
  112.     Region({
  113.       title: "折叠态配置",
  114.       compBackgroundColor: "rgba(255, 0, 0, 0.1)",
  115.     }) {
  116.       Column({ space: 4 }) {
  117.         RadioOption({
  118.           label: "折叠态垂直高度度比",
  119.           value: this.foldedRegionLayoutOptions.verticalSplitRatio,
  120.           options: [
  121.             {
  122.               label: "1:1",
  123.               value: PresetSplitRatio.LAYOUT_1V1,
  124.               onChecked: () => {
  125.                 this.foldedRegionLayoutOptions.verticalSplitRatio = PresetSplitRatio.LAYOUT_1V1
  126.               }
  127.             },
  128.             {
  129.               label: "2:3",
  130.               value: PresetSplitRatio.LAYOUT_2V3,
  131.               onChecked: () => {
  132.                 this.foldedRegionLayoutOptions.verticalSplitRatio = PresetSplitRatio.LAYOUT_2V3
  133.               }
  134.             },
  135.             {
  136.               label: "3:2",
  137.               value: PresetSplitRatio.LAYOUT_3V2,
  138.               onChecked: () => {
  139.                 this.foldedRegionLayoutOptions.verticalSplitRatio = PresetSplitRatio.LAYOUT_3V2
  140.               }
  141.             },
  142.             {
  143.               label: "未定义",
  144.               value: undefined,
  145.               onChecked: () => {
  146.                 this.foldedRegionLayoutOptions.verticalSplitRatio = undefined
  147.               }
  148.             }
  149.           ]
  150.         })
  151.       }
  152.       .constraintSize({ minHeight: "100%" })
  153.     }
  154.   }
  155.   @Builder
  156.   MinorRegion() {
  157.     Region({
  158.       title: "悬停态配置",
  159.       compBackgroundColor: "rgba(0, 255, 0, 0.1)"
  160.     }) {
  161.       Column({ space: 4 }) {
  162.         RadioOption({
  163.           label: "悬停态水平宽度比",
  164.           value: this.foldingRegionLayoutOptions.horizontalSplitRatio,
  165.           options: [
  166.             {
  167.               label: "1:1",
  168.               value: PresetSplitRatio.LAYOUT_1V1,
  169.               onChecked: () => {
  170.                 this.foldingRegionLayoutOptions.horizontalSplitRatio = PresetSplitRatio.LAYOUT_1V1
  171.               }
  172.             },
  173.             {
  174.               label: "2:3",
  175.               value: PresetSplitRatio.LAYOUT_2V3,
  176.               onChecked: () => {
  177.                 this.foldingRegionLayoutOptions.horizontalSplitRatio = PresetSplitRatio.LAYOUT_2V3
  178.               }
  179.             },
  180.             {
  181.               label: "3:2",
  182.               value: PresetSplitRatio.LAYOUT_3V2,
  183.               onChecked: () => {
  184.                 this.foldingRegionLayoutOptions.horizontalSplitRatio = PresetSplitRatio.LAYOUT_3V2
  185.               }
  186.             },
  187.             {
  188.               label: "未定义",
  189.               value: undefined,
  190.               onChecked: () => {
  191.                 this.foldingRegionLayoutOptions.horizontalSplitRatio = undefined
  192.               }
  193.             },
  194.           ]
  195.         })
  196.         SwitchOption({
  197.           label: "悬停态是否显示扩展区",
  198.           value: this.foldingRegionLayoutOptions.showExtraRegion,
  199.           onChange: (checked) => {
  200.             this.foldingRegionLayoutOptions.showExtraRegion = checked;
  201.           }
  202.         })
  203.         if (this.foldingRegionLayoutOptions.showExtraRegion) {
  204.           RadioOption({
  205.             label: "悬停态扩展区位置",
  206.             value: this.foldingRegionLayoutOptions.extraRegionPosition,
  207.             options: [
  208.               {
  209.                 label: "顶部",
  210.                 value: ExtraRegionPosition.TOP,
  211.                 onChecked: () => {
  212.                   this.foldingRegionLayoutOptions.extraRegionPosition = ExtraRegionPosition.TOP
  213.                 }
  214.               },
  215.               {
  216.                 label: "底部",
  217.                 value: ExtraRegionPosition.BOTTOM,
  218.                 onChecked: () => {
  219.                   this.foldingRegionLayoutOptions.extraRegionPosition = ExtraRegionPosition.BOTTOM
  220.                 }
  221.               },
  222.               {
  223.                 label: "未定义",
  224.                 value: undefined,
  225.                 onChecked: () => {
  226.                   this.foldingRegionLayoutOptions.extraRegionPosition = undefined
  227.                 }
  228.               },
  229.             ]
  230.           })
  231.         }
  232.       }
  233.       .constraintSize({ minHeight: "100%" })
  234.     }
  235.   }
  236.   @Builder
  237.   ExtraRegion() {
  238.     Region({
  239.       title: "展开态配置",
  240.       compBackgroundColor: "rgba(0, 0, 255, 0.1)"
  241.     }) {
  242.       Column({ space: 4 }) {
  243.         RadioOption({
  244.           label: "展开态水平宽度比",
  245.           value: this.expandedRegionLayoutOptions.horizontalSplitRatio,
  246.           options: [
  247.             {
  248.               label: "1:1",
  249.               value: PresetSplitRatio.LAYOUT_1V1,
  250.               onChecked: () => {
  251.                 this.expandedRegionLayoutOptions.horizontalSplitRatio = PresetSplitRatio.LAYOUT_1V1
  252.               }
  253.             },
  254.             {
  255.               label: "2:3",
  256.               value: PresetSplitRatio.LAYOUT_2V3,
  257.               onChecked: () => {
  258.                 this.expandedRegionLayoutOptions.horizontalSplitRatio = PresetSplitRatio.LAYOUT_2V3
  259.               }
  260.             },
  261.             {
  262.               label: "3:2",
  263.               value: PresetSplitRatio.LAYOUT_3V2,
  264.               onChecked: () => {
  265.                 this.expandedRegionLayoutOptions.horizontalSplitRatio = PresetSplitRatio.LAYOUT_3V2
  266.               }
  267.             },
  268.             {
  269.               label: "未定义",
  270.               value: undefined,
  271.               onChecked: () => {
  272.                 this.expandedRegionLayoutOptions.horizontalSplitRatio = undefined
  273.               }
  274.             },
  275.           ]
  276.         })
  277.         RadioOption({
  278.           label: "展开态垂直高度度比",
  279.           value: this.expandedRegionLayoutOptions.verticalSplitRatio,
  280.           options: [
  281.             {
  282.               label: "1:1",
  283.               value: PresetSplitRatio.LAYOUT_1V1,
  284.               onChecked: () => {
  285.                 this.expandedRegionLayoutOptions.verticalSplitRatio = PresetSplitRatio.LAYOUT_1V1
  286.               }
  287.             },
  288.             {
  289.               label: "2:3",
  290.               value: PresetSplitRatio.LAYOUT_2V3,
  291.               onChecked: () => {
  292.                 this.expandedRegionLayoutOptions.verticalSplitRatio = PresetSplitRatio.LAYOUT_2V3
  293.               }
  294.             },
  295.             {
  296.               label: "3:2",
  297.               value: PresetSplitRatio.LAYOUT_3V2,
  298.               onChecked: () => {
  299.                 this.expandedRegionLayoutOptions.verticalSplitRatio = PresetSplitRatio.LAYOUT_3V2
  300.               }
  301.             },
  302.             {
  303.               label: "未定义",
  304.               value: undefined,
  305.               onChecked: () => {
  306.                 this.expandedRegionLayoutOptions.verticalSplitRatio = undefined
  307.               }
  308.             }
  309.           ]
  310.         })
  311.         SwitchOption({
  312.           label: "展开态扩展区是否上下贯穿",
  313.           value: this.expandedRegionLayoutOptions.isExtraRegionPerpendicular,
  314.           onChange: (checked) => {
  315.             this.expandedRegionLayoutOptions.isExtraRegionPerpendicular = checked;
  316.           }
  317.         })
  318.         if (!this.expandedRegionLayoutOptions.isExtraRegionPerpendicular) {
  319.           RadioOption({
  320.             label: "展开态扩展区位置",
  321.             value: this.expandedRegionLayoutOptions.extraRegionPosition,
  322.             options: [
  323.               {
  324.                 label: "顶部",
  325.                 value: ExtraRegionPosition.TOP,
  326.                 onChecked: () => {
  327.                   this.expandedRegionLayoutOptions.extraRegionPosition = ExtraRegionPosition.TOP
  328.                 }
  329.               },
  330.               {
  331.                 label: "底部",
  332.                 value: ExtraRegionPosition.BOTTOM,
  333.                 onChecked: () => {
  334.                   this.expandedRegionLayoutOptions.extraRegionPosition = ExtraRegionPosition.BOTTOM
  335.                 }
  336.               },
  337.               {
  338.                 label: "未定义",
  339.                 value: undefined,
  340.                 onChecked: () => {
  341.                   this.expandedRegionLayoutOptions.extraRegionPosition = undefined
  342.                 }
  343.               },
  344.             ]
  345.           })
  346.         }
  347.       }
  348.       .constraintSize({ minHeight: "100%" })
  349.     }
  350.   }
  351.   build() {
  352.     Column() {
  353.       FoldSplitContainer({
  354.         primary: () => {
  355.           this.MajorRegion()
  356.         },
  357.         secondary: () => {
  358.           this.MinorRegion()
  359.         },
  360.         extra: () => {
  361.           this.ExtraRegion()
  362.         },
  363.         expandedLayoutOptions: this.expandedRegionLayoutOptions,
  364.         hoverModeLayoutOptions: this.foldingRegionLayoutOptions,
  365.         foldedLayoutOptions: this.foldedRegionLayoutOptions,
  366.       })
  367.     }
  368.     .width("100%")
  369.     .height("100%")
  370.   }
  371. }
复制代码
折叠态展开态悬停态

  

  

  

  

  

  

  



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

道家人

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表