【lvgl9】使用keyboard和textarea实现密码数字输入界面
lvgl9使用keyboard和textarea实现类似于密码数字输入界面
#define DEFAULT_PASSWORD "123456"lv_obj_t * current_password_cont = NULL;
lv_obj_t * pwd_ta = NULL;void remove_password_cont_background(void)
{if (pwd_ta != NULL) {lv_obj_del(pwd_ta);pwd_ta = NULL;}if (current_password_cont != NULL) {lv_obj_del(current_password_cont);current_password_cont = NULL;}
}static void async_remove_cont(void *arg) {remove_password_cont_background();
}static void kb_click_event(lv_event_t * e)
{lv_obj_t * kb = lv_event_get_target(e);uint16_t btn_id = lv_keyboard_get_selected_button(kb);const char * txt = lv_keyboard_get_button_text(kb, btn_id);if (txt && strcmp(txt, LV_SYMBOL_OK) == 0) {const char * input = lv_textarea_get_text(pwd_ta);printf("input:%s\r\n", input);size_t len = strlen(input);lv_obj_t * mbox = lv_msgbox_create(lv_scr_act());lv_msgbox_add_title(mbox, "Limit");lv_msgbox_add_close_button(mbox);lv_obj_set_style_text_font(mbox, &lv_font_montserrat_22, LV_PART_MAIN);lv_obj_set_size(mbox, 300, 110);lv_obj_center(mbox);if (len < 6) {lv_msgbox_add_text(mbox, "Please enter a password of length 6");return;}if (strcmp(input, DEFAULT_PASSWORD) == 0) {if (mbox != NULL) {lv_obj_del(mbox);mbox = NULL;}lv_async_call(async_remove_cont, NULL);} else {lv_msgbox_add_text(mbox, "Password error, please retry");}}
}static const char* kb_map[] = {"1", "2", "3", "\n","4", "5", "6", "\n","7", "8", "9", "\n","0", LV_SYMBOL_BACKSPACE,LV_SYMBOL_OK,NULL
};static const lv_buttonmatrix_ctrl_t kb_ctrl[] = {LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT,LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT,LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT,LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT
};void create_password_cont(void)
{if(current_password_cont != NULL) {remove_password_cont_background();}current_password_cont = lv_obj_create(lv_scr_act());lv_obj_set_style_bg_color(current_password_cont, lv_color_black(), LV_PART_MAIN|LV_STATE_DEFAULT);lv_obj_set_style_bg_opa(current_password_cont, LV_OPA_90, LV_PART_MAIN);lv_obj_set_scrollbar_mode(current_password_cont, LV_SCROLLBAR_MODE_OFF);lv_obj_set_style_radius(current_password_cont, 0, LV_PART_MAIN);lv_obj_set_style_border_opa(current_password_cont, 0, LV_PART_MAIN);lv_obj_set_size(current_password_cont, LV_PCT(100), LV_PCT(100));lv_obj_t *msg_label = lv_label_create(current_password_cont);lv_label_set_text(msg_label, "Please enter password");lv_obj_set_style_text_color(msg_label, lv_color_white(), LV_PART_MAIN|LV_STATE_DEFAULT);lv_obj_set_style_text_font(msg_label, &lv_font_montserrat_24, LV_PART_MAIN|LV_STATE_DEFAULT);lv_obj_align(msg_label, LV_ALIGN_TOP_MID, 0, 20);pwd_ta = lv_textarea_create(current_password_cont);lv_obj_set_size(pwd_ta, 100, 80);lv_obj_align(pwd_ta, LV_ALIGN_TOP_MID, 0, 80);lv_textarea_set_one_line(pwd_ta, true);lv_textarea_set_max_length(pwd_ta, 6);lv_textarea_set_password_mode(pwd_ta, true);lv_textarea_set_text(pwd_ta, "");lv_obj_t* kb = lv_keyboard_create(current_password_cont);lv_obj_set_size(kb, LV_PCT(100), LV_PCT(60));lv_obj_set_style_bg_color(kb, lv_color_black(), LV_PART_MAIN|LV_STATE_DEFAULT);lv_obj_set_style_bg_color(kb, lv_color_hex(0x404040), LV_PART_ITEMS | LV_STATE_DEFAULT);lv_obj_set_style_text_color(kb, lv_color_white(), LV_PART_ITEMS | LV_STATE_DEFAULT);lv_obj_set_style_text_font(kb, &lv_font_montserrat_24, LV_PART_ITEMS | LV_STATE_DEFAULT);lv_keyboard_set_map(kb, LV_KEYBOARD_MODE_USER_1, kb_map, kb_ctrl);lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_USER_1);lv_keyboard_set_textarea(kb, pwd_ta);lv_obj_add_event_cb(kb, kb_click_event, LV_EVENT_VALUE_CHANGED, NULL);lv_obj_move_foreground(current_password_cont);
}