LVGL基本控件介绍

1. 弧(lv_arc)

特点

  1. 弧的0度在右边,90度在下边

效果图

源码

void lv_arc_demo(void) {/* Create an Arc */lv_obj_t* arc = lv_arc_create(lv_scr_act(), NULL);/* Set Background range */lv_arc_set_bg_angles(arc, 0, 360);/* Set Forward range */lv_arc_set_angles(arc, 90, 270);/* Set size */lv_obj_set_size(arc, 150, 150);/* Set position */lv_obj_align(arc, NULL, LV_ALIGN_CENTER, 0, 0);
}

 

2. 进度条(lv_bar)

特点

改变数值时,参数选择LV_ANIM_ON,可以使数值均匀变化,参数选择LV_ANIM_OFF则直接改变。

效果图

 

源码

void lv_bar_demo(void) {/* Create a bar */lv_obj_t* bar = lv_bar_create(lv_scr_act(), NULL);/* set value range */lv_bar_set_range(bar, 0, 100);/* Set animation during time */lv_bar_set_anim_time(bar, 2000);/* Set Forward range */lv_bar_set_value(bar, 50, LV_ANIM_ON);/* Set size */lv_obj_set_size(bar, 200, 20);/* Set position */lv_obj_align(bar, NULL, LV_ALIGN_CENTER, 0, 0);
}

3. 按钮(lv_btn)

效果图

源码

/*** @brief add style to button* @param btn pointer to lv_btn* @param type 0 GUM 1 Halo 2 Ripple*/
void add_btn_style(lv_obj_t* btn, uint8_t type) {static lv_anim_path_t path_overshoot;lv_anim_path_init(&path_overshoot);lv_anim_path_set_cb(&path_overshoot, lv_anim_path_overshoot);static lv_anim_path_t path_ease_out;lv_anim_path_init(&path_ease_out);lv_anim_path_set_cb(&path_ease_out, lv_anim_path_ease_out);static lv_anim_path_t path_ease_in_out;lv_anim_path_init(&path_ease_in_out);lv_anim_path_set_cb(&path_ease_in_out, lv_anim_path_ease_in_out);static lv_style_t style_btn;lv_style_init(&style_btn);switch (type) {case 0:/* Gum-like button */lv_style_set_transform_width(&style_btn, LV_STATE_PRESSED, 10);lv_style_set_transform_height(&style_btn, LV_STATE_PRESSED, -10);lv_style_set_value_letter_space(&style_btn, LV_STATE_PRESSED, 5);lv_style_set_transition_path(&style_btn, LV_STATE_DEFAULT,&path_overshoot);lv_style_set_transition_path(&style_btn, LV_STATE_PRESSED,&path_ease_in_out);lv_style_set_transition_time(&style_btn, LV_STATE_DEFAULT, 250);lv_style_set_transition_delay(&style_btn, LV_STATE_DEFAULT, 100);lv_style_set_transition_prop_1(&style_btn, LV_STATE_DEFAULT,LV_STYLE_TRANSFORM_WIDTH);lv_style_set_transition_prop_2(&style_btn, LV_STATE_DEFAULT,LV_STYLE_TRANSFORM_HEIGHT);lv_style_set_transition_prop_3(&style_btn, LV_STATE_DEFAULT,LV_STYLE_VALUE_LETTER_SPACE);break;case 1:/* Halo-like button */lv_style_set_transition_time(&style_btn, LV_STATE_PRESSED, 400);lv_style_set_transition_time(&style_btn, LV_STATE_DEFAULT, 0);lv_style_set_transition_delay(&style_btn, LV_STATE_DEFAULT, 200);lv_style_set_outline_width(&style_btn, LV_STATE_DEFAULT, 0);lv_style_set_outline_width(&style_btn, LV_STATE_PRESSED, 20);lv_style_set_outline_opa(&style_btn, LV_STATE_DEFAULT, LV_OPA_COVER);lv_style_set_outline_opa(&style_btn, LV_STATE_PRESSED, LV_OPA_TRANSP);lv_style_set_transition_prop_1(&style_btn, LV_STATE_DEFAULT,LV_STYLE_OUTLINE_OPA);lv_style_set_transition_prop_2(&style_btn, LV_STATE_DEFAULT,LV_STYLE_OUTLINE_WIDTH);case 2:/*Ripple-like button */lv_style_set_transition_time(&style_btn, LV_STATE_PRESSED, 300);lv_style_set_transition_time(&style_btn, LV_STATE_DEFAULT, 0);lv_style_set_transition_delay(&style_btn, LV_STATE_DEFAULT, 300);lv_style_set_bg_opa(&style_btn, LV_STATE_DEFAULT, 0);lv_style_set_bg_opa(&style_btn, LV_STATE_PRESSED, LV_OPA_80);lv_style_set_border_width(&style_btn, LV_STATE_DEFAULT, 0);lv_style_set_outline_width(&style_btn, LV_STATE_DEFAULT, 0);lv_style_set_transform_width(&style_btn, LV_STATE_DEFAULT, -20);lv_style_set_transform_height(&style_btn, LV_STATE_DEFAULT, -20);lv_style_set_transform_width(&style_btn, LV_STATE_PRESSED, 0);lv_style_set_transform_height(&style_btn, LV_STATE_PRESSED, 0);lv_style_set_transition_path(&style_btn, LV_STATE_DEFAULT,&path_ease_out);lv_style_set_transition_prop_1(&style_btn, LV_STATE_DEFAULT,LV_STYLE_BG_OPA);lv_style_set_transition_prop_2(&style_btn, LV_STATE_DEFAULT,LV_STYLE_TRANSFORM_WIDTH);lv_style_set_transition_prop_3(&style_btn, LV_STATE_DEFAULT,LV_STYLE_TRANSFORM_HEIGHT);default:break;}lv_obj_add_style(btn, LV_BTN_PART_MAIN, &style_btn);
}void lv_btn_demo(void) {/* Create a button */lv_obj_t* btn = lv_btn_create(lv_scr_act(), NULL);lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 0, -80);/*Instead of creating a label add a values string*/lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,"Buttom");/* Add style to the button */add_btn_style(btn, 0);
}

4. 按钮矩阵(lv_btnmatrix)

特点:设置按键宽度设置的是与同行按钮的相对宽度比,不是绝对宽度

效果图

源码

static void event_handler(lv_obj_t* obj, lv_event_t event) {if (event == LV_EVENT_VALUE_CHANGED) {const char* txt = lv_btnmatrix_get_active_btn_text(obj);printf("%s was pressed\n", txt);}
}static const char* btnm_map[] = {"1",  "2",  "3",       "4",       "5","\n", "6",  "7",       "8",       "9","0",  "\n", "Action1", "Action2", ""};void lv_btnmatrix_demo(void) {lv_obj_t* btnm = lv_btnmatrix_create(lv_scr_act(), NULL);lv_btnmatrix_set_map(btnm, btnm_map);/* Make "Action1" twice as wide as "Action2" */lv_btnmatrix_set_btn_width(btnm, 10, 2);lv_btnmatrix_set_btn_ctrl(btnm, 10, LV_BTNMATRIX_CTRL_CHECKABLE);lv_btnmatrix_set_btn_ctrl(btnm, 11, LV_BTNMATRIX_CTRL_CHECK_STATE);lv_obj_align(btnm, NULL, LV_ALIGN_CENTER, 0, 0);lv_obj_set_event_cb(btnm, event_handler);
}

5. 日历(lv_calendar)

特点:设置高亮日期的时候,存储日期的变量需要为全局变量或者静态变量,因为该控件的显示只存储变量指针。

效果图

源码

static void event_handler(lv_obj_t* obj, lv_event_t event) {if (event == LV_EVENT_VALUE_CHANGED) {lv_calendar_date_t* date = lv_calendar_get_pressed_date(obj);if (date) {printf("Clicked date: %02d.%02d.%d\n", date->day, date->month,date->year);}}
}void lv_calendar_demo(void) {lv_obj_t* calendar = lv_calendar_create(lv_scr_act(), NULL);lv_obj_set_size(calendar, 235, 235);lv_obj_align(calendar, NULL, LV_ALIGN_CENTER, 0, 0);lv_obj_set_event_cb(calendar, event_handler);/*Make the date number smaller to be sure they fit into their area*/lv_obj_set_style_local_text_font(calendar, LV_CALENDAR_PART_DATE,LV_STATE_DEFAULT, lv_theme_get_font_small());/*Set today's date*/lv_calendar_date_t today;today.year = 2022;today.month = 12;today.day = 17;lv_calendar_set_today_date(calendar, &today);lv_calendar_set_showed_date(calendar, &today);/*Highlight a few days*/static lv_calendar_date_t highlighted_days[3]; /*Only its pointer will besaved so should be static*/highlighted_days[0].year = 2022;highlighted_days[0].month = 12;highlighted_days[0].day = 1;highlighted_days[1].year = 2022;highlighted_days[1].month = 12;highlighted_days[1].day = 15;highlighted_days[2].year = 2022;highlighted_days[2].month = 11;highlighted_days[2].day = 20;lv_calendar_set_highlighted_dates(calendar, highlighted_days, 3);
}

6. 画布(lv_canvas)

特点:设置旋转角度的时候,注意分辨率为0.1deg,即900->90度

效果图

源码

#define CANVAS_WIDTH 200
#define CANVAS_HEIGHT 150void lv_canvas_demo(void) {/* Set rectangle painter style */lv_draw_rect_dsc_t rect_dsc;lv_draw_rect_dsc_init(&rect_dsc);rect_dsc.radius = 10;rect_dsc.bg_opa = LV_OPA_COVER;rect_dsc.bg_grad_dir = LV_GRAD_DIR_HOR;rect_dsc.bg_color = LV_COLOR_RED;rect_dsc.bg_grad_color = LV_COLOR_BLUE;rect_dsc.border_width = 2;rect_dsc.border_opa = LV_OPA_90;rect_dsc.border_color = LV_COLOR_WHITE;rect_dsc.shadow_width = 5;rect_dsc.shadow_ofs_x = 5;rect_dsc.shadow_ofs_y = 5;/* Set label painter style */lv_draw_label_dsc_t label_dsc;lv_draw_label_dsc_init(&label_dsc);label_dsc.color = LV_COLOR_YELLOW;/* Create a canvas */static lv_color_tcbuf[LV_CANVAS_BUF_SIZE_TRUE_COLOR(CANVAS_WIDTH, CANVAS_HEIGHT)];lv_obj_t* canvas = lv_canvas_create(lv_scr_act(), NULL);lv_canvas_set_buffer(canvas, cbuf, CANVAS_WIDTH, CANVAS_HEIGHT,LV_IMG_CF_TRUE_COLOR);/* Set position */lv_obj_align(canvas, NULL, LV_ALIGN_CENTER, 0, 0);/* Set background color */lv_canvas_fill_bg(canvas, LV_COLOR_SILVER, LV_OPA_COVER);/* Draw rectangle and label */lv_canvas_draw_rect(canvas, 70, 60, 100, 70, &rect_dsc);lv_canvas_draw_text(canvas, 40, 20, 100, &label_dsc,"My name is JozenLee", LV_LABEL_ALIGN_LEFT);/* Rotate the img of 10 deg */static lv_color_t cbuf_tmp[CANVAS_WIDTH * CANVAS_HEIGHT];memcpy(cbuf_tmp, cbuf, sizeof(cbuf_tmp));lv_img_dsc_t img;img.data = (void*)cbuf_tmp;img.header.cf = LV_IMG_CF_TRUE_COLOR;img.header.w = CANVAS_WIDTH;img.header.h = CANVAS_HEIGHT;lv_canvas_fill_bg(canvas, LV_COLOR_SILVER, LV_OPA_COVER);lv_canvas_transform(canvas, &img, 100, LV_IMG_ZOOM_NONE, 0, 0, CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2, true);
}

7. 复选框(lv_cb)

效果图

源码

static void event_handler(lv_obj_t* obj, lv_event_t event) {if (event == LV_EVENT_VALUE_CHANGED) {printf("State: %s\n",lv_checkbox_is_checked(obj) ? "Checked" : "Unchecked");}
}void lv_cb_demo(void) {lv_obj_t* cb = lv_checkbox_create(lv_scr_act(), NULL);lv_checkbox_set_text(cb, "My name is JozenLee.");lv_obj_align(cb, NULL, LV_ALIGN_CENTER, 0, 0);lv_obj_set_event_cb(cb, event_handler);
}

8. 图表(lv_chart)

效果图

源码

void lv_chart_demo(void) {/*Create a chart*/lv_obj_t* chart;chart = lv_chart_create(lv_scr_act(), NULL);lv_obj_set_size(chart, 200, 150);lv_obj_align(chart, NULL, LV_ALIGN_CENTER, 0, 0);/*Show lines and points too*/lv_chart_set_type(chart, LV_CHART_TYPE_LINE);/*Add a faded are effect*//* Set Max opa */lv_obj_set_style_local_bg_opa(chart, LV_CHART_PART_SERIES, LV_STATE_DEFAULT,LV_OPA_50); /* Set gradual change direction */lv_obj_set_style_local_bg_grad_dir(chart, LV_CHART_PART_SERIES,LV_STATE_DEFAULT, LV_GRAD_DIR_VER);/* Set max opa on the top */lv_obj_set_style_local_bg_main_stop(chart, LV_CHART_PART_SERIES,LV_STATE_DEFAULT,255); /* Set transparent on the bottom */lv_obj_set_style_local_bg_grad_stop(chart, LV_CHART_PART_SERIES,LV_STATE_DEFAULT,0); /*Add two data series*/lv_chart_series_t* ser1 = lv_chart_add_series(chart, LV_COLOR_RED);lv_chart_series_t* ser2 = lv_chart_add_series(chart, LV_COLOR_GREEN);/*Set the next points on 'ser1'*/lv_chart_set_next(chart, ser1, 31);lv_chart_set_next(chart, ser1, 66);lv_chart_set_next(chart, ser1, 10);lv_chart_set_next(chart, ser1, 89);lv_chart_set_next(chart, ser1, 63);lv_chart_set_next(chart, ser1, 56);lv_chart_set_next(chart, ser1, 32);lv_chart_set_next(chart, ser1, 35);lv_chart_set_next(chart, ser1, 57);lv_chart_set_next(chart, ser1, 85);/*Directly set points on 'ser2'*/ser2->points[0] = 92;ser2->points[1] = 71;ser2->points[2] = 61;ser2->points[3] = 15;ser2->points[4] = 21;ser2->points[5] = 35;ser2->points[6] = 35;ser2->points[7] = 58;ser2->points[8] = 31;ser2->points[9] = 53;/* Required after data set */lv_chart_refresh(chart);
}

9. 容器(lv_cont)

效果图

源码

void lv_cont_demo(void) {lv_obj_t* cont;cont = lv_cont_create(lv_scr_act(), NULL);/* Auto realign when the size changes */lv_obj_set_auto_realign(cont, true);/* This parametrs will be sued when realigned */lv_obj_align_origo(cont, NULL, LV_ALIGN_CENTER, 0, 0);lv_cont_set_fit(cont, LV_FIT_TIGHT);lv_cont_set_layout(cont, LV_LAYOUT_COLUMN_MID);lv_obj_t* label;/* create a label */label = lv_label_create(cont, NULL);lv_label_set_text(label, "Short text");/* create a label */label = lv_label_create(cont, NULL);lv_label_set_text(label, "It is a long text");/* create a btn */lv_obj_t* btn = lv_btn_create(cont, NULL);lv_obj_set_size(btn, 150, 40);lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,"Here is a Button");
}

10. 颜色选择器(lv_cpicker)

效果图

源码

void lv_cpicker_demo(void) {/* Create a cpicker */lv_obj_t* cpicker;cpicker = lv_cpicker_create(lv_scr_act(), NULL);/* Set cpicker style */static lv_style_t style_cpicker_main;lv_style_set_pad_inner(&style_cpicker_main, LV_STATE_DEFAULT, 20);lv_style_set_scale_width(&style_cpicker_main, LV_STATE_DEFAULT, 20);lv_obj_add_style(cpicker, LV_CPICKER_PART_MAIN, &style_cpicker_main);/* Set cpicker type */lv_cpicker_set_type(cpicker, LV_CPICKER_TYPE_DISC);/* Set cpicker size */lv_obj_set_size(cpicker, 200, 200);/* Set cpicker position */lv_obj_align(cpicker, NULL, LV_ALIGN_CENTER, 0, 0);/* Set color */lv_cpicker_set_color(cpicker, LV_COLOR_BLUE);
}

11. 下拉列表(lv_dropdown)

效果图

源码

static void event_handler(lv_obj_t* obj, lv_event_t event) {if (event == LV_EVENT_VALUE_CHANGED) {char buf[32];lv_dropdown_get_selected_str(obj, buf, sizeof(buf));printf("Option: %s\n", buf);}
}void lv_jozen_gui(void) {/* Create a normal drop down list */lv_obj_t* ddlist = lv_dropdown_create(lv_scr_act(), NULL);/* Set list options */lv_dropdown_set_options(ddlist,"Apple\n""Banana\n""Orange\n""Melon\n""Grape\n""Raspberry");/* Set list show direction */lv_dropdown_set_dir(ddlist, LV_DROPDOWN_DIR_UP);/* Set list symbol */lv_dropdown_set_symbol(ddlist, LV_SYMBOL_HOME);/* Set position */lv_obj_align(ddlist, NULL, LV_ALIGN_CENTER, 0, 0);/* Set Callback */lv_obj_set_event_cb(ddlist, event_handler);
}

12. 量规(lv_gauge)

特点:指针的样式可以用img替代 指针颜色数组需要为全局变量或静态变量

效果图

源码

void lv_gauge_demo(void) {/* Describe the color for the needles */static lv_color_t needle_colors[3];needle_colors[0] = LV_COLOR_BLUE;needle_colors[1] = LV_COLOR_ORANGE;needle_colors[2] = LV_COLOR_PURPLE;/* Create a gauge */lv_obj_t* gauge = lv_gauge_create(lv_scr_act(), NULL);lv_gauge_set_needle_count(gauge, 3, needle_colors);lv_obj_set_size(gauge, 200, 200);lv_obj_align(gauge, NULL, LV_ALIGN_CENTER, 0, 0);/* Set the range */lv_gauge_set_range(gauge, 0, 200);/* Set the critical value */lv_gauge_set_critical_value(gauge, 160);/* Set the values */lv_gauge_set_value(gauge, 0, 20);lv_gauge_set_value(gauge, 1, 30);lv_gauge_set_value(gauge, 2, 60);
}

13. 图片(lv_img)

特点:1.图片的来源可以是 >代码中的变量(带有像素的C数组) >外部存储的文件(例如SD卡上的文件 >符号 文字 2.官方提供了在线网站进行图像的处理,LVGL在线图像处理

效果图

源码

#define SLIDER_WIDTH 20
#define SLIDER_HEIGHT 200static void create_sliders(void);
static void slider_event_cb(lv_obj_t* slider, lv_event_t event);static lv_obj_t *red_slider, *green_slider, *blue_slider, *intense_slider;
static lv_obj_t* img;
LV_IMG_DECLARE(img_cogwheel_argb);void lv_img_demo(void) {/*Create 4 sliders to adjust RGB color and re-color intensity*/create_sliders();/* Create a image */img = lv_img_create(lv_scr_act(), NULL);lv_img_set_src(img, &img_cogwheel_argb);lv_obj_align(img, NULL, LV_ALIGN_IN_RIGHT_MID, -100, 0);
}static void slider_event_cb(lv_obj_t* slider, lv_event_t event) {if (event == LV_EVENT_VALUE_CHANGED) {/* Recolor the image based on the sliders' values */lv_color_t color = lv_color_make(lv_slider_get_value(red_slider),lv_slider_get_value(green_slider),lv_slider_get_value(blue_slider));lv_opa_t intense = lv_slider_get_value(intense_slider);lv_obj_set_style_local_image_recolor_opa(img, LV_IMG_PART_MAIN,LV_STATE_DEFAULT, intense);lv_obj_set_style_local_image_recolor(img, LV_IMG_PART_MAIN,LV_STATE_DEFAULT, color);}
}static void create_sliders(void) {/* Create a set of RGB sliders *//* Use the red one as a base for all the settings */red_slider = lv_slider_create(lv_scr_act(), NULL);lv_slider_set_range(red_slider, 0, 255);lv_obj_set_size(red_slider, SLIDER_WIDTH,SLIDER_HEIGHT); /* Be sure it's a vertical slider */lv_obj_set_style_local_bg_color(red_slider, LV_SLIDER_PART_INDIC,LV_STATE_DEFAULT, LV_COLOR_RED);lv_obj_set_event_cb(red_slider, slider_event_cb);/* Copy it for the other three sliders */green_slider = lv_slider_create(lv_scr_act(), red_slider);lv_obj_set_style_local_bg_color(green_slider, LV_SLIDER_PART_INDIC,LV_STATE_DEFAULT, LV_COLOR_GREEN);blue_slider = lv_slider_create(lv_scr_act(), red_slider);lv_obj_set_style_local_bg_color(blue_slider, LV_SLIDER_PART_INDIC,LV_STATE_DEFAULT, LV_COLOR_BLUE);intense_slider = lv_slider_create(lv_scr_act(), red_slider);lv_obj_set_style_local_bg_color(intense_slider, LV_SLIDER_PART_INDIC,LV_STATE_DEFAULT, LV_COLOR_GRAY);lv_slider_set_value(intense_slider, 255, LV_ANIM_OFF);/* Set the position of four slider */lv_obj_align(red_slider, NULL, LV_ALIGN_IN_LEFT_MID, 20, 0);lv_obj_align(green_slider, red_slider, LV_ALIGN_OUT_RIGHT_MID, 20, 0);lv_obj_align(blue_slider, green_slider, LV_ALIGN_OUT_RIGHT_MID, 20, 0);lv_obj_align(intense_slider, blue_slider, LV_ALIGN_OUT_RIGHT_MID, 20, 0);
}

14. 图片按钮(lv_imgbtn)

效果图

源码

void lv_imgbtn_demo(void) {LV_IMG_DECLARE(imgbtn_green);LV_IMG_DECLARE(imgbtn_blue);/* Darken the button when pressed */static lv_style_t style;lv_style_init(&style);lv_style_set_image_recolor_opa(&style, LV_STATE_PRESSED, LV_OPA_30);lv_style_set_image_recolor(&style, LV_STATE_PRESSED, LV_COLOR_BLACK);lv_style_set_text_color(&style, LV_STATE_DEFAULT, LV_COLOR_WHITE);/*Create an Image button*/lv_obj_t* imgbtn = lv_imgbtn_create(lv_scr_act(), NULL);lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, &imgbtn_green);lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_PRESSED, &imgbtn_green);lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_CHECKED_RELEASED, &imgbtn_blue);lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_CHECKED_PRESSED, &imgbtn_blue);lv_imgbtn_set_checkable(imgbtn, true);lv_obj_add_style(imgbtn, LV_IMGBTN_PART_MAIN, &style);lv_obj_align(imgbtn, NULL, LV_ALIGN_CENTER, 0, 0);/*Create a label on the Image button*/lv_obj_t* label = lv_label_create(imgbtn, NULL);lv_label_set_text(label, "Button");
}

15. 键盘(lv_keyboard)

效果图

源码

static lv_obj_t* kb;
static lv_obj_t* ta;static void kb_event_cb(lv_obj_t* keyboard, lv_event_t e) {lv_keyboard_def_event_cb(kb, e);if (e == LV_EVENT_CANCEL) {lv_keyboard_set_textarea(kb, NULL);lv_obj_del(kb);kb = NULL;}
}static void kb_create(void) {kb = lv_keyboard_create(lv_scr_act(), NULL);/* Show cursor in the text area */lv_keyboard_set_cursor_manage(kb, true);lv_obj_set_event_cb(kb, kb_event_cb);lv_keyboard_set_textarea(kb, ta);
}static void ta_event_cb(lv_obj_t* ta_local, lv_event_t e) {if (e == LV_EVENT_CLICKED && kb == NULL) {kb_create();}
}void lv_keyboard_demo(void) {/* Create a text area. The keyboard will write here */ta = lv_textarea_create(lv_scr_act(), NULL);lv_obj_align(ta, NULL, LV_ALIGN_IN_TOP_MID, 0, LV_DPI / 16);lv_obj_set_event_cb(ta, ta_event_cb);/* Set text */lv_textarea_set_text(ta, "My name is JozenLee");/* Reset height of text area if necessary */lv_coord_t max_h = LV_VER_RES / 2 - LV_DPI / 8;if (lv_obj_get_height(ta) > max_h) lv_obj_set_height(ta, max_h);/* Create a keyboard */kb_create();
}

16. 标签(lv_label)

效果图

源码

void lv_label_demo(void) {/* Create a label of long text */lv_obj_t* label1 = lv_label_create(lv_scr_act(), NULL);/* Break the long lines */lv_label_set_long_mode(label1, LV_LABEL_LONG_BREAK);/* Enable re-coloring of the label */lv_label_set_recolor(label1, true);lv_label_set_align(label1, LV_LABEL_ALIGN_CENTER); /*Center aligned lines*//* Set text of the label with diff color */lv_label_set_text(label1,"#0000ff Re-color# #ff00ff words# #ff0000 of a# label ""and  wrap long text automatically.");lv_obj_set_width(label1, 150);lv_obj_align(label1, NULL, LV_ALIGN_CENTER, 0, -30);/* Create a label of long text */lv_obj_t* label2 = lv_label_create(lv_scr_act(), NULL);/* Circular scroll */lv_label_set_long_mode(label2, LV_LABEL_LONG_SROLL_CIRC); lv_obj_set_width(label2, 100);lv_label_set_text(label2, "It is a circularly scrolling text. ");lv_obj_align(label2, NULL, LV_ALIGN_CENTER, 0, 30);
}

17. LED(lv_led)

特点:1.LED的ON和OFF状态实则为修改亮度为0或255

效果图

源码

void lv_led_demo(void) {/* Create a LED and switch it OFF */lv_obj_t* led1 = lv_led_create(lv_scr_act(), NULL);lv_obj_align(led1, NULL, LV_ALIGN_CENTER, -80, 0);lv_led_off(led1);/* Copy the previous LED and change its brightness */lv_obj_t* led2 = lv_led_create(lv_scr_act(), led1);lv_obj_align(led2, NULL, LV_ALIGN_CENTER, 0, 0);lv_led_set_bright(led2, 190);/* Copy the previous LED and switch it ON */lv_obj_t* led3 = lv_led_create(lv_scr_act(), led1);lv_obj_align(led3, NULL, LV_ALIGN_CENTER, 80, 0);lv_led_on(led3);
}

18. 线(lv_line)

效果图

源码

void lv_line_demo(void) {/* Create an array for the points of the line */static lv_point_t line_points[] = {{5, 5}, {70, 70}, {120, 10}, {180, 60}, {240, 10}};/* Create style */static lv_style_t style_line;lv_style_init(&style_line);lv_style_set_line_width(&style_line, LV_STATE_DEFAULT, 8);lv_style_set_line_color(&style_line, LV_STATE_DEFAULT, LV_COLOR_RED);/* Add round angle to the line */lv_style_set_line_rounded(&style_line, LV_STATE_DEFAULT, true);/* Create a line and apply the new style */lv_obj_t* line1;line1 = lv_line_create(lv_scr_act(), NULL);lv_line_set_points(line1, line_points, 5);               /*Set the points*/lv_obj_add_style(line1, LV_LINE_PART_MAIN, &style_line); /*Set the points*/lv_obj_align(line1, NULL, LV_ALIGN_CENTER, 0, 0);
}

19. 列表(lv_list)

特点:

1.使用lv_list_up(list),lv_list_down(list),lv_list_focus(btn, LV_ANIM_ON/OFF) 可以在列表中进行导航

2. 使用lv_list_set_anim_time(list, anim_time) 设置按钮切换时间

3. 列表的上下导航 只是控制列表滚轮的移动,并不会选中按钮。选中需要用 lv_list_focus

4. 列表需要为全局或者静态变量,才可以使用滚动动画的功能

效果图

源码

lv_obj_t* list;static void list_event_handler(lv_obj_t* obj, lv_event_t event) {if (event == LV_EVENT_CLICKED) {printf("Clicked: %s\n", lv_list_get_btn_text(obj));}
}static void btn_down_event_handler(lv_obj_t* obj, lv_event_t event) {if (event == LV_BTN_STATE_PRESSED) {lv_list_down(list);}
}static void btn_up_event_handler(lv_obj_t* obj, lv_event_t event) {if (event == LV_BTN_STATE_PRESSED) {lv_list_up(list);}
}void create_btn(void) { /* Create a btn to control list down */lv_obj_t* btn = lv_btn_create(lv_scr_act(), NULL); lv_obj_align(btn, NULL, LV_ALIGN_IN_LEFT_MID, 50, 30);lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,LV_SYMBOL_DOWN" List Down");lv_obj_set_event_cb(btn, btn_down_event_handler);/* Create a btn to control list up */btn = lv_btn_create(lv_scr_act(), NULL); lv_obj_align(btn, NULL, LV_ALIGN_IN_LEFT_MID, 50, -30);lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,LV_SYMBOL_UP" List Up");lv_obj_set_event_cb(btn, btn_up_event_handler);
}lv_obj_t* llbtn;
void lv_list_demo(void) {/*Create a list*/list = lv_list_create(lv_scr_act(), NULL);lv_obj_set_size(list, 160, 100);lv_obj_align(list, NULL, LV_ALIGN_CENTER, 50, 0);/* Create Control Buttom*/create_btn();/*Add buttons to the list*/lv_obj_t* list_btn;list_btn = lv_list_add_btn(list, LV_SYMBOL_FILE, "New");lv_obj_set_event_cb(list_btn, list_event_handler); list_btn = lv_list_add_btn(list, LV_SYMBOL_DIRECTORY, "Open");lv_obj_set_event_cb(list_btn, list_event_handler);list_btn = lv_list_add_btn(list, LV_SYMBOL_CLOSE, "Delete");lv_obj_set_event_cb(list_btn, list_event_handler);list_btn = lv_list_add_btn(list, LV_SYMBOL_EDIT, "Edit");lv_obj_set_event_cb(list_btn, list_event_handler);llbtn = list_btn;list_btn = lv_list_add_btn(list, LV_SYMBOL_SAVE, "Save");lv_obj_set_event_cb(list_btn, list_event_handler);list_btn = lv_list_add_btn(list, LV_SYMBOL_BELL, "Notify");lv_obj_set_event_cb(list_btn, list_event_handler);list_btn = lv_list_add_btn(list, LV_SYMBOL_BATTERY_FULL, "Battery");lv_obj_set_event_cb(list_btn, list_event_handler);/* Set anim time of btn transform */lv_list_set_anim_time(list, 500);/* Set list edge flash */lv_list_set_edge_flash(list, true);/* Focus on `Edit` btn */lv_list_focus_btn(list, llbtn);
}

20. 仪表(lv_linemeter)

效果图

源码

void lv_linemeter_demo(void) {/* Create a line meter */lv_obj_t* lmeter;lmeter = lv_linemeter_create(lv_scr_act(), NULL);/* Set the range */lv_linemeter_set_range(lmeter, 0, 100);  /* Set the current value */lv_linemeter_set_value(lmeter, 80);  /* Set the angle and number of lines */lv_linemeter_set_scale(lmeter, 280, 24); /* Set size and pos */lv_obj_set_size(lmeter, 150, 150);lv_obj_align(lmeter, NULL, LV_ALIGN_CENTER, 0, 0);
}

21. 消息框(lv_msgbox)

特点:btn_map数量只可为0-2

效果图

源码

static void event_handler(lv_obj_t* obj, lv_event_t event) {if (event == LV_EVENT_VALUE_CHANGED) {printf("Button: %s\n", lv_msgbox_get_active_btn_text(obj));}
}void lv_msgbox_demo(void) {static const char* btns[] = {"Apply", "Close", ""};lv_obj_t* mbox = lv_msgbox_create(lv_scr_act(), NULL);lv_msgbox_set_text(mbox, "A message box with two buttons.");lv_msgbox_add_btns(mbox, btns);lv_obj_set_width(mbox, 200);lv_obj_set_event_cb(mbox, event_handler);lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0); /*Align to the corner*/
}

22. 对象蒙版(lv_objmask)

特点:蒙版的OPA 0代表完全覆盖,255代表全透明蒙版需作用在对象上

效果图1

源码1

void lv_objmask_demo1(void) {/*Set a very visible color for the screen to clearly see what happens*/lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN,LV_STATE_DEFAULT, lv_color_hex3(0x33f));lv_obj_t* om = lv_objmask_create(lv_scr_act(), NULL);lv_obj_set_size(om, 200, 200);lv_obj_align(om, NULL, LV_ALIGN_CENTER, 0, 0);lv_obj_t* label = lv_label_create(om, NULL);lv_label_set_long_mode(label, LV_LABEL_LONG_BREAK);lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);lv_obj_set_width(label, 180);lv_label_set_text(label, "This label will be masked out. See how it works.");lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 20);lv_obj_t* cont = lv_cont_create(om, NULL);lv_obj_set_size(cont, 180, 100);lv_obj_set_drag(cont, true);lv_obj_align(cont, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -10);lv_obj_t* btn = lv_btn_create(cont, NULL);lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 0, 0);lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,"Button");lv_area_t a;lv_draw_mask_radius_param_t r1;/* Add circular mask and keep the pixels outside it */a.x1 = 10;a.y1 = 10;a.x2 = 190;a.y2 = 190;lv_draw_mask_radius_init(&r1, &a, LV_RADIUS_CIRCLE, false);lv_objmask_add_mask(om, &r1);/* Add circular mask and keep the pixels inside it */a.x1 = 100;a.y1 = 100;a.x2 = 150;a.y2 = 150;lv_draw_mask_radius_init(&r1, &a, LV_RADIUS_CIRCLE, true);lv_objmask_add_mask(om, &r1);/* Add linear mask  */lv_draw_mask_line_param_t l1;lv_draw_mask_line_points_init(&l1, 0, 0, 100, 200,LV_DRAW_MASK_LINE_SIDE_TOP);lv_objmask_add_mask(om, &l1);/* Add fade mask with grad effect*/lv_draw_mask_fade_param_t f1;a.x1 = 100;a.y1 = 0;a.x2 = 200;a.y2 = 200;lv_draw_mask_fade_init(&f1, &a, LV_OPA_TRANSP, 0, LV_OPA_COVER, 150);lv_objmask_add_mask(om, &f1);
}

效果图2

源码2

#define MASK_WIDTH 100
#define MASK_HEIGHT 50void lv_objmask_demo2(void) {/* Create the mask of a text by drawing it to a canvas */static lv_opa_t mask_map[MASK_WIDTH * MASK_HEIGHT];/* Create a "8 bit alpha" canvas and clear it */lv_obj_t* canvas = lv_canvas_create(lv_scr_act(), NULL);lv_canvas_set_buffer(canvas, mask_map, MASK_WIDTH, MASK_HEIGHT,LV_IMG_CF_ALPHA_8BIT);lv_canvas_fill_bg(canvas, LV_COLOR_BLACK, LV_OPA_TRANSP);/* Draw a label to the canvas. The result "image" will be used as mask */lv_draw_label_dsc_t label_dsc;lv_draw_label_dsc_init(&label_dsc);label_dsc.color = LV_COLOR_WHITE;lv_canvas_draw_text(canvas, 5, 5, MASK_WIDTH, &label_dsc,"My name is JozenLee", LV_LABEL_ALIGN_CENTER);/*The mask is reads the canvas is not required anymore*/lv_obj_del(canvas);/*Create an object mask which will use the created mask*/lv_obj_t* om = lv_objmask_create(lv_scr_act(), NULL);lv_obj_set_size(om, MASK_WIDTH, MASK_HEIGHT);lv_obj_align(om, NULL, LV_ALIGN_CENTER, 0, 0);/*Add the created mask map to the object mask*/lv_draw_mask_map_param_t m;lv_area_t a;a.x1 = 0;a.y1 = 0;a.x2 = MASK_WIDTH - 1;a.y2 = MASK_HEIGHT - 1;lv_draw_mask_map_init(&m, &a, mask_map);lv_objmask_add_mask(om, &m);/*Create a style with gradient*/static lv_style_t style_bg;lv_style_init(&style_bg);lv_style_set_bg_opa(&style_bg, LV_STATE_DEFAULT, LV_OPA_COVER);lv_style_set_bg_color(&style_bg, LV_STATE_DEFAULT, LV_COLOR_RED);lv_style_set_bg_grad_color(&style_bg, LV_STATE_DEFAULT, LV_COLOR_BLUE);lv_style_set_bg_grad_dir(&style_bg, LV_STATE_DEFAULT, LV_GRAD_DIR_HOR);/* Create an object with the gradient style on the object mask.* The text will be masked from the gradient*/lv_obj_t* bg = lv_obj_create(om, NULL);lv_obj_reset_style_list(bg, LV_OBJ_PART_MAIN);lv_obj_add_style(bg, LV_OBJ_PART_MAIN, &style_bg);lv_obj_set_size(bg, MASK_WIDTH, MASK_HEIGHT);
}

23. 页面(lv_page)

效果图

源码

void lv_page_demo(void) {/* Create a page */lv_obj_t* page = lv_page_create(lv_scr_act(), NULL);lv_obj_set_size(page, 150, 200);lv_obj_align(page, NULL, LV_ALIGN_CENTER, 0, 0);/* Set scrollor to show when it was dragged */lv_page_set_scrlbar_mode(page, LV_SCRLBAR_MODE_DRAG);/* Create a label on the page */lv_obj_t* label = lv_label_create(page, NULL);/* Automatically break long lines */lv_label_set_long_mode(label, LV_LABEL_LONG_BREAK);/* Set the label width to max value */lv_obj_set_width(label, lv_page_get_width_fit(page));lv_label_set_text(label,"Lorem ipsum dolor sit amet, consectetur adipiscing elit,\n""sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n""Ut enim ad minim veniam, quis nostrud exercitation ullamco\n""laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure\n""dolor in reprehenderit in voluptate velit esse cillum dolore\n""eu fugiat nulla pariatur.\n""Excepteur sint occaecat cupidatat non proident, sunt in culpa\n""qui officia deserunt mollit anim id est laborum.");
}

24. 滚筒(lv_roller)

效果图

源码

static void event_handler(lv_obj_t* obj, lv_event_t event) {if (event == LV_EVENT_VALUE_CHANGED) {char buf[32];lv_roller_get_selected_str(obj, buf, sizeof(buf));printf("Selected month: %s\n", buf);}
}void lv_roller_demo(void) {/* Create a roller */lv_obj_t* roller1 = lv_roller_create(lv_scr_act(), NULL);/* Add options to the roller */lv_roller_set_options(roller1,"January\n""February\n""March\n""April\n""May\n""June\n""July\n""August\n""September\n""October\n""November\n""December",LV_ROLLER_MODE_INIFINITE);/* Set the number of option in roller showed one time */lv_roller_set_visible_row_count(roller1, 4);lv_obj_align(roller1, NULL, LV_ALIGN_CENTER, 0, 0);lv_obj_set_event_cb(roller1, event_handler);
}

25. 滑杆(lv_slider)

效果图

源码

static lv_obj_t* slider_label;
static void slider_event_cb(lv_obj_t* slider, lv_event_t event) {if (event == LV_EVENT_VALUE_CHANGED) {static charbuf[4]; /* max 3 bytes for number plus 1 null terminating byte */snprintf(buf, 4, "%u", lv_slider_get_value(slider));lv_label_set_text(slider_label, buf);}
}void lv_slider_demo(void) {/* Create a slider in the center of the display */lv_obj_t* slider = lv_slider_create(lv_scr_act(), NULL);lv_obj_set_width(slider, LV_DPI * 2);lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 0);lv_obj_set_event_cb(slider, slider_event_cb);/* Set slider range */lv_slider_set_range(slider, 0, 100);/* Set slider type*/lv_slider_set_type(slider, LV_SLIDER_TYPE_NORMAL);/* Create a label below the slider */slider_label = lv_label_create(lv_scr_act(), NULL);lv_label_set_text(slider_label, "0");lv_obj_set_auto_realign(slider_label, true);lv_obj_align(slider_label, slider, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);/* Create an informative label */lv_obj_t* info = lv_label_create(lv_scr_act(), NULL);lv_label_set_text(info,"Move the slider and see that the label\n""updates to match it.");lv_obj_align(info, NULL, LV_ALIGN_CENTER, 0, -30);
}

26. 数字调整框(lv_spinbox)

效果图

源码

static lv_obj_t* spinbox;
static void lv_spinbox_increment_event_cb(lv_obj_t* btn, lv_event_t e) {if (e == LV_EVENT_SHORT_CLICKED || e == LV_EVENT_LONG_PRESSED_REPEAT) {lv_spinbox_increment(spinbox);}
}static void lv_spinbox_decrement_event_cb(lv_obj_t* btn, lv_event_t e) {if (e == LV_EVENT_SHORT_CLICKED || e == LV_EVENT_LONG_PRESSED_REPEAT) {lv_spinbox_decrement(spinbox);}
}void lv_spinbox_demo(void) {/* Create a spinbox */spinbox = lv_spinbox_create(lv_scr_act(), NULL);lv_spinbox_set_range(spinbox, -1000, 90000);/* Set digit format */lv_spinbox_set_digit_format(spinbox, 5, 2);/* Select digit step by multiple the step by 10,this can be changed by mouse */lv_spinbox_step_prev(spinbox);lv_obj_set_width(spinbox, 100);lv_obj_align(spinbox, NULL, LV_ALIGN_CENTER, 0, 0);/* Create control button */lv_coord_t h = lv_obj_get_height(spinbox);lv_obj_t* btn = lv_btn_create(lv_scr_act(), NULL);lv_obj_set_size(btn, h, h);lv_obj_align(btn, spinbox, LV_ALIGN_OUT_RIGHT_MID, 5, 0);lv_theme_apply(btn, LV_THEME_SPINBOX_BTN);lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,LV_SYMBOL_PLUS);lv_obj_set_event_cb(btn, lv_spinbox_increment_event_cb);btn = lv_btn_create(lv_scr_act(), btn);lv_obj_align(btn, spinbox, LV_ALIGN_OUT_LEFT_MID, -5, 0);lv_obj_set_event_cb(btn, lv_spinbox_decrement_event_cb);lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT,LV_SYMBOL_MINUS);
}

27. 旋转器(lv_spinner)

效果图

源码

void lv_spinner_demo(void) {/* Create a spinner object */lv_obj_t* spinner = lv_spinner_create(lv_scr_act(), NULL);lv_obj_set_size(spinner, 100, 100);lv_obj_align(spinner, NULL, LV_ALIGN_CENTER, 0, 0);/* Set spin type */lv_spinner_set_type(spinner, LV_SPINNER_TYPE_FILLSPIN_ARC);}

28. 开关(lv_switch)

效果图

源码

static void event_handler(lv_obj_t *obj, lv_event_t event) {if (event == LV_EVENT_VALUE_CHANGED) {printf("State: %s\n", lv_switch_get_state(obj) ? "On" : "Off");}
}void lv_switch_demo(void) {/*Create a switch and apply the styles*/lv_obj_t *sw = lv_switch_create(lv_scr_act(), NULL);lv_obj_align(sw, NULL, LV_ALIGN_CENTER, 0, 0);lv_obj_set_event_cb(sw, event_handler);lv_switch_on(sw, true);
}

29. 表格(lv_table)

特点:表格的API函数封装的不是很好,可以考虑使用lv_obj_get_ext_attr 获取对应类型的指针来直接修改数据位。

效果图

源码

void lv_table_demo(void) {lv_obj_t* table = lv_table_create(lv_scr_act(), NULL);lv_table_set_row_cnt(table, 4);lv_table_set_col_cnt(table, 2);lv_obj_align(table, NULL, LV_ALIGN_CENTER, 0, 0);/*Make the cells aligned */for (int i = 0; i < 4; i++) {for (int j = 0; j < 2; j++) {lv_table_set_cell_align(table, i, j, LV_LABEL_ALIGN_CENTER);}}/* Set the type of cells */lv_table_set_cell_type(table, 0, 0, 1);lv_table_set_cell_type(table, 0, 1, 1);/*Fill the first column*/lv_table_set_cell_value(table, 0, 0, "Name");lv_table_set_cell_value(table, 1, 0, "Apple");lv_table_set_cell_value(table, 2, 0, "Banana");lv_table_set_cell_value(table, 3, 0, "Citron");/*Fill the second column*/lv_table_set_cell_value(table, 0, 1, "Price");lv_table_set_cell_value(table, 1, 1, "$7");lv_table_set_cell_value(table, 2, 1, "$4");lv_table_set_cell_value(table, 3, 1, "$6");/* use lv_obj_get_ext_attr to get set data directly instead of use API func */lv_table_ext_t* ext = lv_obj_get_ext_attr(table);ext->row_h[0] = 20;
}

30. 页签(lv_tabview)

效果图

源码

void lv_tabview_demo(void) {/*Create a Tab view object*/lv_obj_t *tabview;tabview = lv_tabview_create(lv_scr_act(), NULL);/*Add 3 tabs (the tabs are page (lv_page) and can be scrolled*/lv_obj_t *tab1 = lv_tabview_add_tab(tabview, "Tab 1");lv_obj_t *tab2 = lv_tabview_add_tab(tabview, "Tab 2");lv_obj_t *tab3 = lv_tabview_add_tab(tabview, "Tab 3");/*Add content to the tabs*/lv_obj_t *label = lv_label_create(tab1, NULL);lv_label_set_text(label, "First tab");lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);label = lv_label_create(tab2, NULL);lv_label_set_text(label, "Second tab");lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);label = lv_label_create(tab3, NULL);lv_label_set_text(label, "Third tab");lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);
}

31. 文本框(lv_textarea)

特点:文本框一般跟按键矩阵或者键盘搭配使用

效果图1

源码1

static void ta_event_cb(lv_obj_t* ta, lv_event_t event);static lv_obj_t* kb;void lv_textarea_demo1(void) {/* Create the password box */lv_obj_t* pwd_ta = lv_textarea_create(lv_scr_act(), NULL);lv_textarea_set_text(pwd_ta, "");/* Set password mode */lv_textarea_set_pwd_mode(pwd_ta, true);/* Set oneline mode */lv_textarea_set_one_line(pwd_ta, true);/* Hide cursor */lv_textarea_set_cursor_hidden(pwd_ta, true);lv_obj_set_width(pwd_ta, LV_HOR_RES / 2 - 20);lv_obj_set_pos(pwd_ta, 5, 20);lv_obj_set_event_cb(pwd_ta, ta_event_cb);/* Create a label and put it above the text box */lv_obj_t* pwd_label = lv_label_create(lv_scr_act(), NULL);lv_label_set_text(pwd_label, "Password:");lv_obj_align(pwd_label, pwd_ta, LV_ALIGN_OUT_TOP_LEFT, 0, 0);/* Create the one-line mode text area */lv_obj_t* oneline_ta = lv_textarea_create(lv_scr_act(), pwd_ta);lv_textarea_set_pwd_mode(oneline_ta, false);lv_textarea_set_one_line(oneline_ta, true);lv_textarea_set_cursor_hidden(oneline_ta, true);lv_obj_align(oneline_ta, NULL, LV_ALIGN_IN_TOP_RIGHT, -5, 20);/* Create a label and put it above the text box */lv_obj_t* oneline_label = lv_label_create(lv_scr_act(), NULL);lv_label_set_text(oneline_label, "Text:");lv_obj_align(oneline_label, oneline_ta, LV_ALIGN_OUT_TOP_LEFT, 0, 0);/* Create a keyboard */kb = lv_keyboard_create(lv_scr_act(), NULL);lv_obj_set_size(kb, LV_HOR_RES, LV_VER_RES / 2);/* Connect kb and ta */lv_keyboard_set_textarea(kb, pwd_ta); /* Automatically show/hide cursors on text areas */lv_keyboard_set_cursor_manage(kb, true); 
}static void ta_event_cb(lv_obj_t* ta, lv_event_t event) {if (event == LV_EVENT_CLICKED) {/* Focus on the clicked text area */if (kb != NULL) lv_keyboard_set_textarea(kb, ta);}else if (event == LV_EVENT_INSERT) {const char* str = lv_event_get_data();if (str[0] == '\n') {printf("Ready\n");}}
}

效果图2

源码2

static void ta_event_cb(lv_obj_t* ta, lv_event_t event);static lv_obj_t* kb;/*** Automatically format text like a clock. E.g. "12:34"* Add the ':' automatically.*/
void lv_textarea_demo2(void) {/* Create the text area */lv_obj_t* ta = lv_textarea_create(lv_scr_act(), NULL);lv_obj_set_event_cb(ta, ta_event_cb);/* Set chars to be accepted */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, "");/* Create a custom map for the keyboard */static const char* kb_map[] = {"1", "2", "3", " ", "\n","4",
"5", "6", " ", "\n","7","8", "9", LV_SYMBOL_BACKSPACE,
"\n","0",LV_SYMBOL_LEFT,LV_SYMBOL_RIGHT,
" ", ""};/* Set control mode of btns in kb */static const lv_btnmatrix_ctrl_t kb_ctrl[] = {LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT,LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_HIDDEN,LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_NO_REPEAT,LV_BTNMATRIX_CTRL_NO_REPEAT, LV_BTNMATRIX_CTRL_HIDDEN,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_HIDDEN,};/* Create a keyboard */kb = lv_keyboard_create(lv_scr_act(), NULL);lv_obj_set_size(kb, LV_HOR_RES, LV_VER_RES / 2);lv_keyboard_set_mode(kb, LV_KEYBOARD_MODE_NUM);lv_keyboard_set_map(kb, LV_KEYBOARD_MODE_NUM, kb_map);lv_keyboard_set_ctrl_map(kb, LV_KEYBOARD_MODE_NUM, kb_ctrl);lv_keyboard_set_textarea(kb, ta);
}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[3] == ':') {lv_textarea_del_char(ta);} else 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, ':');}}
}

32. 平铺视图(lv_tileview)

效果图

源码

void lv_tileview_demo(void) {/* Create a tileview with three parts */static lv_point_t valid_pos[] = {{0, 0}, {0, 1}, {1, 1}};lv_obj_t* tileview;tileview = lv_tileview_create(lv_scr_act(), NULL);lv_tileview_set_valid_positions(tileview, valid_pos, 3);/* Add edge flash to show the edge directly */lv_tileview_set_edge_flash(tileview, true);lv_obj_t* tile1 = lv_obj_create(tileview, NULL);lv_obj_set_size(tile1, LV_HOR_RES, LV_VER_RES);lv_tileview_add_element(tileview, tile1);/* Tile1: just a label */lv_obj_t* label = lv_label_create(tile1, NULL);lv_label_set_text(label, "Scroll down");lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0);/* Tile2: a list */lv_obj_t* list = lv_list_create(tileview, NULL);lv_obj_set_size(list, LV_HOR_RES, LV_VER_RES);lv_obj_set_pos(list, 0, LV_VER_RES);lv_list_set_scroll_propagation(list, true);lv_list_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_OFF);lv_list_add_btn(list, NULL, "One");lv_list_add_btn(list, NULL, "Two");lv_list_add_btn(list, NULL, "Three");lv_list_add_btn(list, NULL, "Four");lv_list_add_btn(list, NULL, "Five");lv_list_add_btn(list, NULL, "Six");lv_list_add_btn(list, NULL, "Seven");lv_list_add_btn(list, NULL, "Eight");label = lv_label_create(tileview, NULL);lv_obj_align(label, list, LV_ALIGN_CENTER, -30, 120);lv_label_set_text(label, "Scroll Right");/* Tile3: a button */lv_obj_t* tile3 = lv_obj_create(tileview, tile1);lv_obj_set_pos(tile3, LV_HOR_RES, LV_VER_RES);lv_tileview_add_element(tileview, tile3);lv_obj_t* btn = lv_btn_create(tile3, NULL);lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 0, 0);lv_tileview_add_element(tileview, btn);label = lv_label_create(btn, NULL);lv_label_set_text(label, "No scroll up");
}

33. 窗口(lv_win)

效果图

源码

void lv_window_demo(void) {/* Create a window */lv_obj_t* win = lv_win_create(lv_scr_act(), NULL);/* Set the title */lv_win_set_title(win, "Title"); /* Add a close button */lv_obj_t* close_btn = lv_win_add_btn(win, LV_SYMBOL_CLOSE); lv_obj_set_event_cb(close_btn, lv_win_close_event_cb);/* Add a setup button */lv_win_add_btn(win, LV_SYMBOL_SETTINGS); /* Add some dummy content */lv_obj_t* txt = lv_label_create(win, NULL);lv_label_set_text(txt,"This is the content of the window\n\n""You can add control buttons to\n""the window header\n\n""The content area becomes\n""automatically scrollable is it's \n""large enough.\n\n"" You can scroll the content\n""See the scroll bar on the right!");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十课:Qt 字符编码和中文乱码相关问题

功能描述&#xff1a;最全的 Qt 字符编码相关知识以及中文乱码的原因与解决办法 一、字符编码种类 ASCII 码 美国人对信息交流的编码&#xff0c;包括 26 个字母&#xff08;大小写&#xff09;、数字和标点符号等&#xff0c;用一个字节&#xff08;8 位&#xff09;表示这些…

eNSP:VLAN-hybrid实验应用

实验要求&#xff1a; 拓扑图 配置 sw1: [sw1]vlan batch 2 to 6[sw1]int Ethernet 0/0/2 [sw1-Ethernet0/0/2]port link-type access [sw1-Ethernet0/0/2]port default vlan 2 [sw1-Ethernet0/0/2]int e 0/0/4 [sw1-Ethernet0/0/4]port link-ty access [sw1-Ethernet0/0/…

springBoot 配置文件 spring.mvc.throw-exception-if-no-handler-found 参数的作用

在Spring Boot应用中&#xff0c;可以通过配置文件来控制当找不到请求处理器&#xff08;handler&#xff09;时是否抛出异常。具体的配置参数是spring.mvc.throw-exception-if-no-handler-found。 默认情况下&#xff0c;该参数的值为false&#xff0c;即当找不到请求处理器时…

《Zookeeper》源码分析(十四)之 投票是如何发送与接收的

目录 MessengerWorkerSenderWorkerReceiver第5步&#xff1a;检验选票的epoch和version第6步&#xff1a;处理投票 Messenger Messenger管理接收到的消息以及待发送的消息&#xff0c;其源码如下&#xff1a; 它的源码比较简单&#xff0c;接下来着重介绍它维护的两个线程&a…

Docker 网络之 ipvlan 和 macvlan

Docker ipvlan 和 macvlan 引言 本文讲解了Docker 网络模式中的 ipvlan 和 macvlan 的区别,目前自己在生产环境中使用的 ipvlan 模式非常问题.也解决了实际业务问题. IPvlan L2 mode example ipvlan 无需网卡混杂模式 , 运行如下命令后可以生成一个 vlan 子接口 , 会和主网卡…

ElasticSearch的客户端操作

ElasticSearch的客户端操作 1、客户端介绍 官方文档地址&#xff1a; https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 实际开发中&#xff0c;有多种方式操作Elasticsearch&#xff1a; 客户端工具&#xff1a;发送http请求(RESTful风格)操作…

Azure Blob存储使用

创建存储账户,性能选择标准即可&#xff0c;冗余选择本地冗余存储即可 容器选择类别选择专用即可 可以上传文件到blob中 打开文件可以看到文件的访问路径 4.编辑中可以修改文件 复制链接&#xff0c;尝试访问&#xff0c;可以看到没有办法访问&#xff0c;因为创建容器的时候选…

spring(15) SpringBoot启动过程

目录 一、过程简介二、过程流程图三、源码分析1、运行 SpringApplication.run() 方法2、确定应用程序类型3、加载所有的初始化器4、加载所有的监听器5、设置程序运行的主类6、开启计时器7、将 java.awt.headless 设置为 true8、获取并启用监听器9、设置应用程序参数10、准备环境…

LeetCode450. 删除二叉搜索树中的节点

450. 删除二叉搜索树中的节点 文章目录 [450. 删除二叉搜索树中的节点](https://leetcode.cn/problems/delete-node-in-a-bst/)一、题目二、题解方法一&#xff1a;递归&#xff08;一种麻烦的方法&#xff09;方法二&#xff1a;优化后的递归 一、题目 给定一个二叉搜索树的根…

论文阅读——Imperceptible Adversarial Attack via Invertible Neural Networks

Imperceptible Adversarial Attack via Invertible Neural Networks 作者&#xff1a;Zihan Chen, Ziyue Wang, Junjie Huang*, Wentao Zhao, Xiao Liu, Dejian Guan 解决的问题&#xff1a;虽然视觉不可感知性是对抗性示例的理想特性&#xff0c;但传统的对抗性攻击仍然会产…

每天一道leetcode:1129. 颜色交替的最短路径(图论中等广度优先遍历)

今日份题目&#xff1a; 给定一个整数 n&#xff0c;即有向图中的节点数&#xff0c;其中节点标记为 0 到 n - 1。图中的每条边为红色或者蓝色&#xff0c;并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges&#xff0c;其中&#xff1a; redEdges[i] [ai, bi…

Dubbo Spring Boot Starter 开发微服务应用

环境要求 系统&#xff1a;Windows、Linux、MacOS JDK 8 及以上&#xff08;推荐使用 JDK17&#xff09; Git IntelliJ IDEA&#xff08;可选&#xff09; Docker &#xff08;可选&#xff09; 项目介绍 在本任务中&#xff0c;将分为 3 个子模块进行独立开发&#xff…

计算机组成与设计 Patterson Hennessy 笔记(一)MIPS 指令集

计算机的语言&#xff1a;汇编指令集 也就是指令集。本书主要介绍 MIPS 指令集。 汇编指令 算数运算&#xff1a; add a,b,c # abc sub a,b,c # ab-cMIPS 汇编的注释是 # 号。 由于MIPS中寄存器大小32位&#xff0c;是基本访问单位&#xff0c;因此也被称为一个字 word。M…

webpack中常见的Loader

目录 1.webpack中的loader是什么&#xff1f;配置方式 2. loader特性3.常见的loader 1.webpack中的loader是什么&#xff1f; loader 用于对模块的"源代码"进行转换&#xff0c;在 import 或"加载"模块时预处理文件 webpack做的事情&#xff0c;仅仅是分…

爬虫逆向实战(三)--天某云登录

一、数据接口分析 主页地址&#xff1a;天某云 1、抓包 通过抓包可以发现登录接口是account/login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过“载荷”模块可以发现password、comParam_signature、comParam_seqCode是加密的 请求头是否加密&#xff1f; 无…

cmake扩展(5)——file命令排除部分文件

在cmake中可以使用file命令获取需要的文件&#xff0c;并且支持正则/通配符&#xff0c;使用起来还是很方便的。 #语法file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])#example file(GLOB_RECURSE SOURCES "src/*.h" "src/*.cp…

HTTP与HTTPS的区别

面试常见问题&#xff0c;HTTPS优化总结易记版&#xff1a; 1、HSTS重定向技术&#xff1a;将http自动转换为https&#xff0c;减少301重定向 2、TLS握手优化&#xff1a;在TLS握手完成前客户端就提前向服务器发送数据 3、会话标识符&#xff1a;服务器记录下与某客户端的会…

Mac鼠标增强工具Smooze Pro

Smooze Pro是一款Mac上的鼠标手势增强工具&#xff0c;可以让用户使用鼠标手势来控制应用程序和系统功能。 它支持多种手势操作&#xff0c;包括单指、双指、三指和四指手势&#xff0c;并且可以自定义每种手势的功能。例如&#xff0c;您可以使用单指向下滑动手势来启动Expos视…

Linux 僵死进程

fork复制进程之后&#xff0c;会产生一个进程叫做子进程&#xff0c;被复制的进程就是父进程。不管父进程先结束&#xff0c;还是子进程先结束&#xff0c;对另外一个进程完全没有影响&#xff0c;父进程和子进程是两个不同的进程。 一、孤儿进程 现在有以下代码&#xff1a;…

前端基础(JavaScript语法)

前言&#xff1a;今天学习JavaScript的基本语法&#xff0c;包括变量、函数、对象、数组。 目录 JavaScript 变量 函数 对象 数组 JavaScript 变量 定义变量 判断语句 判断等于&#xff1a; 判断不等于&#xff1a;! if else语句 if(vavb){ console.log("…