LVGL最基本的构建一个按钮的函数介绍


1. lv_scr_act()

功能

获取当前活跃的屏幕对象(Screen Object)。

  • LVGL 中所有控件的父容器必须是屏幕或另一个容器,屏幕是根容器。
  • 默认情况下,LVGL 会自动创建一个主屏幕,此函数返回它的指针。
参数
  • 无参数
    直接调用即可,例如:lv_scr_act()
返回值
  • 类型:lv_obj_t*(指向屏幕对象的指针)。
示例
lv_obj_t* screen = lv_scr_act(); // 获取当前屏幕对象

2. lv_switch_create(parent)

功能

创建一个开关控件(Switch Widget)。

  • 开关是 LVGL 提供的交互控件,支持滑动切换状态(开/关)。
参数
  • parent
    类型:lv_obj_t*
    含义:父容器对象,新创建的开关会附加到该容器中。
    常用值:
    • lv_scr_act():附加到当前屏幕。
    • 其他容器(如 lv_obj_create(parent) 创建的面板)。
返回值
  • 类型:lv_obj_t*(指向新创建的开关控件的指针)。
示例
lv_obj_t* parent_container = lv_obj_create(lv_scr_act()); // 创建一个容器
lv_obj_t* switch_obj = lv_switch_create(parent_container); // 将开关添加到容器中

3. lv_obj_set_size(obj, width, height)

功能

设置对象的宽度和高度。

  • 单位默认为像素(px),但可通过 LVGL 配置支持百分比或自适应布局。
参数
  • obj
    类型:lv_obj_t*
    含义:要调整大小的目标对象。

  • width
    类型:lv_coord_t(通常是 int16_t
    含义:对象的宽度(单位:像素)。

  • height
    类型:lv_coord_t
    含义:对象的高度(单位:像素)。

注意事项
  • 默认开关控件较小(如 40x20),需手动调整以适应界面设计。
  • 如果控件内容(如文本、图标)超出尺寸,可能被裁剪。
示例
lv_obj_set_size(switch_obj, 120, 60); // 设置开关为 120x60 像素

4. lv_obj_align(obj, align_type, x_offset, y_offset)

功能

将对象对齐到父容器或指定位置。

  • 对齐基于父容器的边界或中心。
参数
  • obj
    类型:lv_obj_t*
    含义:要对齐的目标对象。

  • align_type
    类型:lv_align_t(枚举类型)
    含义:对齐方式,可选值包括:

    • LV_ALIGN_CENTER:居中对齐。
    • LV_ALIGN_TOP_LEFT:左上角对齐。
    • LV_ALIGN_BOTTOM_RIGHT:右下角对齐。
    • 其他对齐方式(共 12 种,如 LV_ALIGN_LEFT_MID 等)。
  • x_offset
    类型:lv_coord_t
    含义:对齐后的水平偏移量(正值向右,负值向左)。

  • y_offset
    类型:lv_coord_t
    含义:对齐后的垂直偏移量(正值向下,负值向上)。

注意事项
  • 对齐的参考点是父容器的对应位置(如 LV_ALIGN_CENTER 是父容器的中心)。
  • 若父容器大小变化,需重新对齐对象。
示例
// 将开关对齐到父容器中心,并向右偏移 20 像素
lv_obj_align(switch_obj, LV_ALIGN_CENTER, 20, 0);

综合示例

// 获取当前屏幕
lv_obj_t* screen = lv_scr_act();

// 在屏幕上创建一个开关控件
lv_obj_t* switch_obj = lv_switch_create(screen);

// 设置开关尺寸为 120x60 像素
lv_obj_set_size(switch_obj, 120, 60);

// 将开关对齐到屏幕中心
lv_obj_align(switch_obj, LV_ALIGN_CENTER, 0, 0);

扩展说明

  1. 父容器的选择
    父容器可以是屏幕、面板(lv_obj)、布局容器(如 lv_flex/lv_grid)等。
    示例:将开关添加到弹性布局容器:

    lv_obj_t* flex_container = lv_obj_create(lv_scr_act());
    lv_flex_set_flex_flow(flex_container, LV_FLEX_FLOW_ROW); // 设置为横向弹性布局
    lv_switch_create(flex_container); // 开关会自动根据布局排列
    
  2. 动态调整对齐
    如果父容器大小变化(如旋转屏幕),可结合 lv_obj_update_layout(parent)lv_obj_align() 重新对齐对象。

  3. 单位系统
    LVGL 支持配置单位系统(如百分比、毫米),需通过 lv_style_set_width(obj, LV_PCT(50)) 实现。

### 如何在LVGL中识别特定按钮LVGL框架下,为了能够区分和识别不同按钮的行为及其关联功能,通常会利用`lv_event_get_user_data()`函数来获取用户自定义的数据。这些数据可以是任何类型的指针或整数形式的标识符,用来唯一标记某个控件。 #### 设置用户数据 当创建按钮时,可以通过`lv_obj_set_user_data(obj, user_data)`方法为对象绑定额外的信息。这里的`obj`代表目标控件(如按钮),而`user_data`则是一个指向任意类型数据的指针[^1]。例如: ```c // 创建第一个按钮并为其分配ID lv_obj_t *btn1 = lv_btn_create(lv_scr_act()); lv_obj_set_user_data(btn1, (void *)1); // 将ID设为1 // 创建第二个按钮并为其分配ID lv_obj_t *btn2 = lv_btn_create(lv_scr_act()); lv_obj_set_user_data(btn2, (void *)2); // 将ID设为2 ``` #### 获取用户数据 在事件回调函数内部,可通过调用`lv_event_get_user_data(event)`提取之前存储于该控件中的用户数据。此过程允许开发者依据每个按钮的独特属性执行相应的逻辑操作。下面展示了一个典型的实现方式: ```c static void button_event_cb(lv_event_t *e) { lv_obj_t *obj = lv_event_get_target(e); int id = (int)lv_obj_get_user_data(obj); switch(id){ case 1: // 对应按钮1的动作 break; case 2: // 对应按钮2的动作 break; default: break; } } ``` 上述代码片段展示了如何基于预先设定好的用户数据来判断当前触发事件的是哪一个具体的按钮实例,并据此采取不同的响应措施[^3]。 另外,在更复杂的场景里,如果仅依赖简单的数值不足以满足需求,则可考虑构建结构体保存更加丰富的信息作为`user_data`的内容[^4]。 ### 总结 综上所述,通过合理运用`lv_obj_set_user_data()`以及配合恰当设计的事件处理器机制,即可有效达成对各个独立按钮个体的有效辨认与管理目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九层指针

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值