LVGL 入门(四):大小坐标与盒子模型

目录


一、前言

我是 Hello_Embed

在掌握 LVGL 的属性机制后,本次我们学习界面开发的核心基础:对象大小、坐标设置 以及盒子模型。这些知识点决定了控件在屏幕上的显示尺寸、位置和布局规则,是编写规范 LVGL 界面的必备知识。


二、基础对象的大小

基础对象创建后为矩形,结构简单、代表性强,我们以它为例讲解大小的设置与获取。

设置大小

  • 设置宽度:lv_obj_set_width(obj, new_width);
  • 设置高度:lv_obj_set_height(obj, new_height);
  • 同时设置宽高:lv_obj_set_size(obj, new_width, new_height);

获取大小

  • 获取实际宽度:lv_obj_get_width(obj);
  • 获取实际高度:lv_obj_get_height(obj);
  • 获取实际可用宽度:lv_obj_get_content_width(obj);
  • 获取实际可用高度:lv_obj_get_content_height(obj);
  • 获取实际可用宽高区域:lv_obj_get_content_coords(obj);

演示代码

c 复制代码
void lesson_2_4_1(void)
{
    // 创建基础对象
    lv_obj_t * obj = lv_obj_create(lv_screen_active());
    //lv_obj_set_width(obj, 300);
    //lv_obj_set_height(obj, 500);
    //lv_obj_set_size(obj,300, 300);
    //lv_obj_update_layout(obj);

    //lv_obj_update_layout(obj);
    //LV_LOG_USER("w:%d\n", lv_obj_get_width(obj));
    //LV_LOG_USER("h:%d\n", lv_obj_get_height(obj));
    //LV_LOG_USER("content_w:%d", lv_obj_get_content_width(obj));
    //LV_LOG_USER("content_h:%d", lv_obj_get_content_height(obj));
}

代码默认执行会创建一个标准矩形。

解除宽高设置的注释后,矩形尺寸会改变,超出窗口的部分需要拖动显示。

宽高重复设置时,以最后一条指令为准。

补充:代码中实际宽高为 300,可用宽高为 270,差值为对象的内边距;在对象内创建子对象时,会自动保留该间距。

若在代码末尾创建嵌套对象:

c 复制代码
obj = lv_obj_create(obj);

运行效果如下:


三、基础对象的坐标

LVGL 使用LCD 坐标系 ,原点在屏幕左上角,水平向右为 X 轴正方向,竖直向下为 Y 轴正方向,与平面直角坐标系不同。

示例中默认屏幕分辨率:800x480。

坐标设置 API

  • 设置 X 坐标:lv_obj_set_x(obj, 200);
  • 设置 Y 坐标:lv_obj_set_y(obj, -50);
  • 同时设置 XY 坐标:lv_obj_set_pos(obj, 1300, 600);
  • 设置对齐方式:lv_obj_set_align(obj, LV_ALIGN_CENTER);
  • 带偏移量居中:lv_obj_align(obj, LV_ALIGN_CENTER, 100, 100);

演示代码

c 复制代码
void lesson_2_5_1(void)
{
    lv_obj_t * obj = lv_obj_create(lv_screen_active());
    //lv_obj_set_x(obj, 200);
    //lv_obj_set_y(obj, -50);
    lv_obj_set_pos(obj, 1300, 600);
    //lv_obj_set_size(obj, 300, 300);
    //lv_obj_set_align(obj, LV_ALIGN_CENTER);
    //lv_obj_align(obj, LV_ALIGN_CENTER, 100, 100);
    //lv_obj_update_layout(obj);

    //lv_obj_t * label = lv_label_create(lv_screen_active());
    //lv_label_set_text(label, "Hello, LVGL!");
    //lv_obj_align_to(label, obj, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);

    //LV_LOG_USER("x:%d\n", lv_obj_get_x(obj));
    //LV_LOG_USER("y:%d\n", lv_obj_get_y(obj));

    //LV_LOG_USER("x2:%d\n", lv_obj_get_x2(obj));
    //LV_LOG_USER("y2:%d\n", lv_obj_get_y2(obj));

    //LV_LOG_USER("x_aligne:%d\n", lv_obj_get_x_aligned(obj));
    //LV_LOG_USER("y_aligne:%d\n", lv_obj_get_y_aligned(obj));
}

核心规则

  1. 坐标为负数时,对象会超出屏幕边界;
  2. 常用对齐方式:LV_ALIGN_CENTER(居中)、LV_ALIGN_TOP_MID(顶部居中)等;
  3. 获取坐标前,调用lv_obj_update_layout(obj)刷新布局,可保证获取值准确;
  4. 确定矩形对角点坐标,即可唯一确定对象位置。

四、基础对象的盒子模型

LVGL 的盒子模型定义了对象的组成结构,是布局、样式修改的核心依据。

盒子组成部分

  1. 边界 (bounding):对象宽高包裹的整个区域;
  2. 轮廓 (outline):边框外围的线条,不占用空间,用于突出显示;
  3. 边框 (border):对象的边框,可设置宽度、颜色;
  4. 填充 (padding):对象与子对象之间的内边距;
  5. 内容 (content):对象内部可显示子控件的区域。

演示代码

c 复制代码
void lesson_2_6_1(void)
{
    lv_obj_t * obj1 = lv_obj_create(lv_screen_active());
    lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0);
    //lv_obj_set_style_border_width(obj1, 10, 0);
    //lv_obj_set_style_outline_width(obj1, 10, 0);
    //lv_obj_set_style_pad_all(obj1, 0, 0);

#if 0
    lv_obj_t * obj2 = lv_obj_create(lv_screen_active());
    lv_obj_t * obj_out_top = lv_obj_create(lv_screen_active());
    lv_obj_t * obj_out_bottom = lv_obj_create(lv_screen_active());
    lv_obj_t * obj_out_left = lv_obj_create(lv_screen_active());
    lv_obj_t * obj_out_right = lv_obj_create(lv_screen_active());
    //lv_obj_set_style_outline_width(obj_out_left, 10, 0);

    lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0);
    lv_obj_align_to(obj_out_top, obj1, LV_ALIGN_OUT_TOP_MID, 0, 0);
    lv_obj_align_to(obj_out_bottom, obj1, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);
    lv_obj_align_to(obj_out_left, obj1, LV_ALIGN_OUT_LEFT_MID, 0, 0);
    lv_obj_align_to(obj_out_right, obj1, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
    lv_obj_align_to(obj2, obj_out_right, LV_ALIGN_OUT_TOP_MID, 0, 0);
#endif
}

五、总结

  1. LVGL 通过专用 API 设置 / 获取对象大小,实际尺寸与可用尺寸的差值为内边距;
  2. LCD 坐标系原点在左上角,支持坐标、对齐两种定位方式;
  3. 盒子模型由边界、轮廓、边框、填充、内容组成,是 LVGL 布局与样式的核心。

六、结尾

大小、坐标和盒子模型是 LVGL 界面开发的基石,熟练掌握这些知识,才能精准控制控件的显示效果。我是 Hello_Embed,期待你的关注!

相关推荐
風清掦1 小时前
【江科大STM32学习笔记-08】DMA直接存储器存取
笔记·stm32·单片机·嵌入式硬件·学习
༄天M宇ༀ2 小时前
E10: e-builder 低代码构建平台接口管理(E9建模版)
java·前端·spring·servlet·reactjs
17(无规则自律)2 小时前
嵌入式 Linux 启动:设备树的加载、传递和解析全流程分析
linux·stm32·嵌入式硬件·unix
somi72 小时前
51单片机-01-在8位数码管上动态滚动显示数字
单片机·嵌入式硬件·51单片机
zhouping@2 小时前
JAVA的学习笔记day05
java·笔记·学习
窝子面2 小时前
解决vite构建的项目中使用path报错
前端
kana_yonk2 小时前
如何设置前端vue程序开机自启(Windows)
前端·vue.js·windows
清空mega2 小时前
《Vue3 中 computed、watch、watchEffect 怎么用?响应式核心能力详解》
前端·javascript·vue.js
IT19952 小时前
C++工作笔记-动态库中的单例类存储方式
开发语言·c++·笔记