【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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落淼喵_G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值