LINUX LVGL 使用键盘方向键选择控件
1:使用SDL库显示LVGL时 的键盘控制方法
1.1: 比如屏幕上有按钮 button1 和button2 通过创建一个组 group 就可以实现选中按键1或者按键2
新建一个组,放入按键的代码,我是写在ui.c 里面创建组件的地方那儿
lv_group_t * group; //这个是全局变量
//以下是放在函数内的
group= lv_group_create(); //新建一个组
lv_group_add_obj(group,ui_Button1); //把按键1放进组
lv_group_add_obj(group,ui_Button4); //把按键2放进组
lv_indev_set_group(lv_indev_get_next(NULL), group);//输入设备分配组,lv_indev_get_next(NULL)传入NULL可以获取第一个输入设备(我只用了键盘所以获取第一个即可),如果多个输入设备,请自己指定
lv_group_set_default(group); //把自己的组设置成默认的组,不设置也没问题,主要是在其他函数里可以使用get_default获取group而已
1.2: 打开宏定义支持键盘功能
/*-------------------------------
* Keyboard of a PC (using SDL)
*------------------------------*/
/*DEPRECATED: Use the SDL driver instead. */
#ifndef USE_KEYBOARD
#define USE_KEYBOARD 1
#endif
#if USE_KEYBOARD
1.3: 新建一个输入设备,注册读取键盘的回调函数,
在main.c的 hal_init 函数里面修改文章来源:https://www.toymoban.com/news/detail-612167.html
static lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv); /*Basic initialization*/
indev_drv.type = LV_INDEV_TYPE_KEYPAD; //修改为使用键盘
indev_drv.read_cb = my_read_kbd; //修改为自己定义的回调函数
lv_indev_drv_register(&indev_drv);
1.4: 自己的回调函数实现
//此函数注册进输入设备之后,LVGL会周期性的调用此函数读取键盘值
void my_read_kbd(lv_indev_drv_t * indev_drv, lv_indev_data_t * data){
static uint8_t state = 0;
sdl_keyboard_read(indev_drv, data); //这个函数是LVGL 的sdl.c驱动里面的函数,主要是读取键盘值
//自己的键盘值判断函数,LVGL默认做了回车键的触发,所以不需要实现回车功能,只需要切换上面组group里面选中的组件button即可
if(data->state == LV_INDEV_STATE_REL){ //如果松开
if(data->key == LV_KEY_DOWN && state == 1){ //如果下键按下,就切换组group 里面的聚焦组件
printf("down");
lv_group_focus_next(lv_group_get_default()); //选中组group里面下一个按键
state = 0;
}
}else if(data->state == LV_INDEV_STATE_PRESSED){ //如果按下
state = 1;
}
}
2: 使用/dev/fb0 设备显示LVGL时, 使用libinput 读取键盘值
2.1: Ubuntu安装libinput.so库
sudo apt-get install libinput-dev
注意: 编译时记得在Makefile 链接库 -linput
2.2: 打开宏定义支持libinput库和键盘功能
—注意这是使用/dev/fb0设备显示的LVGL,请确保你的LGVL已经成功使用fb0设备显示画面了
/*-------------------------------------------------
* Touchscreen, mouse/touchpad or keyboard as libinput interface (for Linux based systems)
*------------------------------------------------*/
#ifndef USE_LIBINPUT
#define USE_LIBINPUT 1 //打开libinput
#endif
#ifndef USE_BSD_LIBINPUT
#define USE_BSD_LIBINPUT 0
#endif
#if USE_LIBINPUT || USE_BSD_LIBINPUT
/*If only a single device of the same type is connected, you can also auto detect it, e.g.:
*#define LIBINPUT_NAME libinput_find_dev(LIBINPUT_CAPABILITY_TOUCH, false)*/
#define LIBINPUT_NAME "/dev/input/event0" /*You can use the "evtest" Linux tool to get the list of devices and test them*/
#endif /*USE_LIBINPUT || USE_BSD_LIBINPUT*/
/*-------------------------------
* Keyboard of a PC (using SDL)
*------------------------------*/
/*DEPRECATED: Use the SDL driver instead. */
#ifndef USE_KEYBOARD
#define USE_KEYBOARD 1
#endif
#if USE_KEYBOARD
2.3: 新建一个输入设备,注册读取键盘的回调函数
在main.c的 hal_init 函数里面修改
libinput_init(); //注意记得初始化libinput !!
static lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv); /*Basic initialization*/
indev_drv.type = LV_INDEV_TYPE_KEYPAD; //修改为使用键盘
indev_drv.read_cb = my_read_kbd; //修改为自己定义的回调函数
lv_indev_drv_register(&indev_drv);
2.4: 自己的回调函数实现文章来源地址https://www.toymoban.com/news/detail-612167.html
//此函数注册进输入设备之后,LVGL会周期性的调用此函数读取键盘值
void my_read_kbd(lv_indev_drv_t * indev_drv, lv_indev_data_t * data){
static uint8_t state = 0;
libinput_read(indev_drv,data); //这个函数是LVGL 的libinput.c驱动里面的函数,主要是读取键盘值
//自己的键盘值判断函数,LVGL默认做了回车键的触发,所以不需要实现回车功能,只需要切换上面组group里面选中的组件button即可
if(data->state == LV_INDEV_STATE_REL){ //如果松开
if(data->key == LV_KEY_DOWN && state == 1){ //如果下键按下,就切换组group 里面的聚焦组件
printf("down");
lv_group_focus_next(lv_group_get_default()); //选中组group里面下一个按键
state = 0;
}
}else if(data->state == LV_INDEV_STATE_PRESSED){ //如果按下
state = 1;
}
}
到了这里,关于LINUX LVGL 使用键盘方向键选择控件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!