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

相关推荐
华清远见IT开放实验室18 小时前
嵌入式系统化课程 学习内容与服务说明
linux·stm32·学习·嵌入式·全栈·虚拟仿真·测评中心
爱上好庆祝18 小时前
学习js的第2天
前端·css·学习·html·css3
LCMICRO-1331084774618 小时前
长芯微LCMDC7616完全P2P替代AD7616,16通道16位模数转换器(ADC)
stm32·嵌入式硬件·fpga开发·硬件工程·模数转换器adc·电力线监测
Csvn18 小时前
SEO 优化
前端
三品吉他手会点灯19 小时前
C语言学习笔记 - 12.C语言简介 - 一元二次方程详解
c语言·笔记·学习
天外飞雨道沧桑19 小时前
详解CSS中的Containing Block:概念、规则与实战解析
前端·css
彩票管理中心秘书长19 小时前
Git 图形化交互工具大全:从官方 GUI 到高级扩展
前端
ID_1800790547319 小时前
Python 实现京东商品详情 API 数据准确性校验(极简可直接用)
java·前端·python
前端那点事19 小时前
Vue生命周期速查:Vue2+Vue3钩子全解析,新手也能秒懂
前端·vue.js
陆枫Larry19 小时前
横向滚动列表紧贴屏幕边缘问题:原理分析与解决方案
前端