| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**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); /* 为键盘分配文本区域 */ }