lvgl 自定义矩阵键盘案例

image

demo


#define mydebug printf("%s: %s:line %d\n", __FILE__, __func__, __LINE__);
#define myDebugMsg(msg) printf("%s: %s:line %d %s:%s\n", __FILE__, __func__, __LINE__,#msg,msg);
#define mydebugNum(msg) printf("%s: %s:line %d %s:%d\n", __FILE__, __func__, __LINE__,#msg,msg);
lv_obj_t* obj_set_paret;
lv_obj_t* dialog_write_textarea_current;

/**********************
 *      MACROS
 **********************/
static void sdo_send_write(lv_event_t * e){mydebug;}
static void sdo_send_read(lv_event_t * e){mydebug;}
static void my_lv_keyboard_def_event_cb(lv_event_t * e){
    lv_obj_t * btn = lv_event_get_target(e);
    char * txt = lv_label_get_text(lv_obj_get_child(btn,0));
    if(txt == NULL) return;
    lv_obj_t * ta = lv_event_get_user_data(e);
    if(ta == NULL) return;
    
    if(lv_strcmp(txt, LV_SYMBOL_CLOSE) == 0 || lv_strcmp(txt, LV_SYMBOL_KEYBOARD) == 0) {
        if(ta) {
            lv_result_t res = lv_obj_send_event(ta, LV_EVENT_CANCEL, NULL);
            if(res != LV_RESULT_OK) return;
        }
        return;
    }
    else if(lv_strcmp(txt, LV_SYMBOL_OK) == 0) {
        if(ta) {
            lv_result_t res = lv_obj_send_event(ta, LV_EVENT_READY, NULL);
            if(res != LV_RESULT_OK) return;
        }
        return;
    }



    if(lv_strcmp(txt, "Enter") == 0 || lv_strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) {
        lv_textarea_add_char(ta, '\n');
        if(lv_textarea_get_one_line(ta)) {
            lv_result_t res = lv_obj_send_event(ta, LV_EVENT_READY, NULL);
            if(res != LV_RESULT_OK) return;
        }
    }
    else if(lv_strcmp(txt, LV_SYMBOL_LEFT) == 0) {
        lv_textarea_cursor_left(ta);
    }
    else if(lv_strcmp(txt, LV_SYMBOL_RIGHT) == 0) {
        lv_textarea_cursor_right(ta);
    }
    else if(lv_strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) {
        lv_textarea_delete_char(ta);
    }
    else if(lv_strcmp(txt, "+/-") == 0) {
        uint32_t cur        = lv_textarea_get_cursor_pos(ta);
        const char * ta_txt = lv_textarea_get_text(ta);
        if(ta_txt[0] == '-') {
            lv_textarea_set_cursor_pos(ta, 1);
            lv_textarea_delete_char(ta);
            lv_textarea_add_char(ta, '+');
            lv_textarea_set_cursor_pos(ta, cur);
        }
        else if(ta_txt[0] == '+') {
            lv_textarea_set_cursor_pos(ta, 1);
            lv_textarea_delete_char(ta);
            lv_textarea_add_char(ta, '-');
            lv_textarea_set_cursor_pos(ta, cur);
        }
        else {
            lv_textarea_set_cursor_pos(ta, 0);
            lv_textarea_add_char(ta, '-');
            lv_textarea_set_cursor_pos(ta, cur + 1);
        }
    }
    else {
        lv_textarea_add_text(ta, txt);
    }

}
static lv_obj_t* create_grid_btn(lv_obj_t * grid_cont, const char * text, int col_pos, int col_span,int row_pos, int32_t row_span)
{
    lv_obj_t * btn1 = lv_btn_create(grid_cont);
    lv_obj_set_style_min_height(btn1, 10, LV_PART_MAIN|LV_STATE_DEFAULT);
    lv_obj_set_style_min_width(btn1, 10, LV_PART_MAIN|LV_STATE_DEFAULT);
    lv_obj_set_style_bg_color(btn1, lv_color_hex(0x000000), LV_PART_MAIN|LV_STATE_DEFAULT);
    lv_obj_set_style_border_color(btn1, lv_color_hex(0x2E2E2E), LV_PART_MAIN|LV_STATE_DEFAULT);
    lv_obj_set_style_border_width(btn1, 2, LV_PART_MAIN|LV_STATE_DEFAULT);
    lv_obj_set_style_shadow_width(btn1, 0, LV_PART_MAIN|LV_STATE_DEFAULT);
    lv_obj_set_grid_cell(btn1, LV_GRID_ALIGN_STRETCH, col_pos, col_span,LV_GRID_ALIGN_STRETCH, row_pos, row_span);     /* 行起始0,占1行 */
    lv_obj_t * label1 = lv_label_create(btn1);
    LV_FONT_DECLARE(lv_font_montserrat_20);
    lv_obj_set_style_text_font(label1, &lv_font_montserrat_20, LV_PART_MAIN|LV_STATE_DEFAULT);
    lv_label_set_text(label1, text);
    lv_obj_center(label1);
    return btn1;
}

static void test2(void){

	obj_set_paret = lv_obj_create(lv_scr_act());
	// 设置对象的大小,宽度为屏幕宽度的25%,高度为屏幕高度的66%
	// lv_obj_set_size(obj_set_paret, LV_PCT(64), LV_PCT(62));
	lv_obj_set_size(obj_set_paret, 512, 298);
	// 设置对象的内边距为0
	lv_obj_set_style_pad_all(obj_set_paret, 0, 0);
	// 设置对象的背景颜色为深灰色
	lv_obj_set_style_bg_color(obj_set_paret, lv_color_make( 23, 24, 24), 0); // 深灰色背景
	// lv_obj_set_style_bg_opa(obj_set_paret, LV_OPA_TRANSP, LV_PART_MAIN); // 设置背景透明度
	// 设置对象的圆角半径为25
	lv_obj_set_style_radius(obj_set_paret, 6, 0); // 圆角矩形
	lv_obj_center(obj_set_paret);
	lv_obj_align(obj_set_paret, LV_ALIGN_CENTER, 105, -10);
	// 设置键盘区域边框宽度
	lv_obj_set_style_border_width(obj_set_paret, 0, 0);


	//输入框
	dialog_write_textarea_current = lv_textarea_create(obj_set_paret);
	//lv_obj_add_style(dialog_write_textarea_current, &style_font_dx1_36, 0);
	lv_textarea_set_one_line(dialog_write_textarea_current, true);//只显示一行
	lv_textarea_set_max_length(dialog_write_textarea_current, 11);
	lv_textarea_set_text(dialog_write_textarea_current, "1");

	// lv_label_set_long_mode(dialog_write_textarea_current, LV_LABEL_LONG_WRAP);
	lv_obj_align(dialog_write_textarea_current,LV_ALIGN_TOP_MID,0,10);
	lv_obj_set_size(dialog_write_textarea_current, 200, 50);
	lv_textarea_set_placeholder_text(dialog_write_textarea_current, "input");//点我输入值 设置文本占位符 设置了之后,如果 textarea 的文本内容为空时,文本占位符就会展示出来
	// lv_textarea_set_cursor_pos(dialog_write_textarea_current, LV_TEXTAREA_CURSOR_LAST);//将光标移动到末尾的位置(最后一个字符之后)
	// lv_obj_set_style_text_align(dialog_write_textarea_current, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN|LV_STATE_DEFAULT);
	lv_obj_set_style_border_width(dialog_write_textarea_current, 1, LV_PART_MAIN|LV_STATE_DEFAULT);
	lv_obj_set_style_border_color(dialog_write_textarea_current, lv_color_hex(0x2E2E2E), LV_PART_MAIN|LV_STATE_DEFAULT);

	lv_textarea_set_align(dialog_write_textarea_current, LV_TEXT_ALIGN_CENTER);

	// lv_obj_set_style_radius(dialog_write_textarea_current, 0, LV_PART_MAIN|LV_STATE_DEFAULT);
	lv_obj_set_style_text_color(dialog_write_textarea_current, lv_color_hex(0xffffff), LV_PART_MAIN|LV_STATE_DEFAULT);
	// lv_obj_set_style_text_opa(dialog_write_textarea_current, 255, LV_PART_MAIN|LV_STATE_DEFAULT);
	// lv_obj_set_style_text_letter_space(dialog_write_textarea_current, 2, LV_PART_MAIN|LV_STATE_DEFAULT);
	// lv_obj_set_style_text_line_space(dialog_write_textarea_current, 0, LV_PART_MAIN|LV_STATE_DEFAULT);
	// // lv_obj_set_style_text_align(dialog_write_textarea_current, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN|LV_STATE_DEFAULT);

	// lv_obj_set_style_bg_opa(dialog_write_textarea_current, 35, LV_PART_MAIN|LV_STATE_DEFAULT);
	lv_obj_set_style_bg_color(dialog_write_textarea_current, lv_color_make( 46, 48, 52), LV_PART_MAIN|LV_STATE_DEFAULT);
	// lv_obj_set_style_bg_grad_dir(dialog_write_textarea_current, LV_GRAD_DIR_NONE, LV_PART_MAIN|LV_STATE_DEFAULT);
	lv_obj_set_style_pad_top(dialog_write_textarea_current, 20, LV_PART_MAIN|LV_STATE_DEFAULT);
	// lv_obj_set_style_pad_right(dialog_write_textarea_current, 0, LV_PART_MAIN|LV_STATE_DEFAULT);
	// lv_obj_set_style_pad_bottom(dialog_write_textarea_current, 20, LV_PART_MAIN|LV_STATE_DEFAULT);
	// lv_obj_set_style_pad_left(dialog_write_textarea_current, 0, LV_PART_MAIN|LV_STATE_DEFAULT);
	// lv_obj_set_style_shadow_width(dialog_write_textarea_current, 0, LV_PART_MAIN|LV_STATE_DEFAULT);


	lv_obj_t* dialog_write_min_max = lv_label_create(obj_set_paret);
	lv_obj_set_style_text_color(dialog_write_min_max, lv_color_hex(0xffffff), LV_PART_MAIN|LV_STATE_DEFAULT);
	//lv_obj_add_style(dialog_write_label_status, &style_font_dx1_16, 0);
	lv_label_set_text(dialog_write_min_max, "[min max...]");//"[进行中...]");
	lv_label_set_long_mode(dialog_write_min_max, LV_LABEL_LONG_WRAP);
	// lv_obj_set_size(dialog_write_min_max, 240, 19);
	lv_obj_align_to(dialog_write_min_max,dialog_write_textarea_current,LV_ALIGN_OUT_RIGHT_MID,10,0);

	lv_obj_t* dialog_write_label_status = lv_label_create(obj_set_paret);
	lv_obj_set_style_text_color(dialog_write_label_status, lv_color_hex(0xffffff), LV_PART_MAIN|LV_STATE_DEFAULT);
	//lv_obj_add_style(dialog_write_label_status, &style_font_dx1_16, 0);
	lv_label_set_text(dialog_write_label_status, "[doing...]");//"[进行中...]");
	lv_label_set_long_mode(dialog_write_label_status, LV_LABEL_LONG_WRAP);
	// lv_obj_set_size(dialog_write_label_status, 240, 19);
	lv_obj_align(dialog_write_label_status,LV_ALIGN_BOTTOM_MID,0,-2);



	/* 创建网格容器 */
	lv_obj_t * grid_cont = lv_obj_create(obj_set_paret);
	lv_obj_align(grid_cont,LV_ALIGN_TOP_MID,0, 70);
	lv_obj_set_size(grid_cont, 300, 200);
	lv_obj_set_layout(grid_cont, LV_LAYOUT_GRID);
	lv_obj_set_style_bg_opa(grid_cont, LV_OPA_TRANSP, LV_PART_MAIN);

	// 移除容器默认的内边距和边框
	lv_obj_set_style_pad_all(grid_cont, 0, LV_PART_MAIN);
	lv_obj_set_style_border_width(grid_cont, 0, LV_PART_MAIN);
	lv_obj_set_style_radius(grid_cont, 0, LV_PART_MAIN);


	static lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
	static lv_coord_t row_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST};
	lv_obj_set_grid_dsc_array(grid_cont, col_dsc, row_dsc);

	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			char text[12]; sprintf(text, "%d", j*3+i+1);// 创建按钮1:占据第0行第0列,跨1行1列
			lv_obj_t * btn = create_grid_btn(grid_cont, text, i, 1,j, 1);
			lv_obj_add_event_cb(btn, my_lv_keyboard_def_event_cb, LV_EVENT_CLICKED, dialog_write_textarea_current);
		}
	}
	lv_obj_t * btn0 = create_grid_btn(grid_cont, "0", 0, 2, 3, 1);
	lv_obj_add_event_cb(btn0, my_lv_keyboard_def_event_cb, LV_EVENT_CLICKED, dialog_write_textarea_current);
	lv_obj_t * btnADD = create_grid_btn(grid_cont, "+/-", 2, 1, 3, 1);
	lv_obj_add_event_cb(btnADD, my_lv_keyboard_def_event_cb, LV_EVENT_CLICKED, dialog_write_textarea_current);
	lv_obj_t * btn1 = create_grid_btn(grid_cont, LV_SYMBOL_BACKSPACE, 3, 1, 0, 1);
	lv_obj_add_event_cb(btn1, my_lv_keyboard_def_event_cb, LV_EVENT_CLICKED, dialog_write_textarea_current);
	lv_obj_t * btn2 = create_grid_btn(grid_cont, LV_SYMBOL_REFRESH, 3, 1, 1, 1);
	lv_obj_add_event_cb(btn2, sdo_send_read, LV_EVENT_CLICKED, dialog_write_textarea_current);
	lv_obj_t * btn3 = create_grid_btn(grid_cont, "SEND", 3, 1, 2, 2);
	lv_obj_set_style_bg_color(btn3, lv_color_make(0, 97,236), LV_PART_MAIN|LV_STATE_DEFAULT);
	lv_obj_add_event_cb(btn3, sdo_send_write, LV_EVENT_CLICKED, dialog_write_textarea_current);

}
posted @ 2025-09-05 15:34  小城熊儿  阅读(44)  评论(0)    收藏  举报