当前位置:   article > 正文

容器组件:栅格布局,侧边栏容器(HarmonyOS学习第四课【4.5】)

容器组件:栅格布局,侧边栏容器(HarmonyOS学习第四课【4.5】)

栅格布局

栅格布局可以为布局提供规律性的结构,解决多尺寸多设备的动态布局问题,保证不同设备上各个模块的布局一致性。

栅格容器组件,仅可以和栅格子组件(GridCol)在栅格布局场景中使用。

说明

该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

子组件

可以包含GridCol子组件。

接口

GridRow(option?: {columns?: number | GridRowColumnOption, gutter?: Length | GutterOption, breakpoints?: BreakPoints, direction?: GridRowDirection})

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名

类型

必填

说明

gutter

Length | GutterOption

栅格布局间距,x代表水平方向。

columns

number | GridRowColumnOption

设置布局列数。

breakpoints

BreakPoints

设置断点值的断点数列以及基于窗口或容器尺寸的相应参照。

direction

GridRowDirection

栅格布局排列方向。

GutterOption

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数名

参数类型

必填

参数描述

x

Length | GridRowSizeOption

水平gutter option。

y

Length | GridRowSizeOption

竖直gutter option。

GridRowColumnOption

栅格在不同宽度设备类型下,栅格列数。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数名

参数类型

必填

参数描述

xs

number

最小宽度类型设备。

sm

number

小宽度类型设备。

md

number

中等宽度类型设备。

lg

number

大宽度类型设备。

xl

number

特大宽度类型设备。

xxl

number

超大宽度类型设备。

GridRowSizeOption

栅格在不同宽度设备类型下,gutter的大小。

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数名

参数类型

必填

参数描述

xs

Length

最小宽度类型设备。

sm

Length

小宽度类型设备。

md

Length

中等宽度类型设备。

lg

Length

大宽度类型设备。

xl

Length

特大宽度类型设备。

xxl

Length

超大宽度类型设备。

BreakPoints

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数名

参数类型

必填

参数描述

value

Array<string>

设置断点位置的单调递增数组。

默认值:["320vp", "520vp", "840vp"]

reference

BreakpointsReference

断点切换参照物。

  1. // 启用xs、sm、md共3个断点
  2. breakpoints: {value: ["100vp", "200vp"]}
  3. // 启用xs、sm、md、lg共4个断点,断点范围值必须单调递增
  4. breakpoints: {value: ["320vp", "520vp", "840vp"]}
  5. // 启用xs、sm、md、lg、xl共5个断点,断点范围数量不可超过断点可取值数量-1
  6. breakpoints: {value: ["320vp", "520vp", "840vp", "1080vp"]}

 

BreakpointsReference枚举类型

从API version 9开始,该接口支持在ArkTS卡片中使用。

枚举名

描述

WindowSize

以窗口为参照。

ComponentSize

以容器为参照。

GridRowDirection枚举类型

从API version 9开始,该接口支持在ArkTS卡片中使用。

枚举名

描述

Row

栅格元素按照行方向排列。

RowReverse

栅格元素按照逆序行方向排列。

栅格最多支持xs、sm、md、lg、xl、xxl六个断点,且名称不可修改。假设传入的数组是[n0, n1, n2, n3, n4],各个断点取值如下:

断点

取值范围

xs

[0, n0)

sm

[n0, n1)

md

[n1, n2)

lg

[n2, n3)

xl

[n3, n4)

xxl

[n4, INF)

说明:

  • 栅格元素仅支持Row/RowReverse排列,不支持column/ColumnReverse方向排列。
  • 栅格子组件仅能通过span、offset计算子组件位置与大小。多个子组件span超过规定列数时自动换行。
  • 单个元素span大小超过最大列数时后台默认span为最大column数。
  • 新一行的Offset加上子组件的span超过总列数时,将下一个子组件在新的一行放置。
  • 例:Item1: GridCol({ span: 6}), Item2: GridCol({ span: 8, offset:11})

1

2

3

4

5

6

7

8

9

10

11

12

-

-

-

-

-

-

-

-

-

-

-

              

        

属性

支持通用属性

事件

onBreakpointChange

onBreakpointChange(callback: (breakpoints: string) => void)

从API version 9开始,该接口支持在ArkTS卡片中使用。

参数:

参数名

参数类型

必填

说明

breakpoints

string

断点发生变化时触发回调

取值为"xs"、"sm"、"md"、"lg"、"xl"、"xxl"。

官方示例 

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct GridRowExample {
  5. @State bgColors: Color[] = [Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Pink, Color.Grey, Color.Blue, Color.Brown]
  6. @State currentBp: string = 'unknown'
  7. build() {
  8. Column() {
  9. GridRow({
  10. columns: 5,
  11. gutter: { x: 5, y: 10 },
  12. breakpoints: { value: ["400vp", "600vp", "800vp"],
  13. reference: BreakpointsReference.WindowSize },
  14. direction: GridRowDirection.Row
  15. }) {
  16. ForEach(this.bgColors, (color) => {
  17. GridCol({ span: { xs: 1, sm: 2, md: 3, lg: 4 } }) {
  18. Row().width("100%").height("20vp")
  19. }.borderColor(color).borderWidth(2)
  20. })
  21. }.width("100%").height("100%")
  22. .onBreakpointChange((breakpoint) => {
  23. this.currentBp = breakpoint
  24. })
  25. }.width('80%').margin({ left: 10, top: 5, bottom: 5 }).height(200)
  26. .border({ color: '#880606', width: 2 })
  27. }
  28. }

GridContainer定义介绍

  1. interface GridContainerInterface {
  2. (value?: GridContainerOptions): GridContainerAttribute;
  3. }
  4. declare interface GridContainerOptions {
  5. columns?: number | "auto";
  6. sizeType?: SizeType;
  7. gutter?: number | string;
  8. margin?: number | string;
  9. }
  • value:设置布局的可选参数, GridContainerOptions 说明如下:

    • columns:设置当前布局总列数,默认为 auto
    • sizeType:设置选用设备宽度类型, SizeType 参数说明如下:
      • XS:最小宽度类型设备。
      • SM:小宽度类型设备。
      • MD:中等宽度类型设备。
      • LG:大宽度类型设备。
      • Auto(默认值):根据设备类型进行选择。
    • gutter:设置栅格布局列间距。
    • margin:设置栅格布局两侧间距。

    简单样例如下所示:

  1. @Entry @Component struct ComponentTest {
  2. @State sizeType: SizeType = SizeType.XS // 默认采用最小宽度设备类型
  3. build() {
  4. Column() {
  5. GridContainer({
  6. columns: 12, // 设置格栅布局为12列
  7. sizeType: this.sizeType, // 设置格栅布局类型
  8. gutter: 10, // 设置格栅布局列间距,该版本还有bug
  9. margin: 20 // 设计格栅布局两侧间距
  10. }) {
  11. Row() {
  12. Text('1')
  13. .useSizeType({
  14. xs: { span: 6, offset: 0 }, // Text1在xs设备上占用6列
  15. sm: { span: 2, offset: 0 }, // Text1在sm设备上占用2列
  16. md: { span: 2, offset: 0 }, // Text1在md设备上占用2列
  17. lg: { span: 3, offset: 0 } // Text1在lg设备上占用3列
  18. })
  19. .fontSize(20)
  20. .height(50)
  21. .backgroundColor(0x4682B4)
  22. .textAlign(TextAlign.Center)
  23. Text('2')
  24. .useSizeType({
  25. xs: { span: 2, offset: 0 }, // Text2在xs设备上占用2列
  26. sm: { span: 6, offset: 0 }, // Text2在sm设备上占用6列
  27. md: { span: 2, offset: 0 }, // Text2在md设备上占用2列
  28. lg: { span: 3, offset: 0 } // Text2在lg设备上占用3列
  29. })
  30. .fontSize(20)
  31. .height(50)
  32. .backgroundColor(0x00BFFF)
  33. .textAlign(TextAlign.Center)
  34. Text('3')
  35. .useSizeType({
  36. xs: { span: 2, offset: 0 }, // Text3在xs设备上占用2列
  37. sm: { span: 2, offset: 0 }, // Text3在sm设备上占用2列
  38. md: { span: 6, offset: 0 }, // Text3在md设备上占用6列
  39. lg: { span: 3, offset: 0 } // Text3在lg设备上占用3列
  40. })
  41. .fontSize(20)
  42. .height(50)
  43. .backgroundColor(0x4682B4)
  44. .textAlign(TextAlign.Center)
  45. Text('4')
  46. .useSizeType({
  47. xs: { span: 2, offset: 0 }, // Text4在xs设备上占用2列
  48. sm: { span: 2, offset: 0 }, // Text4在sm设备上占用2列
  49. md: { span: 2, offset: 0 }, // Text4在md设备上占用2列
  50. lg: { span: 3, offset: 0 } // Text4在lg设备上占用3列
  51. })
  52. .fontSize(20)
  53. .height(50)
  54. .backgroundColor(0x00BFFF)
  55. .textAlign(TextAlign.Center)
  56. }
  57. }
  58. .backgroundColor(Color.Pink)
  59. .width('90%')
  60. .margin({top: 10})
  61. Row({space: 10}) {
  62. Button('XS')
  63. .onClick(() => {
  64. this.sizeType = SizeType.XS
  65. }).backgroundColor(0x317aff)
  66. Button('SM')
  67. .onClick(() => {
  68. this.sizeType = SizeType.SM
  69. }).backgroundColor(0x317aff)
  70. Button('MD')
  71. .onClick(() => {
  72. this.sizeType = SizeType.MD
  73. }).backgroundColor(0x317aff)
  74. Button('LG')
  75. .onClick(() => {
  76. this.sizeType = SizeType.LG
  77. }).backgroundColor(0x317aff)
  78. }
  79. .margin({top: 10})
  80. }.width('100%')
  81. }
  82. }

侧边栏容器(SideBarContainer)

SideBarContainer 表示侧边栏容器,它可以添加两个子组件,第一个子组件表示侧边栏,第二个子组件表示内容区,本节笔者简单介绍一下 SideBarContainer 的简单使用。

SideBarContainer定义介绍

  1. interface SideBarContainerInterface {
  2. (type?: SideBarContainerType): SideBarContainerAttribute;
  3. }
  • type:设置侧边栏的显示类型, SideBarContainerType 定义了一下 2 中类型:
    • Embed:侧边栏嵌入到组件内,侧边栏和内容区并列显示。
    • Overlay:侧边栏浮在内容区上面。

简单样例如下所示:

  1. @Entry @Component struct SideBarContainerTest {
  2. build() {
  3. SideBarContainer(SideBarContainerType.Overlay) {
  4. Column() {
  5. Text("侧边栏区域")
  6. .width("100%")
  7. .height("100%")
  8. .fontSize(30)
  9. .textAlign(TextAlign.Center)
  10. }
  11. .width(10)
  12. .height("100%")
  13. .backgroundColor("#aabbcc")
  14. Column() {
  15. Text("侧边栏区域")
  16. .width("100%")
  17. .height("100%")
  18. .fontSize(30)
  19. .textAlign(TextAlign.Center)
  20. }
  21. .width("100%")
  22. .height("100%")
  23. .backgroundColor("#bbccaa")
  24. }
  25. .width('100%')
  26. .height('100%')
  27. }
  28. }

样例运行结果如下图所示:

SideBarContainer属性介

  • showSideBar:设置是否显示侧边栏,默认为 true 表示显示侧边栏。
  • controlButton:设置侧边栏控制按钮的属性, ButtonStyle 参数说明如下:
    • left:设置侧边栏控制按钮距离容器左界限的间距。
    • top:设置侧边栏控制按钮距离容器上界限的间距。
    • width:设置侧边栏控制按钮的宽度。
    • height:设置侧边栏控制按钮的高度。
    • icons:设置侧边栏控制按钮的图标:
      • shown:设置侧边栏显示时控制按钮的图标。
      • hidden:设置侧边栏隐藏时控制按钮的图标。
      • switching:设置侧边栏显示和隐藏状态切换时控制按钮的图标。
  • sideBarWidth:设置侧边栏的宽度,默认为 200 。
  • minSideBarWidth:设置侧边栏最小宽度,默认为 200 。
  • maxSideBarWidth:设置侧边栏最大宽度,默认为 280 。

简单样例如下所示:

  1. @Entry @Component struct SideBarContainerTest {
  2. build() {
  3. SideBarContainer(SideBarContainerType.Overlay) { // 设置侧边栏样式为悬浮态
  4. Column() { // 第一个子组件为侧边栏视图
  5. Text("侧边栏区域")
  6. .width("100%")
  7. .height("100%")
  8. .fontSize(30)
  9. .textAlign(TextAlign.Center)
  10. }
  11. .width(10)
  12. .height("100%")
  13. .backgroundColor("#aabbcc")
  14. Column() { // 第二个子组件为内容区视图
  15. Text("内容区域")
  16. .width("100%")
  17. .height("100%")
  18. .fontSize(30)
  19. .textAlign(TextAlign.Center)
  20. }
  21. .width("100%")
  22. .height("100%")
  23. .backgroundColor("#bbccaa")
  24. }
  25. .width('100%')
  26. .height('100%')
  27. .sideBarWidth(150) // 设置侧边栏宽度为150
  28. .minSideBarWidth(100) // 设置侧边栏最小宽度为100
  29. .maxSideBarWidth(200) // 设置侧边栏最大宽度为200
  30. .controlButton({ // 设置侧边栏控制按钮的样式
  31. width: 30, // 设置侧边栏控制按钮宽度为30
  32. height: 30, // 设置侧边栏控制按钮高度为30
  33. top: 15, // 设置侧边栏控制按钮距离容器顶部为15
  34. icons: { // 设置侧边栏控制按钮图片
  35. shown: $r("app.media.icon_back"), // 设置侧边栏显示时控制按钮的图标。
  36. hidden: $r("app.media.icon_menu"), // 设置侧边栏隐藏时控制按钮的图标。
  37. switching: $r("app.media.icon_back") // 设置侧边栏显示和隐藏状态切换时控制按钮的图标。
  38. }
  39. })
  40. }
  41. }

样例运行结果如下图所示:

SideBarContainer事件介绍

  1. declare class SideBarContainerAttribute extends CommonMethod<SideBarContainerAttribute> {
  2. onChange(callback: (value: boolean) => void): SideBarContainerAttribute;
  3. }
  • onChange:当侧边栏的状态在显示和隐藏之间切换时触发回调, value 为 true 表示菜单栏显示显示,false表示菜单栏隐藏。

官方示例

  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct SideBarContainerExample {
  5. normalIcon: Resource = $r("app.media.icon")
  6. selectedIcon: Resource = $r("app.media.icon")
  7. @State arr: number[] = [1, 2, 3]
  8. @State current: number = 1
  9. build() {
  10. SideBarContainer(SideBarContainerType.Embed) {
  11. Column() {
  12. ForEach(this.arr, (item, index) => {
  13. Column({ space: 5 }) {
  14. Image(this.current === item ? this.selectedIcon : this.normalIcon).width(64).height(64)
  15. Text("Index0" + item)
  16. .fontSize(25)
  17. .fontColor(this.current === item ? '#0A59F7' : '#999')
  18. .fontFamily('source-sans-pro,cursive,sans-serif')
  19. }
  20. .onClick(() => {
  21. this.current = item
  22. })
  23. }, item => item)
  24. }.width('100%')
  25. .justifyContent(FlexAlign.SpaceEvenly)
  26. .backgroundColor('#19000000')
  27. Column() {
  28. Text('SideBarContainer content text1').fontSize(25)
  29. Text('SideBarContainer content text2').fontSize(25)
  30. }
  31. .margin({ top: 50, left: 20, right: 30 })
  32. }
  33. .controlButton({
  34. icons: {
  35. hidden: $r('app.media.drawer'),
  36. shown: $r('app.media.drawer'),
  37. switching: $r('app.media.drawer')
  38. }
  39. })
  40. .sideBarWidth(150)
  41. .minSideBarWidth(50)
  42. .maxSideBarWidth(300)
  43. .onChange((value: boolean) => {
  44. console.info('status:' + value)
  45. })
  46. }
  47. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/616380
推荐阅读
相关标签
  

闽ICP备14008679号