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

这篇具有很好参考价值的文章主要介绍了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: 自己的回调函数实现文章来源地址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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LVGL 学习】进度条(BAR)控件学习

    1.1 Bar 简介 Bar 控件由一个背景和一个指示器组成,进度条会根据宽度和高度的大小自动选择是水平进度条还是垂直进度条,比如 Bar 的宽度小于其高度,则创建垂直进度条。 2.1 Bar 样式 Bar 的样式部分按照其组成分类,LV_PART_MAIN 对应背景部分的皮肤,它使用典型的背景样式属

    2024年02月16日
    浏览(26)
  • LVGL——文本区域与键盘

    目录 一、文本区域 1、部件组成 2、部件操作 1、创建 2、添加文本 3、光标设置 4、删除文本 5、设置模式 6、限制输入 7、设置占位符 8、获取文本 9、比对文本内容 二、键盘 1、部件组成 2、部件操作 1、创建 2、关联文本框 3、设置按键弹窗 4、设置键盘类型 三、项目案例 主

    2024年04月15日
    浏览(28)
  • LVGL学习笔记 28 - 键盘keyboard

    目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事件 键盘是一个特殊的按键矩阵,自身实现了按键(map)映射和其他

    2024年02月13日
    浏览(31)
  • LVGL:拓展部件——键盘 lv_keyboard

    此控件特点: 特殊Button矩阵: lv_keyboard 本质上是一个经过定制的 按钮矩阵 控件。每个按钮都可以独立触发事件或响应。 预定义的键映射: lv_keyboard 自带了一套预设的 按键布局 和 对应的字符映射表 ,开发者可以根据需要选择或自定义这些键映射。 与 lv_textarea 配合使用:

    2024年03月20日
    浏览(29)
  • 合宙Air724UG LuatOS-Air LVGL API控件-图片(Gif)

    图片(Gif) GIF图片显示,core版本号要=3211 方法一 方法二 lvgl.gif_create 调用 lvgl.gif_create(par) 功能 创建一个GIF图片对象 返回 指向GIF图片对象的指针 参数 par 指向对象的指针, 它将是新键对象的父对象 lvgl.gif_set_src 调用 lvgl.img_set_src(gif, data) 功能 设置GIF图片控件的显示内容 参数

    2024年02月07日
    浏览(37)
  • 合宙Air724UG LuatOS-Air LVGL API控件--按钮 (Button)

    按钮 (Button) 按钮控件,这个就不用多说了,界面的基础控件之一。 示例代码 – 按键回调函数 event_handler = function(obj, event) if event == lvgl.EVENT_CLICKED then print(“Clickedn”) elseif event == lvgl.EVENT_VALUE_CHANGED then print(“Toggledn”) end end – 按键1 btn1 = lvgl.btn_create(lvgl.scr_act(), nil) lvgl.o

    2024年02月11日
    浏览(36)
  • 合宙Air724UG LuatOS-Air LVGL API控件--曲线 (Arc)

    曲线 (Arc) 曲线控件,也可以称为弧。因为 Arc 本身就是弧,弧形的意思。根据控件的样子也能推测出它的使用场景,一般用在加载器(就是等待界面转的圈圈)或者数值显示,数值调节这些场景。曲线控件分了两个部分,前景和背景,都可以分别进行设置。 示例代码 – 创建曲

    2024年02月11日
    浏览(45)
  • 合宙Air724UG LuatOS-Air LVGL API控件--容器 (Container)

    容器 (Container) 容器是 lvgl 相当重要的一个控件了,可以设置布局,容器的大小也会自动进行调整,利用容器可以创建出自适应成都很高的界面布局。 代码示例 – 创建容器 cont = lvgl.cont_create(lvgl.scr_act(), nil) lvgl.obj_set_auto_realign(cont, true) lvgl.obj_align(cont, nil, lvgl.ALIGN_CENTER, 0, 0)

    2024年02月10日
    浏览(30)
  • 合宙Air724UG LuatOS-Air LVGL API控件-页面 (Page)

    页面 (Page) 当控件内容过多,无法在屏幕内完整显示时,可让其在  页面  内显示。 通过函数  lvgl.page_create  可以创建一个页面 页面对象可以像容器一样设置各个方向上的匹配模式,可以把需要显示的对象添加进页面进行显示,页面可以作为控件的父容器。就像下面这样,

    2024年02月09日
    浏览(42)
  • 合宙Air724UG LuatOS-Air LVGL API控件--图表 (Chart)

    图表 (Chart) 一幅图胜过一千个字,通过图表展示出的数据内容能让用户更快速有效的了解数据特征。 代码示例 – 创建图表 chart = lvgl.chart_create(lvgl.scr_act(), nil) lvgl.obj_set_size(chart, 200, 150) lvgl.obj_align(chart, nil, lvgl.ALIGN_CENTER, 0, 0) – 设置 Chart 的显示模式 (折线图) lvgl.chart_set_typ

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包