| **银杏科技有限公司旗下技术文档发布平台** ||||
|技术支持电话|**0379-69926675-801**|||
|技术支持邮件|Gingko@vip.163.com|||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^
| V1.0 | 2021-01-06 | yang | 初次建立 |
===== 实验三十四:lv_keyboard键盘 =====
==== 一、键盘 ====
键盘对象是一个特殊的按钮矩阵,具有预定义的按键映射和其他特性,以实现虚拟键盘的文本写入。键盘包括两个部分:
* **LV_KEYBOARD_PART_BG** 这是主体部分,并使用了所有典型的背景属性。
* **LV_KEYBOARD_PART_BTN** 这是按钮的虚拟部分,它也使用所有典型的背景属性和文本属性。
==== 二、模式 ====
键盘具有以下模式:
* **LV_KEYBOARD_MODE_TEXT_LOWER** 显示小写字母
* **LV_KEYBOARD_MODE_TEXT_UPPER** 显示大写字母
* **LV_KEYBOARD_MODE_TEXT_SPECIAL** 显示特殊字符
* **LV_KEYBOARD_MODE_NUM** 显示数字,+/-号和小数点。
该 **TEXT** 模式布局包含要改变模式的按钮。使用 l**v_keyboard_set_mode(kb, mode)** 可以手动设置键盘模式,默认键盘模式为**LV_KEYBOARD_MODE_TEXT_UPPER**。
==== 三、分配文本区域 ====
使用 **lv_keyboard_set_textarea(kb, ta)** 可以为键盘分配一个文本区域,键盘控件自动将用户单击的字符放在此处。
指定文本区域的光标可以通过键盘管理:当键盘被分配给新的文本区域时,前一个文本区域的光标将被隐藏,新文本区域的光标将被显示。当用户通过点击“**Ok**”或“**Close**”按钮关闭键盘时,光标也将被隐藏。光标管理器功能由 **lv_keyboard_set_cursor_manage(kb, true)**启用,默认为不启用。
==== 四、新布局 ====
用户可以使用 **lv_keyboard_set_map(kb, map)** 和 **lv_keyboard_set_ctrl_map(kb, ctrl_map)** 为键盘指定一个新的映射(布局)。了解更多关于按钮矩阵对象。请记住,使用以下关键字将产生与原始键盘分布相同的效果:
* **LV_SYMBOL_OK** 应用。
* **LV_SYMBOL_CLOSE** 关闭。
* **LV_SYMBOL_BACKSPACE** 左侧删除。
* **LV_SYMBOL_LEFT** 向左移动光标。
* **LV_SYMBOL_RIGHT** 向右移动光标。
* **“ABC”** 加载大写键盘分布。
* **“abc”** 加载小写字母键盘分布。
* **“Enter”** 换行。
==== 五、事件 ====
除了通用事件外,键盘还会发送以下特殊事件:
* **LV_EVENT_VALUE_CHANGED** 按下/释放按钮时,或在长按后重复时发送。事件数据设置为按下/释放按钮的 ID。
* **LV_EVENT_APPLY** “Ok”按钮被点击。
* **LV_EVENT_CANCEL** “Close”按钮被点击。
键盘具有一个名为 **lv_keyboard_def_event_cb** 的默认事件处理回调函数。它处理按钮的按下,键盘分布的更改,指定文本区域等。用户可以将其完全替换为自定义事件处理回调函数,并且,可以在自定义的回调函数开头调用 **lv_keyboard_def_event_cb** 以处理与前面相同的事情。
以下键值由按钮处理:
* **LV_KEY_RIGHT / UP / LEFT / RIGHT** 在按钮之间导航并选择一个。
* **LV_KEY_ENTER** 按下/释放所选按钮。
注意:在测试时发现按键的f、c、F、C键触摸不到,在lv_keyboard.c文件中修改对应按键的相对宽度后可以正常使用。
/* lv_keyboard.c */
/* 键盘按键标签文本数组 */
static const char * const default_kb_map_lc[] = {"1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n",
"ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n",
"_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n",
LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""
};
/* 按键对应相对宽度 */
static const lv_btnmatrix_ctrl_t default_kb_ctrl_lc_map[] = {
LV_KEYBOARD_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7,
LV_KEYBOARD_CTRL_BTN_FLAGS | 7, 4, 4, 4, 5, 4, 4, 4, 4, 4, 6, /* f键宽度相对加一,5 */
6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 6, 6, /* c键宽度相对加一,7 */
LV_KEYBOARD_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KEYBOARD_CTRL_BTN_FLAGS | 2
};
{{ :icore4t:icore4t_rtt_lvgl_34_1.gif?direct |}}
lv_obj_t * kb;
lv_obj_t * ta;
lv_obj_t * ta2;
static void ta_event(lv_obj_t * obj, lv_event_t event) /* 文本区域1回调函数 */
{
lv_keyboard_set_textarea(kb, ta); /* 获取键盘光标 */
lv_textarea_set_cursor_hidden(ta2, true); /* 隐藏光标 */
lv_textarea_set_cursor_hidden(ta, false); /* 显示光标 */
}
static void ta2_event(lv_obj_t * obj, lv_event_t event) /* 文本区域2回调函数 */
{
lv_keyboard_set_textarea(kb, ta2); /* 获取键盘光标 */
lv_textarea_set_cursor_hidden(ta, true); /* 隐藏光标 */
lv_textarea_set_cursor_hidden(ta2, false); /* 显示光标 */
}
void lv_gui_run(void) {
lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */
kb = lv_keyboard_create(lv_scr_act(), NULL); /* 创建键盘对象 */
lv_keyboard_set_cursor_manage(kb, true); /* 使能光标管理 */
ta = lv_textarea_create(lv_scr_act(), NULL); /* 创建文本区域1 */
lv_obj_set_size(ta, 200, 100); /* 设置尺寸 */
lv_obj_align(ta, NULL, LV_ALIGN_IN_TOP_LEFT, 20, 20); /* 设置位置 */
lv_textarea_set_text(ta, ""); /* 设置文本 */
lv_obj_set_event_cb(ta, ta_event); /* 设置回调函数 */
ta2 = lv_textarea_create(lv_scr_act(), NULL); /* 创建文本区域1 */
lv_obj_set_size(ta2, 200, 100); /* 设置尺寸 */
lv_obj_align(ta2, NULL, LV_ALIGN_IN_TOP_RIGHT, -20, 20);/* 设置位置 */
lv_textarea_set_text(ta2, ""); /* 设置文本 */
lv_obj_set_event_cb(ta2, ta2_event); /* 设置回调函数 */
lv_keyboard_set_textarea(kb, ta); /* 为键盘分配文本区域 */
}