用户工具

站点工具


icore4tlvgl_34
银杏科技有限公司旗下技术文档发布平台
技术支持电话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 模式布局包含要改变模式的按钮。使用 lv_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
};

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);                       /* 为键盘分配文本区域 */
}
icore4tlvgl_34.txt · 最后更改: 2022/04/01 11:17 由 sean