发帖
9 0 0

小安派lvgl学习(二)

zzes
金牌会员

5

主题

46

回帖

1597

积分

金牌会员

积分
1597
LVGL教程玩法 1472 9 2024-1-28 22:30:00

lvgl flex布局学习

代码示例

1706450653951.png

  // 纵向flex布局
  lv_obj_t * the_col = lv_obj_create(lv_scr_act());
  lv_obj_clear_flag(the_col, LV_OBJ_FLAG_SCROLLABLE);
  lv_obj_set_size(the_col, 240, 80);
  lv_obj_set_flex_flow(the_col, LV_FLEX_FLOW_COLUMN);
  lv_obj_set_flex_align(the_col, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
  lv_obj_align(the_col, LV_ALIGN_TOP_MID, 0, 0);
  // 标题
  lv_obj_t * main_title = lv_label_create(the_col);
  lv_label_set_text (main_title, "main_title");
  lv_obj_add_style(main_title, &style_title, 0);
  lv_obj_add_style(main_title, &style_text_opacity, 0);

  lv_obj_t * sub_title = lv_label_create(the_col);
  lv_label_set_text (sub_title, "sub_title");
  lv_obj_add_style(sub_title, &style_title, 0);
  lv_obj_add_style(sub_title, &style_text_opacity, 0);

  // 横向flex布局
  lv_obj_t * the_row = lv_obj_create(lv_scr_act());
  lv_obj_clear_flag(the_row, LV_OBJ_FLAG_SCROLLABLE); // 取消滚动条
  lv_obj_set_size(the_row, 240, 60);
  lv_obj_set_flex_flow(the_row, LV_FLEX_FLOW_ROW);
  lv_obj_set_flex_align(the_col, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
  lv_obj_align_to(the_row, the_col, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);

  // 创建按钮1
  lv_obj_t * btn1 = lv_btn_create(the_row);
  // 创建按钮2
  lv_obj_t * btn2 = lv_btn_create(the_row);

  // 给按钮添加文字
  lv_obj_t * label1 = lv_label_create(btn1);
  lv_label_set_text(label1, "FLEXBTN1");

  lv_obj_t * label2 = lv_label_create(btn2);
  lv_label_set_text(label2, "FLEXBTN2");

示例中, 两个文字是纵向flex布局, 两个按钮是横向flex布局

使用 lv_obj_set_flex_flow 方法设置当前的对象为flex布局, 方法第一个参数是当前对象, 第二个参数是排列方向, 一般也就用LV_FLEX_FLOW_ROW 和 LV_FLEX_FLOW_COLUMN

LV_FLEX_FLOW_ROW 将子元素排成一排而不包裹
LV_FLEX_FLOW_COLUMN 将子项放在一列中而不换行
LV_FLEX_FLOW_ROW_WRAP 将孩子排成一排并包裹起来
LV_FLEX_FLOW_COLUMN_WRAP 将子元素放置在带有环绕的列中
LV_FLEX_FLOW_ROW_REVERSE 将子元素排成一行而不换行,但顺序相反
LV_FLEX_FLOW_COLUMN_REVERSE 将子项放在一列中,不换行,但顺序相反
LV_FLEX_FLOW_ROW_WRAP_REVERSE 将子元素排成一行而不换行,但顺序相反
LV_FLEX_FLOW_COLUMN_WRAP_REVERSE 将子项放在一列中,不换行,但顺序相反

设置完方向, 可以设置元素如何排列, 使用 lv_obj_set_flex_align , 第一个参数是当前对象, 第二个参数是横向的对齐方式, 第三个参数是纵向的对齐方式, 这玩意跟CSS的挺像的

LV_FLEX_ALIGN_START:水平方向左,垂直方向上
LV_FLEX_ALIGN_CENTER:居中
LV_FLEX_ALIGN_END:水平方向右,垂直方向下
LV_FLEX_ALIGN_STRETCH:
LV_FLEX_ALIGN_SPACE_EVENLY:使两项目间距相等
LV_FLEX_ALIGN_SPACE_AROUND:在一行/列上均匀分布,视觉空间不相等
LV_FLEX_ALIGN_SPACE_BETWEEN:在一行/列上均匀分布

除了这些 还用到了对象的对齐方法 lv_obj_alignlv_obj_align_to

lv_obj_align 设置了纵向flex布局的为顶部中间对齐

lv_obj_align_to 设置了横向flex布局相对于上面的横向布局 LV_ALIGN_OUT_BOTTOM_MID 对齐 这样就紧挨着他下面啦

../_images/align.png

然后 lv_label_createlv_btn_create 的参数填对应的布局对象中即可

──── 0人觉得很赞 ────

使用道具 举报

2024-1-28 23:43:05
2024-1-29 07:45:21
你好 有完整代码吗
2024-1-29 08:05:06
赞一个
2024-1-29 08:16:52
2024-1-29 08:37:58
不错不错
2024-1-29 08:43:38
👍🏻
2024-1-29 09:06:50
2024-1-29 09:53:42
学习学习
2024-1-29 22:53:24
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28491 个
  • 话题数: 40624 篇