Types of input devices

配置输入设备的时候,需要初始化一个lv_indev_drv_t类型的变量:

lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);      /*Basic initialization*/
indev_drv.type =...                 /*See below.*/
indev_drv.read_cb =...              /*See below.*/
/*Register the driver in LVGL and save the created input device object*/
lv_indev_t * my_indev = lv_indev_drv_register(&indev_drv);

上述代码中type可以是如下值之一:

  • LV_INDEV_TYPE_POINTER 触摸板或者鼠标
  • LV_INDEV_TYPE_KEYPAD 键盘或者按键板
  • LV_INDEV_TYPE_ENCODER 能左、右、按下的编码器
  • LV_INDEV_TYPE_BUTTON 外部的能按屏幕的按键

read_cb是一个函数指针,这个函数会被周期性的调用来报告一个输入设备的当前状态。它也可以缓存数据。当缓存中没有数据读的时候,返回false,当缓存非空的时候,返回true。

请前往Input devices章节获取更多关于输入设备的信息。

Touchpad, mouse or any pointer

可以点击屏幕上的点的设备属于这一类。

indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = my_input_read;...bool my_input_read(lv_indev_drv_t * drv, lv_indev_data_t*data)
{data->point.x = touchpad_x;data->point.y = touchpad_y;data->state = LV_INDEV_STATE_PR or LV_INDEV_STATE_REL;return false; /*No buffering now so no more data read*/
}

提示:这一类设备在“LV_INDEC_STATE_REL”状态的时候,也要报告X/Y的坐标。

Keypad or keyboard

有完整字母的键盘,或者只有几个导航按键的按键板输入这一类。

要使用键盘或者按键板,需要做下面这些事情:

  • 用LV_INDEV_TYPE_KEYPAD类型注册read_cb。
  • 在lv_conf.h中使能LV_USE_GROUP。
  • 用lv_group_t *g = lv_group_create()创建对象组,然后用lv_group_add_obj(g, obj)向对象组中添加对象。
  • 用lv_indev_set_group(my_indev, g)将创建的对象组赋值给输入设备。其中,my_indev是lv_indev_drv_register()的返回值。
  • 用LV_KEY_…在组内的对象之间导航。键值详见lv_core/lv_group.h。
indev_drv.type = LV_INDEV_TYPE_KEYPAD;
indev_drv.read_cb = keyboard_read;...bool keyboard_read(lv_indev_drv_t * drv, lv_indev_data_t*data){data->key = last_key();            /*Get the last pressed or released key*/if(key_pressed()) data->state = LV_INDEV_STATE_PR;else data->state = LV_INDEV_STATE_REL;return false; /*No buffering now so no more data read*/
}

Encoder

用编码器,你可以做以下4件事:

  1. 短按其按键;
  2. 长按其按键
  3. 左转;
  4. 右转;

简而言之,编码器类输入设备的工作方式如下:

  • 通过转编码器,你可以在对象之间移动焦点。
  • 在简单对象(例如按键)上按编码器,这个对象将会被点击。
  • 在复杂对象(例如列表,消息盒子等等)上按编码器,对象会进入编辑模式,这个时候,转编码器能在这个复杂对象内部移动焦点。
  • 长按按键,退出编辑模式。

与按键板类似,要使用编码器,对象需要添加到对象组里。

indev_drv.type = LV_INDEV_TYPE_ENCODER;
indev_drv.read_cb = encoder_read;...bool encoder_read(lv_indev_drv_t * drv, lv_indev_data_t*data){data->enc_diff = enc_get_new_moves();if(enc_pressed()) data->state = LV_INDEV_STATE_PR;else data->state = LV_INDEV_STATE_REL;return false; /*No buffering now so no more data read*/
}

Using buttons with Encoder logic

除了标准的编码器行为以外,你也可以利用其逻辑用按键来移动焦点,编辑控件。如果你只有几个按键的时候,这会非常方便。或者可以同时使用按键和编码器。

你需要有三个按键可用:

  • LV_KEY_ENTER 模拟编码器的按钮
  • LV_KEY_LEFT 模拟编码器左转
  • LV_KEY_RIGHT 模拟编码器右转
  • 其他按键将传递给有焦点的空间

如果按住按键不放,将会模拟周期性的编码器点击事件。周期由indev_drv.long_press_rep_time来指定。

indev_drv.type = LV_INDEV_TYPE_ENCODER;
indev_drv.read_cb = encoder_with_keys_read;...bool encoder_with_keys_read(lv_indev_drv_t * drv, lv_indev_data_t*data){data->key = last_key();            /*Get the last pressed or released key*//* use LV_KEY_ENTER for encoder press */if(key_pressed()) data->state = LV_INDEV_STATE_PR;else {data->state = LV_INDEV_STATE_REL;/* Optionally you can also use enc_diff, if you have encoder*/data->enc_diff = enc_get_new_moves();}return false; /*No buffering now so no more data read*/
}

Button

按键的意思是放在屏幕旁边映射到屏幕固定坐标的实际按键。如果一个按键被按下了,就将模拟按在屏幕上映射的坐标处。(类似于触摸板)

用lv_indev_set_button_points(my_indev, points_array)来映射按键到坐标。其中,points_array是这个样子的:const lv_point_t points_array[] = {{10, 30}, {60. 90}, …}

需要注意的是,points_array需要是全局的,或者是函数里面的静态变量。

indev_drv.type = LV_INDEV_TYPE_BUTTON;
indev_drv.read_cb = button_read;...bool button_read(lv_indev_drv_t * drv, lv_indev_data_t*data){static uint32_t last_btn = 0;   /*Store the last pressed button*/int btn_pr = my_btn_read();     /*Get the ID (0,1,2...) of the pressed button*/if(btn_pr >= 0) {               /*Is there a button press? (E.g. -1 indicated no button was pressed)*/last_btn = btn_pr;           /*Save the ID of the pressed button*/data->state = LV_INDEV_STATE_PR;  /*Set the pressed state*/} else {data->state = LV_INDEV_STATE_REL; /*Set the released state*/}data->btn = last_btn;            /*Save the last button*/return false;                    /*No buffering now so no more data read*/
}

Other features

除了read_cb之外,lv_indev_drv_t中还有一个feedback_cb回调可以用。feedback_cb在输入设备发送任何类型的事件的时候都会被调用。(与设备类型无关)。这能实现给用户的反馈,例如LV_EVENT_CLICK时间发生时,播放一个音效。

下面这些参数的默认值可以在lv_conf.h中设置,但是这些默认值在lv_indev_drv_t变量中可以被覆盖。

  • drag_limit 在实际拖动object之前,移动的像素数。
  • drag_throw 拖动放开时的减速速度,单位是【%】。值越大,减速越快。
  • long_press_time 按下多长时间发送LV_EVENT_LONG_PRESSED(单位毫秒)。
  • long_press_rep_time 发送LV_EVENT_LONG_PRESSED_REPEAT的时间间隔。
  • read_task 指向lv_task的指针,这个函数使用来读取输入设备的。他的参数可以用lv_task_…()函数来改变。

每个输入设备都被分配到一个display。默认情况下,新的输入设备被添加到最后创建或者最后选择(用lv_disp_set_default())的display。分配到的display存储在disp域,并且可以改变。

LVGL官方文档-7.11.0-5-Porting-Input device interface相关推荐

  1. LVGL官方文档-7.11.0-14-Overview-Displays

    Multiple display support 在LVGL中,可以存在多个Display,每个都有他们各自的Driver和Object.唯一的限制是这些Display的颜色深度要一样(由LV_COL ...

  2. LVGL官方文档-7.11.0-4-Porting-Display interface

    为了配置一个Display,一个lv_disp_buf_t类型的变量和一个lv_disp_drv_t类型的变量必须要初始化. lv_disp_buf_t 包含内部的图像buffer lv_disp_d ...

  3. LVGL官方文档-7.11.0-8-Porting-Logging

    默认情况下,LVGL不是线程安全的. 但是,在下列情况下,调用LVGL相关函数是安全的. 在Event中. 在lv_task中. Tasks and threads 如果需要使用正常的Task或者是线 ...

  4. Harbor安装教程-完全根据官方文档2.6.0版本

    说明: 版本2.6.0 一.安装要求 硬件 硬件类型 最小要求 建议 CPU 2 CPU 4 CPU 内存 4 GB 8GB 硬盘 40 GB 160 GB 软件 软件名称 版本 Docker eng ...

  5. tensorflow官方文档_Tensorflow 2.0 Preview 官方文档

    TensorFlow 2.0目前放出了Preview版本.目前想了解TensorFlow 2.0最快的方式就是查看官方API中的变化.本文列举一些从TF官方API中看出的TF 2.0的改进. Tens ...

  6. django官方文档1.11编翻:1-1-1概述

    django概述 因为django是在快节奏的编辑环境下开发的,它旨在使常见的Web开发任务变得快速而简单. 这是一个关于如何用django编写数据库驱动的Web应用程序的非正式概述. 本文档的目的是 ...

  7. (6)APB总线协议——(官方文档阅读APB3.0)

    第一章:简介 1.1APB3介绍 低速总线协议 时钟上升沿采样,每次数据传输需要两个时钟周期 可与AHB/AXI接口连接 第二章:数据传输 2.1写传输 2.1.1无等待状态 分析: 写传输从地址.写 ...

  8. 官方文档太辣鸡?TensorFlow 2.0开源工具书,30天「无痛」上手

    本文转载自机器之心. 项目作者:lyhue1991 「官方文档排布凌乱.搜索难用.API 丑陋不堪--」这是很多人对 TensorFlow 官方文档的吐槽.但吐槽归吐槽,到了工业界,你是无论如何也绕不 ...

  9. tensorflow官方文档_开源分享:最好的TensorFlow入门教程

    如果一门技术的学习曲线过于陡峭,那么我们在入门时的场景往往是,一鼓作气,没入门,再而衰,三而竭.演绎一出从入门到放弃的败走麦城. 今天发现一个入门TensorFlow的宝藏,迫不及待的分享给大家.这个 ...

最新文章

  1. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例
  2. 通达信板块监控指标_【精选指标】通达信创业板涨停变色主图指标,助你股海捉龙擒牛!...
  3. 【易创课堂】第2期开课啦,大包新年好礼成都等你
  4. 理解水平扩展和垂直扩展
  5. Java中抽象类和接口
  6. python图像处理笔记-八-针孔照相机模型与照相机标定
  7. 关于消灭冲击波的蠕虫
  8. java dht 爬虫_python开发的 dht网络爬虫
  9. 2021年物联网设备CVE天梯榜
  10. 基金交易席位的制度沿袭
  11. 【阿里Java技术进阶】官方钉群直播大全(持续更新)...
  12. word2010公式编辑器 格式设置
  13. hao123劫持浏览器主页
  14. node.js基于vue的化妆品销售管理系统的设计与实现毕业设计源码151314
  15. kylin build过程详解
  16. html登陆成功自动跳转,点击登录,登陆成功,自动跳转到起始页面,这要怎么做?...
  17. Kotlin高仿微信-第6篇-主页-我的
  18. mysql 失败 捕获 net core_从NetCore报错到MySql安全
  19. Linux中ifconfig command not found
  20. js中导入引用外部js

热门文章

  1. 以太网标准-802.3各个标准简介
  2. Android 判断当前设备是手机还是平板
  3. Kubernetes (K8s) 安装部署过程(七)之部署node节点
  4. 网络地址转换——NAT
  5. 回顾|伍鸣博士出席《华人之光-世界瞩目的华人 Web3 项目》圆桌论坛
  6. 最新阿里云短信服务接口类【亲测成功】
  7. ASP 模板引擎,ASP 模板类 (Taihom.Template.class)
  8. ML.net 3-情绪预测
  9. matlab ewt使用方法,ewt升学e网通怎么使用,ewt升学e网通使用解析
  10. json rpgmv 加密_加密-如何对JSON对象进行加密哈希处理?