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

LVGL -按键介绍 上

1 按键btn介绍

在 LVGL(Light and Versatile Graphics Library) 中,btn(按钮)是一种常用的基础控件,用于实现用户点击交互。它通常作为触发某些操作(如切换界面、提交表单、开启功能等)的界面元素。

1.1 特点

  1. 可点击:最基本的功能是响应点击事件。

  2. 可嵌套内容:你可以在按钮中放置 label、image、icon 等对象。

  3. 支持状态变化:如按下、高亮、禁用、被选中等。

  4. 可样式化:背景颜色、边框、透明度、圆角、阴影等均可自定义。

  5. 支持“开关”模式:可通过 LV_OBJ_FLAG_CHECKABLE 实现切换状态(选中/未选中)。

1.2 创建步骤

创建按钮一般分三步:

  1. 创建对象:用 lv_btn_create() 创建按钮对象。

  2. 放入内容:如 lv_label_create() 放入文字。

  3. 注册事件:使用 lv_obj_add_event_cb() 添加点击事件响应。

1.3 风格设定

  1. 背景颜色(bg_color)

  2. 透明度(bg_opa)

  3. 边框(border_color, border_width)

  4. 圆角(radius)

  5. 阴影(shadow_width, shadow_color)

2 常见函数介绍

2.1 基本函数

  1. 创建
lv_obj_t *btn = lv_btn_create(lv_scr_act()); // 创建一个按钮
  1. 设定大小 lv_obj_set_size()
l`v_obj_set_size(btn, 100, 50); // 设置按钮大小为 100x50`
  1. 对齐 lv_obj_align()
lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0); // 将按钮居中
  1. 为按钮(或其他对象)添加事件回调函数。 lv_obj_add_event_cb()
lv_obj_add_event_cb(btn, my_btn_event_handler, LV_EVENT_CLICKED, NULL);

2.2 风格

按钮的风格(style)是用来定义按钮外观的方式。你可以通过风格设置来控制按钮的背景、边框、圆角、字体等各个视觉元素。按钮风格的操作在 LVGL 中是非常重要的,因为它允许你自定义控件的外观和交互反馈。

  1. 风格对象(lv_style_t)
    所有控件的风格都使用 lv_style_t 对象来定义,它包含了控件的所有视觉属性,例如背景颜色、边框样式、字体等。

lv_style_t 是一个结构体,包含多个视觉属性,可以通过 API 函数来设置或修改。

  1. 创建和初始化风格
    在 LVGL 中,风格通常是通过 lv_style_t 对象来创建的。可以使用 lv_style_init() 初始化风格对象,接着使用不同的风格设置函数来定义具体的样式。
static lv_style_t style;
lv_style_init(&style);
  1. 设置按钮的背景风格
    使用 lv_style_set_bg_color()、lv_style_set_bg_grad_color() 等函数来设置按钮背景的颜色、渐变等。
lv_style_set_bg_color(&style, LV_COLOR_RED);
lv_style_set_bg_opa(&style, LV_OPA_COVER);  // 设置背景的不透明度
  1. 设置按钮的边框
    使用 lv_style_set_border_color()、lv_style_set_border_width() 等函数来设置按钮边框的颜色、宽度等。

l

v_style_set_border_color(&style, LV_COLOR_BLACK);
lv_style_set_border_width(&style, 2);
  1. 设置按钮的圆角
    使用 lv_style_set_radius() 来设置按钮的圆角大小。
lv_style_set_radius(&style, 10);  // 设置圆角半径为 10
  1. 设置按钮的阴影
    使用 lv_style_set_shadow_width()、lv_style_set_shadow_color() 等函数来设置按钮的阴影效果。
lv_style_set_shadow_width(&style, 5);  // 设置阴影宽度
lv_style_set_shadow_color(&style, LV_COLOR_GRAY);  // 设置阴影颜色为灰色
  1. 将风格应用到按钮
    一旦定义了风格对象,你就可以通过 lv_btn_set_style() 来应用该风格到按钮的不同部分(例如:按钮主区域、按钮的点击区域等)。
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);  // 创建按钮
lv_obj_add_style(btn, &style, 0);  // 为按钮的常规状态应用风格
  1. 设置不同状态下的风格
    你可以为按钮的不同状态(例如:普通状态、按下状态、悬停状态等)设置不同的风格。
lv_style_t style_pressed;
lv_style_init(&style_pressed);
lv_style_set_bg_color(&style_pressed, LV_COLOR_BLUE);  // 按下时的背景色为蓝色lv_obj_add_style(btn, &style, 0);  // 常规状态的风格
lv_obj_add_style(btn, &style_pressed, LV_STATE_PRESSED);  // 按下状态的风格

在 LVGL v8.x 中,所有控件(包括按钮)的风格都通过 lv_obj_add_style() 来设置。你需要创建一个 lv_style_t 对象,初始化并配置它的属性(如背景颜色、边框、字体等),然后通过 lv_obj_add_style() 将风格应用到按钮或其他控件上。

3 案例

你想要在 按钮被按下时,让按钮产生“下沉”或“移动”的视觉效果,这在 LVGL v8 中是可以通过 修改按钮位置偏移(如 lv_style_set_translate_y()) 实现的

3.1 基础操作

// 按钮事件:点击后启用或禁用闪烁
static lv_timer_t* led_timer = NULL;
static bool timer_running = false;static void btn_event_cb(lv_event_t* e)
{lv_event_code_t code = lv_event_get_code(e);if (code == LV_EVENT_CLICKED) {if (timer_running) {lv_timer_del(led_timer);  // 停止闪烁led_timer = NULL;timer_running = false;lv_led_off(led_obj);  // 关闭 LED}else {led_timer = lv_timer_create(led_timer_cb, 500, NULL);  // 500ms 闪烁周期timer_running = true;}}
}void create_led_ui(void)
{// 创建 LEDled_obj = lv_led_create(lv_scr_act());lv_obj_align(led_obj, LV_ALIGN_TOP_MID, 0, 20);lv_obj_set_size(led_obj, 40, 40);lv_led_off(led_obj);// 创建按钮lv_obj_t* btn = lv_btn_create(lv_scr_act());lv_obj_set_size(btn, 150, 50);lv_obj_align(btn, LV_ALIGN_CENTER, 0, 50);lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);// 样式定义(只针对按下状态)static lv_style_t style_pressed;lv_style_init(&style_pressed);lv_style_set_translate_y(&style_pressed, 4);  // 下移 4 像素lv_style_set_bg_color(&style_pressed, lv_palette_darken(LV_PALETTE_BLUE, 2));  // 更深色视觉反馈(可选)// 添加按下样式(只在按下状态生效)lv_obj_add_style(btn, &style_pressed, LV_STATE_PRESSED);// 按钮标签lv_obj_t* label = lv_label_create(btn);lv_label_set_text(label, "Toggle Blink");lv_obj_center(label);
}void create_screens() {create_led_ui();  // 创建并设置按钮
}

灯闪烁

3.2 动画效果

static lv_obj_t* btn;// 动画回调:设置按钮的 Y 平移(下沉)
static void anim_cb(void* var, int32_t v)
{lv_obj_set_style_translate_y((lv_obj_t*)var, v, 0);
}// 按钮事件回调
static void btn_event_cb1(lv_event_t* e)
{lv_obj_t* btn = lv_event_get_target(e);lv_event_code_t code = lv_event_get_code(e);static lv_anim_t a;if (code == LV_EVENT_PRESSED) {// 按下时:快速下沉lv_anim_init(&a);lv_anim_set_var(&a, btn);lv_anim_set_exec_cb(&a, anim_cb);lv_anim_set_time(&a, 100);  // 速度快lv_anim_set_values(&a, 0, 6);  // 下移 6 像素lv_anim_set_path_cb(&a, lv_anim_path_ease_out);lv_anim_start(&a);}else if (code == LV_EVENT_RELEASED || code == LV_EVENT_PRESS_LOST) {// 松开时:弹跳回位lv_anim_init(&a);lv_anim_set_var(&a, btn);lv_anim_set_exec_cb(&a, anim_cb);lv_anim_set_time(&a, 200);  // 慢一点lv_anim_set_values(&a, 6, 0);  // 回到原位lv_anim_set_path_cb(&a, lv_anim_path_overshoot);  // 弹跳效果lv_anim_start(&a);}
}void create_btn_with_bounce(void)
{// 创建按钮btn = lv_btn_create(lv_scr_act());lv_obj_set_size(btn, 150, 50);lv_obj_align(btn, LV_ALIGN_CENTER, 0, 50);lv_obj_add_event_cb(btn, btn_event_cb1, LV_EVENT_ALL, NULL);// 标签lv_obj_t* label = lv_label_create(btn);lv_label_set_text(label, "Bounce!");lv_obj_center(label);
}

弹跳

相关文章:

  • Spring AI如何调用本地部署的大模型
  • Learning vtkjs之ImplicitBoolean
  • 脏读、不可重复读、幻读示例
  • Clang-Tidy协助C++编译期检查
  • 在Windows系统上如何用Manifest管理嵌入式项目
  • 《Python实战进阶》No45:性能分析工具 cProfile 与 line_profiler
  • 架构进阶:72页集管IT基础设施蓝图设计方案【附全文阅读】
  • 软考中级-软件设计师 数据库(手写笔记)
  • 算法-冒泡排序
  • Ecology中拦截jquery.ajax请求接口后的数据
  • 【免费数据】2000-2020年中国4km分辨率逐日气象栅格数据(含9个气象变量)
  • windows11 编译 protobuf-3.21.12 c++
  • 大连理工大学选修课——机器学习笔记(4):NBM的原理及应用
  • 机器学习|通过线性回归了解算法流程
  • 制作一款打飞机游戏35:生成系统
  • YOLO视觉模型可视化训练与推理测试工具
  • 分享高德地图获取矢量面的方法和python脚本
  • BI平台是什么意思?一文讲清BI平台的具体应用!
  • 线性微分方程与非线性微分方程
  • Windows查看和修改IP,IP互相ping通
  • 同日哑火丢冠,双骄的下山路,手牵手一起走
  • 济南高新区一季度GDP增长8.5%,第二产业增加值同比增长14.4%
  • “铁血防守”制造8年最快丢球,恐惧中的阿森纳什么也做不了
  • 白云山一季度营收净利双降,此前称今年将挖掘盘活自身资源
  • 五一“拼假”催热超长假期,热门酒店民宿一房难求
  • 海尔·2025青岛马拉松两选手被终身禁赛:违规转让号码、穿戴他人号码