LVGL -按键介绍 上
1 按键btn介绍
在 LVGL(Light and Versatile Graphics Library) 中,btn(按钮)是一种常用的基础控件,用于实现用户点击交互。它通常作为触发某些操作(如切换界面、提交表单、开启功能等)的界面元素。
1.1 特点
-  
可点击:最基本的功能是响应点击事件。
 -  
可嵌套内容:你可以在按钮中放置 label、image、icon 等对象。
 -  
支持状态变化:如按下、高亮、禁用、被选中等。
 -  
可样式化:背景颜色、边框、透明度、圆角、阴影等均可自定义。
 -  
支持“开关”模式:可通过 LV_OBJ_FLAG_CHECKABLE 实现切换状态(选中/未选中)。
 
1.2 创建步骤
创建按钮一般分三步:
-  
创建对象:用 lv_btn_create() 创建按钮对象。
 -  
放入内容:如 lv_label_create() 放入文字。
 -  
注册事件:使用 lv_obj_add_event_cb() 添加点击事件响应。
 
1.3 风格设定
-  
背景颜色(bg_color)
 -  
透明度(bg_opa)
 -  
边框(border_color, border_width)
 -  
圆角(radius)
 -  
阴影(shadow_width, shadow_color)
 
2 常见函数介绍
2.1 基本函数
- 创建
 
lv_obj_t *btn = lv_btn_create(lv_scr_act()); // 创建一个按钮
 
- 设定大小 lv_obj_set_size()
 
l`v_obj_set_size(btn, 100, 50); // 设置按钮大小为 100x50`
 
- 对齐 lv_obj_align()
 
lv_obj_align(btn, LV_ALIGN_CENTER, 0, 0); // 将按钮居中
 
- 为按钮(或其他对象)添加事件回调函数。 lv_obj_add_event_cb()
 
lv_obj_add_event_cb(btn, my_btn_event_handler, LV_EVENT_CLICKED, NULL);
 
2.2 风格
按钮的风格(style)是用来定义按钮外观的方式。你可以通过风格设置来控制按钮的背景、边框、圆角、字体等各个视觉元素。按钮风格的操作在 LVGL 中是非常重要的,因为它允许你自定义控件的外观和交互反馈。
- 风格对象(lv_style_t)
所有控件的风格都使用 lv_style_t 对象来定义,它包含了控件的所有视觉属性,例如背景颜色、边框样式、字体等。 
lv_style_t 是一个结构体,包含多个视觉属性,可以通过 API 函数来设置或修改。
- 创建和初始化风格
在 LVGL 中,风格通常是通过 lv_style_t 对象来创建的。可以使用 lv_style_init() 初始化风格对象,接着使用不同的风格设置函数来定义具体的样式。 
static lv_style_t style;
lv_style_init(&style);
 
- 设置按钮的背景风格
使用 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);  // 设置背景的不透明度
 
- 设置按钮的边框
使用 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);
 
- 设置按钮的圆角
使用 lv_style_set_radius() 来设置按钮的圆角大小。 
lv_style_set_radius(&style, 10);  // 设置圆角半径为 10
 
- 设置按钮的阴影
使用 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);  // 设置阴影颜色为灰色
 
- 将风格应用到按钮
一旦定义了风格对象,你就可以通过 lv_btn_set_style() 来应用该风格到按钮的不同部分(例如:按钮主区域、按钮的点击区域等)。 
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);  // 创建按钮
lv_obj_add_style(btn, &style, 0);  // 为按钮的常规状态应用风格 
- 设置不同状态下的风格
你可以为按钮的不同状态(例如:普通状态、按下状态、悬停状态等)设置不同的风格。 
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);
}
 
 
弹跳
