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

news2024/11/17 10:54:34

LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,实现高效的项目开发。
在这里插入图片描述
LVGL中文教程手册:极客笔记之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)

特点

  1. 改变数值时,参数选择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)

特点:

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

效果图
在这里插入图片描述
源码

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. 设置高亮日期的时候,存储日期的变量需要为全局变量或者静态变量,因为该控件的显示只存储变量指针。

效果图
在这里插入图片描述
源码

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度

效果图
在这里插入图片描述

源码

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

效果图
在这里插入图片描述

源码

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)

特点:

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

效果图
在这里插入图片描述

源码

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在线图像处理

效果图
在这里插入图片描述
源码

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

效果图
在这里插入图片描述
在这里插入图片描述
源码

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)

特点:

  1. 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)

特点:

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

效果图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 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)

效果图
在这里插入图片描述

源码

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

效果图
在这里插入图片描述

源码

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)

特点:

  1. 表格的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
在这里插入图片描述

源码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.coloradmin.cn/o/97971.html

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

相关文章

汇编条件转移指令

目录 条件转移指令&#xff08;基本格式&#xff09; 简单条件转移指令 区分带符号数和无符号数 无符号数条件转移指令 比较内存中两个无符号数的大小&#xff0c;显示器输出小的数 内存中三个无符号数&#xff0c;输出最小的 符号数的条件转移指令 内存中有三个字节型带…

[附源码]Python计算机毕业设计冠军体育用品购物网站Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

uni-app卖座电影多端开发纪实(一):创建项目

@关于uni-app 今日之C端主要都是跑在手机而非PC上了,其形态也以小程序、App、手机H5页面为主了;大前端之C端 作品拿粗给人看,也十之八九要掏手机了;好在我们有 宇宙制霸人间值得流芳千古不可一世之我是大天才——uni-app!基于Vue+uni-app做开发,一套代码多端打包,老板省钱…

[LeetCode周赛复盘] 第 324 场周赛20221218

[LeetCode周赛复盘] 第 324 场周赛20221218 一、本周周赛总结二、 [Easy] 6265. 统计相似字符串对的数目1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6266. 使用质因数之和替换后可以取到的最小值1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6267. 添加边使所有节点度数…

区块链北大肖老师学习笔记3

第四节:比特币的共识协议 数字货币和纸质货币区别是可以复制&#xff0c;叫作双花攻击 即double spending attack。 去中心化货币要解决两个问题:①数字货币的发行②怎么验证交易的有效性&#xff0c;防止double spending attack。 答案:①比特币的发行是由挖矿决定的 ②…

适合编程初学者的开源博客系统(Vue3+Vant版)

目标 为编程初学者打造入门学习项目&#xff0c;使用各种主流编程语言来实现。让想学编程的&#xff0c;一个都不落下。 上述基本涵盖了当前编程开发所有主流语言。 左侧为前端版本&#xff1a;安卓、iOS、鸿蒙、Flutter、Vue、uni-app、微信小程序。 右侧为服务器端版本&am…

HC-SR501人体感应模块介绍

HC-SR501人体感应模块简介 HC-SR501是基于红外线技术的自动控制模块&#xff0c;采用德国原装进口 LHI778 探头设计&#xff0c;灵敏度高&#xff0c;可靠性强&#xff0c;超低电压工作模式&#xff0c;广泛应用于各类自动感应电器设备&#xff0c;尤其是干电池供电的自动控制产…

【算法】九月算法打卡

2022-09-01 外观数列 后一项是前一项的描述 获取第 n项数列&#xff0c;需要获取第n-1项数列。由此得出要采用递归回溯的形式 /*** param {number} n* return {string}*/ var countAndSay function(n) {if(n 1) return "1";// 上一串字符串let prevSeq countAn…

为什么卷积神经网络对图像的处理有很好的效果

1、前馈神经网络、BP神经网络、卷积神经网络的区别与联系 一、计算方法不同 1、前馈神经网络&#xff1a;一种最简单的神经网络&#xff0c;各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出&#xff0c;并输出给下一层&#xff0e;各层间没有反馈。 …

【Python机器学习】模型聚类高斯混合模型GMM讲解及实战演示(附源码 超详细)

需要源码和数据集请点赞关注收藏后评论留言私信~~~ 模型聚类 模型&#xff08;Model&#xff09;聚类假定每个簇符合一个分布模型&#xff0c;通过找到这个分布模型&#xff0c;就可以对样本点进行分簇。 在机器学习领域&#xff0c;这种先假定模型符合某种概率分布&#xff…

安装Elasticsearch

文章目录部署单点es部署kibanaDevTools安装IK分词器在线安装ik插件&#xff08;较慢&#xff09;离线安装ik插件&#xff08;推荐&#xff09;将 ik 目录 上传到es容器的插件数据卷中重启容器异常测试扩展词 词典部署es集群链接&#xff1a;https://pan.baidu.com/s/1HRHLxmVDf…

12.17

1. Promise 构造函数: Promise (excutor) {} (1) executor 函数: 执行器 (resolve, reject) > {} (2) resolve 函数: 内部定义成功时我们调用的函数 value > {} (3) reject 函数: 内部定义失败时我们调用的函数 reason > {} 说明: executor 会在 Promise 内部立即同…

日期-日历-选择器实现(图文并茂)

文章目录日历模板效果图展示功能点介绍完整代码&#xff08;cv即可&#xff09;index.wxmlindex.wxssindex.js日期时间选择器效果图展示1、使用小程序原生的picker①普通选择器&#xff1a;mode selector②多列选择器&#xff1a;mode multiSelector③时间选择器&#xff1a;…

一起Talk Android吧(第四百四十五回:UI控件之TimePicker)

文章目录概念介绍使用方法内容总结各位看官们大家好&#xff0c;上一回中咱们说的例子是"UI控件之DatePicker",这一回中说的例子是"UI控件之TimePicker"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01; 概念介绍 看官们…

字体包体积压缩实践

这篇博客针对axios库的核心代码做一个简要总结 一、关键步骤 1.创建axios对象 axios库导出的对象是一个已经被创建好的axios对象&#xff0c;它本质上是一个方法&#xff0c;可以直接接收一个config配置参数进行请求。在库的入口处&#xff0c;即可看到如下代码&#xff1a;…

非零基础自学Golang 第11章 文件操作 11.1 目录基本操作 11.1.2 创建目录 11.1.3 删除目录

非零基础自学Golang 文章目录非零基础自学Golang第11章 文件操作11.1 目录基本操作11.1.2 创建目录11.1.3 删除目录第11章 文件操作 11.1 目录基本操作 11.1.2 创建目录 Go标准库中的os库提供了平台无关性的操作系统功能接口。 创建目录时可以使用os库的如下接口&#xff1…

基于JSP的网络考试系统/在线考试系统的设计与实现

摘 要 网络考试系统是由高校的一个网络考试&#xff0c;按照章程自主开展网络考试系统。网络考试是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高学生综合素质、引导学生适应社会、促进学生成才就业等方面发挥着重要作用&#xff0c;是新形势下有效凝…

[hadoop全分布部署]安装Hadoop、验证Hadoop①

&#x1f468;‍&#x1f393;&#x1f468;‍&#x1f393;博主&#xff1a;发量不足 个人简介&#xff1a;耐心&#xff0c;自信来源于你强大的思想和知识基础&#xff01;&#xff01; &#x1f4d1;&#x1f4d1;本期更新内容&#xff1a;安装Hadoop、验证Hadoop①&#…

【免杀前置课——Windows编程】十九、内存管理—堆,Windows如何管理内存数据?堆内存相关API

内存管理内存管理—堆Windows是如何管理内存数据的?堆内存管理相关API内存管理—堆 每个进程都有自己独立的4G内存空间&#xff0c;高2G操作系统内核使用&#xff0c;低 2G用户使用。 每个进程中我们使用的都是虚拟地址&#xff0c;虚拟机地址到物理地址的转换由操作系统内核…

1. 找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;haystack &qu…