【LVGL-Flex布局和Grid布局】

■ Flex 布局

Flex 布局,是一种可以简便、完整、响应式地实现各种页面布局, 它是 CSS 的一个重点应用。
flexbox 一次只能处理一个维度上的元素布局,一行或者一列,Grid 布局是一种二维布局
在 lv_conf.h 文件中把 LV_USE_FLEX 配置项置 1 即可启用 Flex 布局

■ 主轴 : 是定义对象的放置方向的

主轴的定义描述
LV_FLEX_FLOW_ROW将子类们排成一行并不换行
LV_FLEX_FLOW_ROW_WRAP将子类们排成一行并换行
LV_FLEX_FLOW_ROW_REVERSE将子类们排成一行并不换行且顺序相反
LV_FLEX_FLOW_ROW_WRAP_REVERSE将子类们排成一行并换行且顺序相反
LV_FLEX_FLOW_COLUMN将子类们排成一列并不换行
LV_FLEX_FLOW_COLUMN_WRAP将子类们排成一列并换行
LV_FLEX_FLOW_COLUMN_REVERSE将子类们排成一列并不换行且顺序相反
LV_FLEX_FLOW_COLUMN_WRAP_REVERSE将子类们排成一列并换行顺序相反

■ 演示一:LV_FLEX_FLOW_ROW

在这里插入图片描述

■ 演示二:LV_FLEX_FLOW_ROW_WRAP

在这里插入图片描述

■ 演示三:LV_FLEX_FLOW_ROW_REVERSE

在这里插入图片描述

■ 演示四:LV_FLEX_FLOW_ROW_WRAP_REVERSW

在这里插入图片描述

■ 演示五:LV_FLEX_FLOW_COLUMN

在这里插入图片描述

■ 演示六:LV_FLEX_FLOW_COLUMN_WRAP

在这里插入图片描述

■ 演示七:LV_FLEX_FLOW_COLUMN_REVERSE

在这里插入图片描述

■ 演示八:LV_FLEX_FLOW_COLUMN_WRAP_REVERSE

在这里插入图片描述

■ 交叉轴 : 交叉轴垂直于主轴

■ 主轴为行,交叉轴就是列

在这里插入图片描述

■ 主轴为列,交叉轴就是行

在这里插入图片描述

■ Flex 布局使用

使用 Flex 布局有两种方式,
第一种是使用 lv_obj_set_layout 函数方法设置对象启用 Flex 布局,
第二种是使用 lv_obj_set_flex_flow 函数启用 Flex 布局。

void lv_mainstart(void)
{
	/* 第一种方式 */
	static lv_style_t style;
	lv_style_init(&style);
	lv_style_set_flex_flow(&style, LV_FLEX_FLOW_ROW_WRAP);
	
	/* 设置 Flex 布局 */
	lv_style_set_layout(&style, LV_LAYOUT_FLEX);
	lv_obj_t* cont = lv_obj_create(lv_scr_act());
	lv_obj_set_size(cont, 300, 220);
	lv_obj_add_style(cont, &style, 0);
	
	/* 第二种方式 */
	lv_obj_t* cont_row = lv_obj_create(lv_scr_act());
	lv_obj_set_size(cont_row, 300, 220);
	lv_obj_align(cont_row, LV_FLEX_FLOW_ROW, 0, 5);
	
	/* 设置 Flex 布局 */
	lv_obj_set_flex_flow(cont_row, LV_FLEX_FLOW_ROW_WRAP);
	lv_obj_align_to(cont_row, cont, LV_ALIGN_OUT_RIGHT_TOP, 20, 0);
	uint32_t i;
	
	for (i = 0; i < 10; i++) {
		lv_obj_t* obj;
		lv_obj_t* label;
		
		/* 在 cont 容器中添加 btn 对象 */
		obj = lv_btn_create(cont);
		lv_obj_set_size(obj, 100, LV_PCT(100));
		label = lv_label_create(obj);
		lv_label_set_text_fmt(label, "Item: %u", i);
		lv_obj_center(label);
		
		/* 在 cont_row 容器中添加 btn 对象 */
		obj = lv_btn_create(cont_row);
		lv_obj_set_size(obj, 100, LV_PCT(100));
		label = lv_label_create(obj);
		lv_label_set_text_fmt(label, "Item: %u", i);
		lv_obj_center(label);
	}
}

在这里插入图片描述

■ Flex 对齐

设置 flex 元素沿主轴方向和交叉轴方向的对齐方式以及它们之间的空间分配。

lv_obj_set_flex_align(obj, main_place, cross_place, track_cross_place)
obj 指向设置对齐的对象
main_place 主轴上的对象对齐
cross_place 交叉轴上的对象对齐
track_cross_place 行/列交叉轴上的对象对齐

main_place、 cross_place 和 track_cross_place 形参的转入值如下表所示:

配置项描述
LV_FLEX_ALIGN_START水平方向左上和垂直上方向上(默认)
LV_FLEX_ALIGN_END水平方向右侧和垂直底部
LV_FLEX_ALIGN_CENTER居中
LV_FLEX_ALIGN_SPACE_EVENLY任何两个对象之间的间距( 它们的边缘空间相等) ,但不适用于 track_cross_place 形参
LV_FLEX_ALIGN_SPACE_AROUND对象在轨道上均匀分布,周围空间相等,但不适用于 track_cross_place 形参
LV_FLEX_ALIGN_SPACE_BETWEEN对象在轨道上均匀分布:第一个对象在开始行 , 最后 一个 项目 在结 束 行 , 但不 适用 于track_cross_place 形参

track_cross_place 形参只能传入 LV_FLEX_ALIGN_START、 LV_FLEX_ALIGN_END 和LV_FLEX_ALIGN_CENTER 配置项,

■ main_place 形参

在这里插入图片描述

■ track_cross_place 形参

在这里插入图片描述

■ cross_place 形参

cross_place 形参一般在子类对象具有不同的高度时会起作用。

■ flex-grow 属性

LVGL 提供了 lv_obj_set_flex_grow 函数来设置,
第一个形参指向要增长的对象,
第二个形参表示增长的倍数,

例如 有400 像素剩余空间和 3 个对象增长,它们设置分别为 1、 1 和 2,所以它们的宽度分别为 100,100 和 200 像素,如下图所示
在这里插入图片描述
注意: lv_obj_set_flex_grow 函数的第二个形参为 0 时禁用 grow 属性。

■ Flex 条文的样式函数

函数描述
lv_style_set_flex_flow()设置 Flex 流动布局
lv_style_set_flex_main_place()设置主轴
lv_style_set_flex_cross_place()设置交叉轴
lv_style_set_flex_track_place()设置轨道轴
lv_style_set_flex_grow()设置增长

■ Flex 间隙

Flex-gap属性用来设置元素列之间的间隔(gutter)大小,例如修改对象之间的最小空间,
可以在 flex 容器样式上设置以下属性:
① pad_row: 设置行之间的填充。
② pad_column:设置列之间的填充。
如果读者不希望对象之间有任何填充,可调用 lv_style_set_pad_column(&row_container_sty
le,0)函数设置

■ Grid布局

flexbox 一次只能处理一个维度上的元素布局,一行或者一列,Grid 布局是一种二维布局
在 lv_conf.h 文件中把 LV_USE_GRID 配置项置 1 即可启用 Flex 布局

■ 添加 Grid

lv_obj_set_grid_cell 把子类对象添加到指定网格位置
在这里插入图片描述
① GRID_COLUMN_DSC_ARRAY:设置列的描述符数组。
② GRID_ROW_DSC_ARRAY:设置行的描述符数组。
③ GRID_COLUMN_ALIGN:设置列的对象对齐。
④ GRID_ROW_ALIGN:设置列的对象对齐。
⑤ GRID_CELL_X_ALIGN:设置单元格的 X 轴方向对齐。
⑥ GRID_CELL_COLUMN_POS:设置列的单元格位置。
⑦ GRID_CELL_COLUMN_SPAN:设置列的单元格宽度。
⑧ GRID_CELL_Y_ALIGN:设置单元格的 Y 轴方向对齐。
⑨ GRID_CELL_ROW_POS:设置行的单元格位置。
⑩ GRID_CELL_ROW_SPAN:设置行的单元格宽度。
这些函数是使用本地样式来设置 Grid 布局属性

■ Grid 间隙

Grid-gap 属性用来设置元素列之间的间隔( gutter)大小,例如修改对象之间的最小空间,
可以在 Grid 容器样式上设置以下属性:
① pad_row:设置行之间的填充。
② pad_column:设置列之间的填充。

■ 示例一使用Grid

void lv_mainstart(void){
	static lv_coord_t col_dsc[] = { 70, 70, 70, LV_GRID_TEMPLATE_LAST };
	static lv_coord_t row_dsc[] = { 50, 50, 50, LV_GRID_TEMPLATE_LAST };
	/* 创建一个容器 */
	lv_obj_t* cont = lv_obj_create(lv_scr_act());
	/* 设置网格的列数量 */
	lv_obj_set_style_grid_column_dsc_array(cont, col_dsc, 0);
	/* 设置网格的行数量 */
	lv_obj_set_style_grid_row_dsc_array(cont, row_dsc, 0);
	/* 设置容器大小 */
	lv_obj_set_size(cont, 300, 220);
	lv_obj_center(cont);
	/* 开启 GRID 网格 */
	lv_obj_set_layout(cont, LV_LAYOUT_GRID);
	lv_obj_t* obj;
	/* 创建一个 btn 子类 */
	obj = lv_btn_create(cont);
	/* 把 btn 对象添加到网格(0,0)位置 */
	lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, 0,	1,LV_GRID_ALIGN_STRETCH, 0, 1);
	/* 创建一个 switch 子类 */
	obj = lv_switch_create(cont);
	/* 把 btn 对象添加到网格(0,1)位置 */
	lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, 0, 1,LV_GRID_ALIGN_STRETCH, 1, 1);
}

在这里插入图片描述

  • 17
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光芒Shine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值