当前位置: 首页 > 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);
}

弹跳


http://www.mrgr.cn/news/100783.html

相关文章:

  • Win下的Kafka安装配置
  • 使用 Spring Data Redis 实现 Redis 数据存储详解
  • Git分支重命名与推送参数解析
  • 使用 Vue 开发 VS Code 插件前端页面(上)
  • 【Linux】记录一个有用PS1
  • 表征(Representations)、嵌入(Embeddings)及潜空间(Latent space)
  • 4.30阅读
  • python实战项目67:空气质量在线检测平台js逆向
  • 精益数据分析(34/126):深挖电商运营关键要点与指标
  • 软考:硬件中的CPU架构、存储系统(Cache、虚拟内存)、I/O设备与接口
  • 【Python学习路线】零基础到项目实战系统
  • Gradients of Matrix-Matrix Multiplication in Deep Learning
  • MYSQL三大日志、隔离级别(MVCC+锁机制实现)
  • Docker和K8s面试题
  • LeetCode 2962 统计最大元素出现至少K次的子数组(滑动窗口)
  • 【C++类和数据抽象】消息处理示例(1):从设计模式到实战应用
  • 【C++类和数据抽象】消息处理示例(2)
  • Linux运维——Vim基础
  • 大数据测试集群环境部署过程中各种问题
  • 掌握 Linux 中 SELinux 的强制访问控制机制和 iptables、 firewalld 两种防火墙以及他们的使用方法