如何利用物理按键控制LVGL控件的大小与状态

news/2025/3/19 14:15:57/

​ lvgl可以利用物理按键控制控件的选择和状态,演示视频如下:

单物理按键控制LVGL控件的选择和状态

移植方法如下:
  • 1 在注册设备中,填写对应的变量和初始化函数。这里我们以移keypad为例,因为keypad的功能很多。
    ![请添加图片描述](https://i-blog.csdnimg.cn/direct/dee41d9aad8c42c69e955bc0ce943238.png
/* keypad */
static void keypad_init(void);
static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static uint32_t keypad_get_key(void);lv_indev_t * indev_keypad;
  • 2 在lv_port_indev_init(void)函数中填写对应初始化内容
    在这里插入图片描述
		/*Initialize your keypad or keyboard if you have*/keypad_init();/*Register a keypad input device*/lv_indev_drv_init(&indev_drv1);indev_drv1.type = LV_INDEV_TYPE_KEYPAD;indev_drv1.read_cb = keypad_read;indev_keypad = lv_indev_drv_register(&indev_drv1);/*Later you should create group(s) with `lv_group_t * group = lv_group_create()`,*add objects to the group with `lv_group_add_obj(group, obj)`*and assign this input device to group to navigate in it:*`lv_indev_set_group(indev_keypad, group);`*/
  • 3 在这个三个函数里面填入你的设备内容
    • 1 static void keypad_init(void) //你按键初始化内容
    • 2 static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)//返回值控制控件的方式
    • static uint32_t keypad_get_key(void)//获取到按键对应值的函数
/*------------------* Keypad* -----------------*//*Initialize your keypad*/
static void keypad_init(void)
{/*Your code comes here*/key_gpio_config();
}/*Will be called by the library to read the mouse*/
static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{static uint32_t last_key = 0;/*Get the current x and y coordinates*/
//    mouse_get_xy(&data->point.x, &data->point.y);/*Get whether the a key is pressed and save the pressed key*/uint32_t act_key = keypad_get_key();if(act_key != 0) {data->state = LV_INDEV_STATE_PR;/*Translate the keys to LVGL control characters according to your key definitions*/switch(act_key) {case 1:act_key = LV_KEY_NEXT;break;case 2:act_key = LV_KEY_PREV;break;case 3:act_key = LV_KEY_LEFT;break;case 4:act_key = LV_KEY_RIGHT;break;case 5:act_key = LV_KEY_ENTER;break;}last_key = act_key;}else {data->state = LV_INDEV_STATE_REL;}data->key = last_key;
}/*Get the currently being pressed key.  0 if no key is pressed*/
static uint32_t keypad_get_key(void)
{/*Your code comes here*/return key_scan();
}			
  • 4 创建一个组group,并将你想控制ui控件添加组,并将其与你的输入设备keypad关联起来,这样就可以控制了。
void setup_gui()
{lv_group_t * group = lv_group_create();//创建一个组// 创建屏幕对象lv_obj_t * scr = lv_disp_get_scr_act(NULL);/* 创建一个开关控件 */lv_obj_t * switch_obj = lv_switch_create(scr);lv_obj_set_pos(switch_obj, 50, 50);  // 设置位置lv_obj_set_size(switch_obj, 100, 40);  // 设置大小lv_obj_set_style_bg_color(switch_obj, lv_color_hex(0xffffff), LV_PART_INDICATOR);lv_obj_t * switch_obj1 = lv_switch_create(scr);lv_obj_set_pos(switch_obj1, 200, 50);  // 设置位置lv_obj_set_size(switch_obj1, 100, 40);  // 设置大小lv_obj_set_style_bg_color(switch_obj1, lv_color_hex(0xffffff), LV_PART_INDICATOR);lv_obj_t * switch_obj2 = lv_switch_create(scr);lv_obj_set_pos(switch_obj2, 350, 50);  // 设置位置lv_obj_set_size(switch_obj2, 100, 40);  // 设置大小lv_obj_set_style_bg_color(switch_obj2, lv_color_hex(0xffffff), LV_PART_INDICATOR);lv_obj_t * label;lv_obj_t * btn1 = lv_btn_create(scr);lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL);lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -40);label = lv_label_create(btn1);lv_label_set_text(label, "Button");lv_obj_center(label);lv_obj_t * btn2 = lv_btn_create(scr);lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_ALL, NULL);lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 40);lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);lv_obj_set_height(btn2, LV_SIZE_CONTENT);label = lv_label_create(btn2);lv_label_set_text(label, "Toggle");lv_obj_center(label);/*Create a slider in the center of the display*/lv_obj_t * slider = lv_slider_create(scr);lv_obj_align(slider, LV_ALIGN_CENTER, 0, 80);lv_obj_add_event_cb(slider, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);/*Create a label below the slider*/slider_label = lv_label_create(scr);lv_label_set_text(slider_label, "0%");lv_obj_align_to(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* 将ui控件添加到组里面去 */lv_group_add_obj(group, switch_obj);lv_group_add_obj(group, switch_obj1);lv_group_add_obj(group, switch_obj2);lv_group_add_obj(group, btn1);lv_group_add_obj(group, btn2);lv_group_add_obj(group, slider);/* 将输入设备keypad关联起来 */lv_indev_set_group(indev_keypad, group);
}

http://www.ppmy.cn/news/1580333.html

相关文章

SpringMVC-登录校验

文章目录 1.会话技术1.1 Cookie1.2 Session1.3 JWT1.3.1 JWT简介1.3.2 JWT结构1.3.3 使用JWT 2.拦截技术2.1 过滤器(Filter)2.1.1 快速上手2.1.2 执行流程2.1.3 拦截路径2.1.4 过滤器链 2.2 拦截器(Interceptor)2.2.1 快速上手2.2…

【JavaScript】三、数据类型

文章目录 1、数据类型1.1 基本数据类型:数字型number1.2 基本数据类型:字符串类型1.3 基本数据类型:布尔类型1.4 基本数据类型:未定义undefined1.5 基本数据类型:空类型null 2、查看数据类型2.1 从控制台看2.2 typeof …

爬虫逆向:详细讲述iOS底层原理及机制

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. iOS 系统架构1.1 Core OS 层1.2 Core Services 层1.3 Media 层1.4 Cocoa Touch 层2. iOS 的核心机制2.1 应用生命周期2.2 内存管理2.3 多线程2.4 文件系统2.5 网络通信3. iOS 的启动流程4. iOS 的安全机制4.1 代码签…

银行数字化转型

CNAPS 中国现代化支付系统 China National Automatic Payment System CIPS 人民币跨境支付系统 Cross-border Interbank Payment System 现代银行体系形成了中央银行这个特殊的银行类型,由中央银行居中建立清算体系是目前多数国家采用的金融清算体系构建方式&#…

(七)Spring Boot学习——Redis使用

有部分内容是常用的,为了避免每次都查询数据库,将部分数据存入Redis。 一、 下载并安装 Redis Windows 版的 Redis 官方已不再维护,你可以使用 微软提供的 Redis for Windows 版本 或者 使用 WSL(Windows Subsystem for Linux&a…

基于Spring Boot的红色革命文物征集管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

蓝桥云客 快速幂

1.快速幂 - 蓝桥云课 题目描述 输入 b,p,k 的值,求 bpmodk 的值。其中 2≤b,p,k≤109。 输入描述 三个整数 b,p,k。 输出描述 输出 bpmodks,s 为运算结果。 输入输出样例 示例 输入输出2 10 97 运行限制 最大运行时间&…

C# 事件(Event)核心概念

文章目录 前言‌1. 事件的核心概念‌‌2. 事件的声明与使用‌‌3. 标准事件模式(EventHandler 和 EventArgs)‌4. 事件与委托的区别‌‌5. 事件的使用场景‌‌6. 高级特性‌‌7. 注意事项‌‌8. 完整示例:温度监控系统‌‌9. 常见问题‌ 前言…