LINUX LVGL 使用键盘方向键选择控件

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 函数里面修改

  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: 自己的回调函数实现

//此函数注册进输入设备之后,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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漏洞百出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值