【LVGL学习笔记】(三)控件使用

这篇具有很好参考价值的文章主要介绍了【LVGL学习笔记】(三)控件使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,实现高效的项目开发。
【LVGL学习笔记】(三)控件使用
LVGL中文教程手册:极客笔记之LVGL教程

1. 弧(lv_arc)

特点

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

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

特点

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

效果图
【LVGL学习笔记】(三)控件使用
源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

/**
 * @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)

特点:

  1. 设置按键宽度设置的是与同行按钮的相对宽度比,不是绝对宽度

效果图
【LVGL学习笔记】(三)控件使用
源码

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)

特点:

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

效果图
【LVGL学习笔记】(三)控件使用
源码

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 be
                                                    saved 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)

特点:

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

效果图
【LVGL学习笔记】(三)控件使用

源码

#define CANVAS_WIDTH 200
#define CANVAS_HEIGHT 150

void 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_t
      cbuf[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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

特点:

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

效果图
【LVGL学习笔记】(三)控件使用

源码

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卡上的文件
  • 符号 文字
  1. 官方提供了在线网站进行图像的处理,LVGL在线图像处理

效果图
【LVGL学习笔记】(三)控件使用
源码

#define SLIDER_WIDTH 20
#define SLIDER_HEIGHT 200

static 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)

效果图
【LVGL学习笔记】(三)控件使用
【LVGL学习笔记】(三)控件使用
源码

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)

效果图
【LVGL学习笔记】(三)控件使用
源码

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)

效果图
【LVGL学习笔记】(三)控件使用
源码

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

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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. 列表需要为全局或者静态变量,才可以使用滚动动画的功能

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

特点:

  1. btn_map数量只可为0-2

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

特点:

  1. 蒙版的OPA 0代表完全覆盖,255代表全透明
  2. 蒙版需作用在对象上

效果图1
【LVGL学习笔记】(三)控件使用
源码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
【LVGL学习笔记】(三)控件使用

源码2

#define MASK_WIDTH 100
#define MASK_HEIGHT 50

void 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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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 char
        buf[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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用
源码

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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

特点:

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

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用
源码

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
【LVGL学习笔记】(三)控件使用

源码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
【LVGL学习笔记】(三)控件使用

源码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)

效果图
【LVGL学习笔记】(三)控件使用

源码

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)

效果图
【LVGL学习笔记】(三)控件使用
源码文章来源地址https://www.toymoban.com/news/detail-438215.html

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

到了这里,关于【LVGL学习笔记】(三)控件使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LINUX LVGL 使用键盘方向键选择控件

    1.1: 比如屏幕上有按钮 button1 和button2 通过创建一个组 group 就可以实现选中按键1或者按键2 新建一个组,放入按键的代码,我是写在ui.c 里面创建组件的地方那儿 1.2: 打开宏定义支持键盘功能 1.3: 新建一个输入设备,注册读取键盘的回调函数, 在main.c的 hal_init 函数里面修改 1.4

    2024年02月15日
    浏览(25)
  • 【Qt 学习笔记】Qt常用控件 | 输入类控件 | Text Edit的使用及说明

    博客主页:Duck Bro 博客主页 系列专栏:Qt 专栏 关注博主,后期持续更新系列文章 如果有错误感谢请大家批评指出,及时修改 感谢大家点赞👍收藏⭐评论✍ 文章编号:Qt 学习笔记 / 29 1. 简介 QTextEdit是Qt中的一个可编辑的文本框控件,可以用于显示和编辑多行文本。 它是基于

    2024年04月28日
    浏览(35)
  • LVGL8.2学习笔记

    笔记主要记录LVGL控件基本的编程使用和相关的程序,并且在程序中对使用到的API函数进行简要注解(有些是个人的理解),以便后续根据实际项目所需直接套用对应的控件代码修改使用;本文主要参考的是正点原子的LVGL相关教程。 LVGL控件的基础知识 (1) C语言编写的LVGL以结

    2024年02月16日
    浏览(31)
  • 【LVGL学习笔记】(二) 基础概念

    LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,实现高效的项目开发。 LVGL中文教程手册:百问网LVGL中文教程手册文档 以下的内容均是以VS环境下的LVGL模拟器

    2024年02月01日
    浏览(32)
  • 【LVGL】学习笔记--(1)Keil中嵌入式系统移植LVGL

    最近emwin用的比较烦躁,同时被LVGL酷炫的界面吸引到了,所以准备换用LVGL试试水。 LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。 丰富且强大的模块化图形组件:按钮 (b

    2024年02月02日
    浏览(47)
  • LVGL学习笔记 30 - List(列表)

    目录 1. 添加文本 2. 添加按钮 3. 事件 4. 修改样式 4.1 背景色 4.2 改变项的颜色 列表是一个垂直布局的矩形,可以向其中添加按钮和文本。 部件包含: LV_PART_MAIN - 主要的属性,大部分是这个部件。 LV_PART_SCROLLBAR - 滚动条的属性。 添加一行文本,当字符串长度超过显示时,会自

    2024年02月13日
    浏览(28)
  • LVGL学习笔记 28 - 键盘keyboard

    目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事件 键盘是一个特殊的按键矩阵,自身实现了按键(map)映射和其他

    2024年02月13日
    浏览(30)
  • 学习笔记ESP32——lvgl disp移植(1)

    目录 一、简介 二、GitHub上下载lvgl库         1、下载lvgl库 三、准备一个工程  四、修改工程  五、对disp进行修改 ​编辑 六、主函数的修改 七、硬件的修改 八、MUSIC示例演示 一、简介         以esp32 idf导出的hello world例程,移植lvgl disp和indev驱动的学习笔记。 二、Gi

    2024年01月16日
    浏览(28)
  • LVGL学习笔记11 - 按钮矩阵Button Matrix

    目录 1. 构造矩阵 2. Parts 2.1 LV_PART_MAIN 2.2 LV_PART_ITEMS 3. 样式 3.1 按钮大小 3.2 间距 3.3 控制按钮 3.4 控制map  3.5 Check唯一性  4. 事件 4.1 LV_EVENT_VALUE_CHANGED 4.2 LV_EVENT_LONG_PRESSED 4.3 LV_EVENT_DRAW_PART_BEGIN 按钮矩阵是多个按钮的组合,例如直接绘制一个九宫格按键。按钮矩阵的按钮是实

    2023年04月09日
    浏览(27)
  • LVGL学习笔记(二):从0到1移植LVGL8.1到STM32平台上(完结篇)

    目录 一:TFT-LCD屏触摸 二:STM32CubeMX配置 三:FT5206触摸芯片驱动代码移植 四:LVGL 移植 4.1 源码下载 4.2 代码移植  4.3 添加源码至工程 4.4 指定头文件路径 4.5 设置编译参数  4.6 修改LVGL源文件   4.7 修改显示驱动接口    4.8 修改输入设备驱动接口  五:下载验证  六:工

    2024年02月03日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包