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,期待你的关注!

相关推荐
UXbot3 小时前
AI 原型工具零设计基础操作指南与功能解析(2026)
前端·ui·产品经理·原型模式·web app
搁浅小泽4 小时前
万用表测试电子元器件
单片机·嵌入式硬件·可靠性工程师
yuzhiboyouye4 小时前
VO一般java后端怎么转换成前端想要的数据
java·前端·状态模式
白小沫4 小时前
解决 TortoiseSVN 文件夹不显示图标的问题(Windows 10/11 通用)
windows·经验分享·笔记
小脑斧1234 小时前
从范式重构到工程落地:OpenTiny NEXT 引领前端智能化新范式
前端·hermesagent·opentiny next
小江的记录本4 小时前
【AI大模型选型指南】《2026年5月(最新版)国内外主流AI大模型选型指南》(企业版)
前端·人工智能·后端·ai作画·aigc·ai编程·ai写作
_李小白4 小时前
【Android车载学习笔记】第一天:Android Automotive OS介绍
android·笔记
幽络源小助理4 小时前
最新轻量美化表白墙系统源码v2.0_带后台版_附搭建教程
前端·开源·源码·php源码
qq_381338505 小时前
前端状态管理新范式:Zustand、Jotai 与 Preact Signals 深度对比
前端·arcgis
布局呆星5 小时前
Vue Router 笔记(二):正则路由、组件通信与动态路由
前端·javascript·vue.js