第十三讲_ArkUI栅格布局(GridRow/GrowCol)

1. 栅格布局概述

GridRow 为栅格容器组件,需与栅格子组件 GridCol 联合使用。

  • 栅格布局中将页面划分为等宽的列数和行数
  • 栅格布局中可以调整列与列之间和行与行之间的间距
  • 栅格布局中当页面元素的数量超出了一行或一列的容量时,自动换到下一行或下一列

2. GridRow的使用

2.1 设置栅格布局的总列数

GridRow 中通过 columns 参数设置栅格布局的总列数,columns 等于 12(默认值)。

@Entry
@Component
struct GridRowLayout {
  build() {
    GridRow({columns: 4}) {
      GridCol() {
        Text("第一个GridCol")
      }
      .backgroundColor(Color.Red)

      GridCol() {
        Text("第二个GridCol")
      }
      .backgroundColor(Color.Green)

      GridCol() {
        Text("第三个GridCol")
      }
      .backgroundColor(Color.Blue)

      GridCol() {
        Text("第四个GridCol")
      }
      .backgroundColor(Color.Pink)
    }
  }
}

在这里插入图片描述
示例代码中,设置栅格布局的Columns=4,表示4个GridCol子组件会占用一行。

2.2 设置栅格布局的排列方向

GridRowdirection 参数来指定 GridCol 在栅格容器中的排列方向。

  • GridRowDirection.Row:从左往右排列(默认值)
  • GridRowDirection.RowReverse:从右往左排列
@Entry
@Component
struct GridRowLayout {
  build() {
    GridRow({columns: 4, direction: GridRowDirection.RowReverse}) {
      GridCol() {
        Text("第一个GridCol")
      }
      .backgroundColor(Color.Red)

      GridCol() {
        Text("第二个GridCol")
      }
      .backgroundColor(Color.Green)

      GridCol() {
        Text("第三个GridCol")
      }
      .backgroundColor(Color.Blue)

      GridCol() {
        Text("第四个GridCol")
      }
      .backgroundColor(Color.Pink)
    }
  }
}

在这里插入图片描述

2.3 设置栅格布局中子组件间距

GridRow 中通过 gutter 参数设置子元素在水平(x轴)和垂直(y轴)方向的间距。

@Entry
@Component
struct GridRowLayout {
  build() {
    GridRow({columns: 4, direction: GridRowDirection.RowReverse, gutter: {x: 10, y: 10}}) {
      GridCol() {
        Text("第一个GridCol")
      }
      .backgroundColor(Color.Red)

      GridCol() {
        Text("第二个GridCol")
      }
      .backgroundColor(Color.Green)

      GridCol() {
        Text("第三个GridCol")
      }
      .backgroundColor(Color.Blue)

      GridCol() {
        Text("第四个GridCol")
      }
      .backgroundColor(Color.Pink)

      GridCol() {
        Text("第五个GridCol")
      }
      .backgroundColor(Color.Orange)
    }
  }
}

在这里插入图片描述

3. GridCol的使用

3.1 设置一个GridCol占栅格布局的列数

GridCol 中通过 span 参数设置在栅格布局中占的列数,span 等于 1(默认值)。

@Entry
@Component
struct GridRowLayout {
  build() {
    GridRow({columns: 4, direction: GridRowDirection.RowReverse, gutter: {x: 10, y: 10}}) {
      GridCol() {
        Text("第一个GridCol")
      }
      .backgroundColor(Color.Red)

      GridCol() {
        Text("第二个GridCol")
      }
      .backgroundColor(Color.Green)

      GridCol() {
        Text("第三个GridCol")
      }
      .backgroundColor(Color.Blue)

      GridCol() {
        Text("第四个GridCol")
      }
      .backgroundColor(Color.Pink)

      // 设置一个GridCol占栅格布局的4列
      GridCol({span: 4}) {
        Text("第五个GridCol")
      }
      .backgroundColor(Color.Orange)
    }
  }
}

在这里插入图片描述

3.2 设置GridCol在栅格布局中偏移列数

GridCol 中通过 offset 参数设置在栅格布局中偏移的列数,offset 等于 0(默认值)。

@Entry
@Component
struct GridRowLayout {
  build() {
    GridRow({columns: 4, direction: GridRowDirection.RowReverse, gutter: {x: 10, y: 10}}) {
      GridCol() {
        Text("第一个GridCol")
      }
      .backgroundColor(Color.Red)

      GridCol() {
        Text("第二个GridCol")
      }
      .backgroundColor(Color.Green)

      GridCol() {
        Text("第三个GridCol")
      }
      .backgroundColor(Color.Blue)

      GridCol() {
        Text("第四个GridCol")
      }
      .backgroundColor(Color.Pink)

      // 设置一个GridCol占栅格布局的2列
      // 设置GridCol偏移1列
      GridCol({span: 2, offset: 1}) {
        Text("第五个GridCol")
      }
      .backgroundColor(Color.Orange)
    }
  }
}

在这里插入图片描述

3.3 设置GridCol在栅格布局中顺序

GridCol 中通过 order 参数设置在栅格布局中排列顺序,order 等于0(默认)。order 较小的组件在前,较大的在后。没有设置order参数的,按照代码的先后顺序排列。

@Entry
@Component
struct GridRowLayout {
  build() {
    GridRow({columns: 4, gutter: {x: 10, y: 10}}) {
      GridCol() {
        Text("第一个GridCol")
      }
      .backgroundColor(Color.Red)
      
      // 设置GridCol的order为0
      GridCol({order: 0}) {
        Text("第二个GridCol")
      }
      .backgroundColor(Color.Green)

      // 设置GridCol的order为1
      GridCol({order: 1}) {
        Text("第三个GridCol")
      }
      .backgroundColor(Color.Blue)

      GridCol() {
        Text("第四个GridCol")
      }
      .backgroundColor(Color.Pink)

      // 设置一个GridCol占栅格布局的2列
      // 设置GridCol偏移1列
      // 设置GridCol的顺序为1
      GridCol({span: 2, offset: 1, order: 2}) {
        Text("第五个GridCol")
      }
      .backgroundColor(Color.Orange)
    }
  }
}

在这里插入图片描述

示例代码中,第一个GridCol子组件没有设置orderorder默认等于0;第二个GridCol子组件设置order等于0;第三个GridCol子组件设置order等于1;第四个GridCol子组件没有设置orderorder默认等于0;第五个GridCol子组件设置order等于2。所以最终显示的顺序为:第一个GridCol、第二个GridCol、第四个GridCol、第三个GridCol、第五个GridCol

4. 栅格系统断点

栅格系统以设备的水平宽度作为断点依据,定义设备的宽度类型,形成了一套断点规则。

栅格系统默认断点将设备宽度分为 xs、sm、md、lg 四类:

  • xs:最小宽度类型设备[0, 320)
  • sm:小宽度类型设备[320, 520)
  • md:中等宽度类型设备[520, 840)
  • lg:大宽度类型设备[840, +∞)

4.1 GridRow 自定义断点

GridRow 中通过 breakpoints 参数自定义修改断点的取值范围,最多支持 6 个断点:

  • xs:最小宽度类型设备
  • sm:小宽度类型设备
  • md:中等宽度类型设备
  • lg:大宽度类型设备
  • xl:特大宽度类型设备
  • xxl:超大宽度类型设备
GridRow({
  breakpoints: {
    // 表示启用xs、sm、md、lg、xl、xxl共6个断点,小于200vp为xs,200vp-300vp为sm,300vp-400vp为md,4000vp-500vp为lg,500vp-600vp为xl,大于600vp为xxl
    value: ["200vp", "300vp", "400vp", "500vp", "600vp"],
    reference: BreakpointsReference.WindowSize,
  },
});

4.2 应用断点适配不同宽度设备

GridRow 的 columns 参数,GridCol 的 span、offset 参数可以根据断点分别设置不同的值。

例如:GridRow 的 columns 参数设置

  • xs(最小宽度类型设备)时,栅格布局的列数为2
  • sm(小宽度类型设备)时,栅格布局的列数为2
  • md(中等宽度类型设备)时,栅格布局的列数为4
  • lg(大宽度类型设备)时,栅格布局的列数为4
@Entry
@Component
struct GridRowLayout {
  build() {
    GridRow({
      columns: {
        xs: 2,
        sm: 2,
        md: 4,
        lg: 4
      }
    }) {
      GridCol() {
        Text("第一个GridCol")
      }
      .backgroundColor(Color.Red)

      GridCol({order: 0}) {
        Text("第二个GridCol")
      }
      .backgroundColor(Color.Green)

      GridCol({order: 1}) {
        Text("第三个GridCol")
      }
      .backgroundColor(Color.Blue)

      GridCol() {
        Text("第四个GridCol")
      }
      .backgroundColor(Color.Pink)

    }
  }
}

在这里插入图片描述

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
void lv_example_scroll_2_dir(void) { #if 1 lv_obj_t* cont = lv_obj_create(lv_scr_act()); lv_obj_set_size(cont, 400, 300); lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE); /*Allow max 1 page swipe*/ lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER); /*Snap a page to the center*/ lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); lv_obj_add_event_cb(cont, scroll_end_event, LV_EVENT_SCROLL_BEGIN/*LV_EVENT_ALL*//*LV_EVENT_SCROLL*//*LV_EVENT_SCROLL_END*/, NULL); lv_obj_add_event_cb(cont, scroll_end_event, LV_EVENT_SCROLL_END, NULL); lv_obj_center(cont); /*A grid for the left center and right pages*/ lv_coord_t col_dsc[] = { LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST }; lv_coord_t row_dsc[] = { LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST }; lv_obj_set_grid_dsc_array(cont, col_dsc, row_dsc); /*Create 5 pages*/ for (int i = 0; i < 10; i++) { lv_obj_t* obj = lv_obj_create(cont); lv_obj_set_size(obj, lv_pct(33), lv_pct(100)); lv_obj_t* label = lv_label_create(obj); lv_label_set_text_fmt(label, "Page %d", i); lv_obj_set_style_border_width(obj, 0, 0); } /*Page 2, 3 hidden, page 4, 0, 1 are placed to the grid */ //lv_obj_add_flag(lv_obj_get_child(cont, 2), LV_OBJ_FLAG_HIDDEN); //lv_obj_add_flag(lv_obj_get_child(cont, 3), LV_OBJ_FLAG_HIDDEN); //lv_obj_set_grid_cell(lv_obj_get_child(cont, 4), LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_CENTER, 0, 1); //lv_obj_set_grid_cell(lv_obj_get_child(cont, 0), LV_GRID_ALIGN_CENTER, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1); //lv_obj_set_grid_cell(lv_obj_get_child(cont, 1), LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 0), LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 1), LV_GRID_ALIGN_CENTER, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 2), LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 3), LV_GRID_ALIGN_CENTER, 3, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 4), LV_GRID_ALIGN_CENTER, 4, 1, LV_GRID_ALIGN_CENTER, 0, 1); /*Be sure page 0 is centered*/ lv_obj_scroll_to_view(lv_obj_get_child(cont, 0), LV_ANIM_OFF); }帮我注释一下这段代码
05-31
这段代码是 LittlevGL (LVGL)的示例代码,实现了一个可以左右滑动的页面(类似于轮播图),页面可以居对齐。下面是代码注释: ```C void lv_example_scroll_2_dir(void) { /*创建一个容器,作为滑动页面的容器*/ lv_obj_t* cont = lv_obj_create(lv_scr_act()); lv_obj_set_size(cont, 400, 300); /*设置容器只能左右滑动一页*/ lv_obj_add_flag(cont, LV_OBJ_FLAG_SCROLL_ONE); /*设置容器滑动时,页面停留在心*/ lv_obj_set_scroll_snap_x(cont, LV_SCROLL_SNAP_CENTER); /*关闭滚动条*/ lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); /*容器添加滑动事件*/ lv_obj_add_event_cb(cont, scroll_end_event, LV_EVENT_SCROLL_BEGIN/*LV_EVENT_ALL*//*LV_EVENT_SCROLL*//*LV_EVENT_SCROLL_END*/, NULL); lv_obj_add_event_cb(cont, scroll_end_event, LV_EVENT_SCROLL_END, NULL); /*容器居*/ lv_obj_center(cont); /*创建一个网格,用于布局页面*/ lv_coord_t col_dsc[] = { LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST }; lv_coord_t row_dsc[] = { LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST }; lv_obj_set_grid_dsc_array(cont, col_dsc, row_dsc); /*创建 10 个页面*/ for (int i = 0; i < 10; i++) { lv_obj_t* obj = lv_obj_create(cont); lv_obj_set_size(obj, lv_pct(33), lv_pct(100)); lv_obj_t* label = lv_label_create(obj); lv_label_set_text_fmt(label, "Page %d", i); lv_obj_set_style_border_width(obj, 0, 0); } /*将第 0、1、2、3、4 个页面放到网格,使它们居*/ lv_obj_set_grid_cell(lv_obj_get_child(cont, 0), LV_GRID_ALIGN_CENTER, 0, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 1), LV_GRID_ALIGN_CENTER, 1, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 2), LV_GRID_ALIGN_CENTER, 2, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 3), LV_GRID_ALIGN_CENTER, 3, 1, LV_GRID_ALIGN_CENTER, 0, 1); lv_obj_set_grid_cell(lv_obj_get_child(cont, 4), LV_GRID_ALIGN_CENTER, 4, 1, LV_GRID_ALIGN_CENTER, 0, 1); /*将第 2、3 个页面隐藏*/ //lv_obj_add_flag(lv_obj_get_child(cont, 2), LV_OBJ_FLAG_HIDDEN); //lv_obj_add_flag(lv_obj_get_child(cont, 3), LV_OBJ_FLAG_HIDDEN); /*将页面 0 居显示*/ lv_obj_scroll_to_view(lv_obj_get_child(cont, 0), LV_ANIM_OFF); } ``` 注释已经解释了每一行代码的作用,其有些代码是被注释掉了的,这可能是作者在开发过程的调试代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值