当前位置: 首页 > news >正文

LVGL(Flex布局)

文章目录

    • 什么是 LVGL 的 Flex?
    • Flex 布局的核心概念
    • LVGL 中如何使用 Flex?
      • 1. 开启 Flex 布局
      • 2. Flex 排列方向
      • 3. 主轴对齐(主轴是控件排列的方向)
      • 4. 交叉轴对齐(垂直于主轴方向)
      • 5. 换行方式
      • 6. 子控件的生长和收缩
    • Flex 的使用示例
    • 总结


好的!我来给你详细讲讲 LVGL(Light and Versatile Graphics Library) 里的 Flex布局


什么是 LVGL 的 Flex?

LVGL 是一个轻量级开源嵌入式GUI库,适合资源有限的设备。Flex 是 LVGL 提供的一种布局管理机制,灵感来源于 CSS 的 Flexbox 布局,目的是方便灵活地管理控件的排列和分布。


Flex 布局的核心概念

Flex 主要是为了方便容器内子控件的自动排列和分布,它的特点是:

  • 子控件可以横向(row)或纵向(column)排列。
  • 可以设置主轴对齐(主轴是排列方向)。
  • 可以设置交叉轴对齐(交叉轴是与主轴垂直的方向)。
  • 控件之间间距(gap)和自动换行。

LVGL 中如何使用 Flex?

1. 开启 Flex 布局

Flex 是在容器(比如 lv_obj)上设置的,需要先设置容器的布局为 LV_LAYOUT_FLEX

lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW);  // 横向排列
// 或者
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN);  // 纵向排列

2. Flex 排列方向

lv_obj_set_flex_flow 设置主轴方向和换行方式:

枚举值说明
LV_FLEX_FLOW_ROW横向排列,子控件从左到右
LV_FLEX_FLOW_ROW_REVERSE横向排列,子控件从右到左
LV_FLEX_FLOW_COLUMN纵向排列,子控件从上到下
LV_FLEX_FLOW_COLUMN_REVERSE纵向排列,子控件从下到上

3. 主轴对齐(主轴是控件排列的方向)

通过设置 lv_obj_set_style_flex_main_place

选项说明
LV_FLEX_ALIGN_START子控件靠主轴起点对齐
LV_FLEX_ALIGN_CENTER子控件在主轴方向居中
LV_FLEX_ALIGN_END子控件靠主轴终点对齐
LV_FLEX_ALIGN_SPACE_BETWEEN子控件两端对齐,之间均匀分布
LV_FLEX_ALIGN_SPACE_AROUND子控件均匀分布,首尾间距为子控件间距一半

示例:

lv_obj_set_style_flex_main_place(cont, LV_FLEX_ALIGN_SPACE_BETWEEN, 0);

4. 交叉轴对齐(垂直于主轴方向)

通过 lv_obj_set_style_flex_cross_place 设置:

选项说明
LV_FLEX_ALIGN_START子控件靠交叉轴起点对齐
LV_FLEX_ALIGN_CENTER子控件交叉轴居中
LV_FLEX_ALIGN_END子控件靠交叉轴终点对齐
LV_FLEX_ALIGN_STRETCH子控件在交叉轴方向拉伸

5. 换行方式

通过 lv_obj_set_style_flex_track_place 控制子控件换行后的排列:

选项说明
LV_FLEX_ALIGN_START换行后的行或列靠起点对齐
LV_FLEX_ALIGN_CENTER换行后的行或列居中
LV_FLEX_ALIGN_END换行后的行或列靠终点对齐
LV_FLEX_ALIGN_SPACE_BETWEEN换行后的行或列均匀分布

6. 子控件的生长和收缩

子控件可以设置 flex_grow 属性,来决定当有剩余空间时该控件是否占用:

lv_obj_set_style_flex_grow(child, 1, 0);  // 该子控件会扩展填满剩余空间

Flex 的使用示例

// 创建一个容器
lv_obj_t * cont = lv_obj_create(lv_scr_act());// 设置容器大小和位置
lv_obj_set_size(cont, 300, 200);
lv_obj_center(cont);// 设置容器为 Flex 布局,横向排列
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW);// 主轴对齐为两端对齐
lv_obj_set_style_flex_main_place(cont, LV_FLEX_ALIGN_SPACE_BETWEEN, 0);// 交叉轴居中
lv_obj_set_style_flex_cross_place(cont, LV_FLEX_ALIGN_CENTER, 0);// 创建3个子控件
for(int i = 0; i < 3; i++) {lv_obj_t * btn = lv_btn_create(cont);lv_obj_set_size(btn, 60, 40);lv_obj_t * label = lv_label_create(btn);lv_label_set_text_fmt(label, "Btn %d", i+1);lv_obj_center(label);
}

总结

特点说明
布局方向横向(row)或纵向(column)
主轴对齐控件在排列方向上的对齐方式
交叉轴对齐控件垂直排列方向的对齐方式
换行支持支持子控件自动换行
子控件伸缩flex_grow 支持控件占用剩余空间
易用且强大轻松实现复杂的响应式布局

http://www.xdnf.cn/news/683173.html

相关文章:

  • Docker修改镜像存放位置
  • qiankun 子应用怎样通过 props拿到子应用【注册之后挂载之前】主应用中发生变更的数据
  • vue2轮播图组件
  • 计算机网络实验课(二)——抓取网络数据包,并实现根据条件过滤抓取的以太网帧,分析帧结构
  • 如何检查液质联用仪LCMS的真空度
  • 提升前端性能:减少DOM操作
  • 在线项目管理工具对比:Trello、Worktile等20款软件测评
  • Java的Spring Cloud生态中实现SSE(Server-Sent Events)服务端实践
  • YoloV11改进策略:卷积篇-风车卷积-即插即用
  • 代码随想录算法训练营第60期第四十九天打卡
  • day05-常用API(二):Lambda、方法引用详解
  • Python装饰器与异常捕获的高级用法详解
  • 基于 STM32 的农村污水处理控制系统设计与实现
  • @vue/composition-api
  • uniapp-商城-72-shop(5-商品列表,购物车实现回顾)
  • Linux 6.15 内核发布,新功能
  • 【免费】【无需登录/关注】坐标系批量转换与可视化网页工具
  • 31. 自动化测试开发之实现INI配置文件解析
  • 从CPU缓存出发对引用池进行优化
  • C51-指针函数
  • Linux编译器——gcc/g++的使用
  • 基于Python的智能天气提醒助手开发指南
  • ValueError: BuilderConfig ‘xxxx‘ not found. Available:[xxx]
  • Cannot read properties of undefined (reading ‘clearSelection‘)
  • 华为仓颉语言初识:并发编程之线程的基本使用
  • PCB线路板压合工艺难点解析与技术对策
  • NB-IoT NPUSCH(三)-资源映射
  • gdiplus,GDI +为什么2001年发布后几乎没有再更新了
  • 2025 海外短剧 CPS 系统开发:技术驱动下的全球化内容分销新范式
  • SSM整合:Spring+SpringMVC+MyBatis完美融合实战指南