lvgl 自定义矩阵键盘案例

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);
}

浙公网安备 33010602011771号