从lvgl的教程了看到有现成的keyboard输入,但是发现有很多不好使的地方,一个是可以点击关闭就把键盘给关闭了。第二个是没有提供给用户处理关闭等事件的接口。此例子实现点击输入框显示键盘输入,点击输入框外关闭键盘。实验效果如下:
输入部分代码如下:希望帮到有需求的人。
static void ta_event_cb(lv_obj_t * ta, lv_event_t event);
static lv_obj_t * kb = NULL;
static void kb_event_cb(lv_obj_t * p_key, lv_event_t event)
{
if (event == LV_EVENT_CANCEL)
{
printf("CLOSE\n"); //自己处理关闭事件
return;
}
else if (event == LV_EVENT_APPLY)
{
printf("OK\n"); //OK事件
return;
}
lv_keyboard_def_event_cb(p_key, event); //这里回调原来的处理函数
}
static void ta_event_cb(lv_obj_t * ta, lv_event_t event)
{
if (event == LV_EVENT_VALUE_CHANGED) {
const char * txt = lv_textarea_get_text(ta);
if (txt[0] >= '0' && txt[0] <= '9' &&
txt[1] >= '0' && txt[1] <= '9' &&
txt[2] != ':')
{
lv_textarea_set_cursor_pos(ta, 2);
lv_textarea_add_char(ta, ':');
}
}
else if (event == LV_EVENT_FOCUSED)
{
if (kb != NULL)return;
kb = lv_keyboard_create(t2, NULL);
lv_obj_set_size(kb, 400, 200);
lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUM);
lv_keyboard_set_textarea(kb, ta);
lv_keyboard_set_cursor_manage(kb, true);
lv_obj_set_event_cb(kb, kb_event_cb); //设置自己处理事件,避免kb自己点击就关闭了输入
}
else if (event == LV_EVENT_DEFOCUSED)
{
if (kb != NULL)
{
lv_obj_del(kb);
kb = NULL;
}
}
}
static parameter_creat(lv_obj_t * parent)
{
lv_page_set_scrl_layout(parent, LV_LAYOUT_PRETTY_TOP);
lv_obj_t * ta = lv_textarea_create(parent, NULL);
lv_obj_set_event_cb(ta, ta_event_cb);
lv_textarea_set_accepted_chars(ta, "0123456789:");
lv_textarea_set_max_length(ta, 5);
lv_textarea_set_one_line(ta, true);
lv_textarea_set_text(ta, "");
}
最近编辑记录 vip888888 (2020-11-06 12:30:15)
离线