【LVGL】学习笔记

一.前言

GUI Guider作为一个免费的LVGL图形化设计软件,已经在开发中得到广泛应用。然而,GUI Guider在控件功能的设计方面并不全面。基于此,笔者结合正点原子和百问网的LVGL教程,进行补充,从而实现以GUI Guider为主,自己写代码为辅的GUI设计过程。

二.控件篇

复选框部件(lv_checkbox)

1.设置复选框文本

GUI Guider只能动态设置文本

lv_checkbox_set_text(ui->screen_1_cb_1, "checkbox");

实际上,在LVGL中,还支持静态设置文本

lv_checkbox_set_text_static(cb2, "Checkbox2");

二者区别看函数定义便知

void lv_checkbox_set_text(lv_obj_t * obj, const char * txt)
{
    ...
    strcpy(cb->txt, txt);
    ...
}
void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt)
{
    ...
    cb->txt = (char *)txt;
    ...
}

2.设置复选框状态

LVGL添加、清除状态API

void lv_obj_add_state(lv_obj_t * obj, lv_state_t state);
void lv_obj_clear_state(lv_obj_t * obj, lv_state_t state);

与复选框相关的状态枚举

enum {
    LV_STATE_CHECKED     =  0x0001,
    LV_STATE_DISABLED    =  0x0080,
};

两者组合就可以实现复选框默认复选、禁止复选的状态

3.获取复选框状态

LVGL获取状态API

bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state);

下拉列表部件(lv_dropdown)

1.添加选项

/*函数原型*/
void lv_dropdown_set_options(lv_obj_t * obj, const char * options);
void lv_dropdown_add_option(lv_obj_t * obj, const char * option, uint32_t pos);
void lv_dropdown_set_options_static(lv_obj_t * obj, const char * options);

 方式1

/*动态分配内存,添加a,b,c,c四个选项,选项经过复制后保存*/
lv_dropdown_set_options(lv_ddlist1, "a\nb\nc\nd");
/*添加选项及其下标*/
lv_dropdown_add_option(lv_ddlist1, "e", 0);

效果:选项e插到了第一个,而不是覆盖a

方式2 

/*静态分配内存,直接使用选项字符串的地址,因此在整个选项存在的声明周期内,不能改变选项字符串的内容*/
lv_dropdown_set_options_static(lv_ddlist2, "a\nb\nc\nd");

效果

 2.设置默认显示的选项、获取当前选项

/*sel_opt为选项索引,第一个为0,第二个为1*/
void lv_dropdown_set_selected(lv_obj_t * obj, uint16_t sel_opt)
/*获取当前选项的索引、内容*/
uint16_t lv_dropdown_get_selected(const lv_obj_t * obj);
void lv_dropdown_get_selected_str(const lv_obj_t * obj, char * buf, uint32_t buf_size);

3.设置列表展开方向以及下拉列表图标

默认

设置左侧展开和下拉图标朝左

lv_dropdown_set_dir(lv_ddlist1, LV_DIR_LEFT);
lv_dropdown_set_symbol(lv_ddlist1, LV_SYMBOL_LEFT);

效果

4.设置固定常显文本(该文本可以不是选项,文本不会因为选项的改变而改变)

lv_dropdown_set_text(lv_ddlist1, "Options");

效果

 标签部件(lv_label)

1.文本设置

/*text字符串中插入'\n'可以实现换行效果*/
void lv_label_set_text(lv_obj_t * obj, const char * text);
void lv_label_set_text_fmt(lv_obj_t * obj, const char * fmt, ...);//此函数不能设置'%f','%lf'的数据,除非先用sprintf再用上面那个函数
void lv_label_set_text_static(lv_obj_t * obj, const char * text);

2.重新着色

lv_label_set_text_fmt(lv_label2, "#0000ff Demo# #ff0000 %d#", 16);
lv_label_set_recolor(lv_label2, true);

3.文本长模式

(1)默认情况下

/*宽高根据文本内容自适应,长文本模式为包裹(WRAP)模式*/
lv_label_set_long_mode(lv_label2, LV_LABEL_LONG_WRAP);
lv_obj_set_size(lv_label2, LV_SIZE_CONTENT, LV_SIZE_CONTENT);

效果

(2)LV_LABEL_LONG_DOT

lv_label_set_long_mode(lv_label2, LV_LABEL_LONG_DOT);
lv_obj_set_size(lv_label2, 200, LV_SIZE_CONTENT);

效果(多余部分显示3个点)

(3)LV_LABEL_LONG_SCROLL

lv_label_set_long_mode(lv_label2, LV_LABEL_LONG_SCROLL);
lv_obj_set_size(lv_label2, 200, LV_SIZE_CONTENT);

效果(左右来回滚动,一个方向滚到头后换另一个方向滚)

(4)LV_LABEL_LONG_SCROLL_CIRCULAR

lv_label_set_long_mode(lv_label2, LV_LABEL_LONG_SCROLL_CIRCULAR);
lv_obj_set_size(lv_label2, 200, LV_SIZE_CONTENT);

效果(循环滚动,总是朝一个方向滚动)

(5)LV_LABEL_LONG_CLIP

lv_label_set_long_mode(lv_label2, LV_LABEL_LONG_CLIP);
lv_obj_set_size(lv_label2, 200, LV_SIZE_CONTENT);

效果(根据设定宽度裁剪,多余部分不显示)

4.设置选择开始、结束索引

void lv_label_set_text_sel_start(lv_obj_t * obj, uint32_t index);
void lv_label_set_text_sel_end(lv_obj_t * obj, uint32_t index);

例如

lv_label_set_text_fmt(lv_label2, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
lv_label_set_text_sel_start(lv_label2, 5);
lv_label_set_text_sel_end(lv_label2, 10);

此时直接显示lv_label2,仍然显示的是全部文本,因为以上两个函数仅用于内部跟踪选定文本的范围,而不会直接影响文本的显示。

此时获取文本内容,再将获取的内容进行显示,才会有截取的效果

// 获取选定的文本
  const char *full_text = lv_label_get_text(lv_label2);
  uint32_t sel_start = lv_label_get_text_selection_start(lv_label2);
  uint32_t sel_end = lv_label_get_text_selection_end(lv_label2);

  // 截取选定的文本
  size_t len = sel_end - sel_start;
  char selected_text[len + 1];
  strncpy(selected_text, &full_text[sel_start], len);
  selected_text[len] = '\0'; // 确保字符串以 null 结尾

  // 设置选定的文本
  lv_label_set_text(lv_label2, selected_text);

效果

5.API

线条部件(lv_line)

坐标系

从上到下增大为y正方向

从左到右增大为x正方向

1.设置连接点并绘制

  static lv_point_t line_points[480];
  for (int i = 0 ; i < 480 ; i++)
  {
    line_points[i].x = i;
    line_points[i].y = 160 + 160 * sin(i * 2 * 3.1415926 / 480);
  }
  lv_line_set_points(line1, line_points, 480);
  lv_obj_set_size(line1,LV_SIZE_CONTENT, LV_SIZE_CONTENT);
  lv_obj_center(line1);

效果

 2.倒Y操作

lv_line_set_y_invert(line1, true);

效果

3.API

 滚轮部件(lv_roller)

1.添加选项

/*换行符用以分隔选项*/
static const char *roller_map = "a\nb\nc\nd\n";
lv_roller_set_options(roller, roller_map, LV_ROLLER_MODE_INFINITE);
/*LV_ROLLER_MODE_INFINITE,循环模式,拉到最后一个会循环显示第一个*/
/*LV_ROLLER_MODE_NORMAL,正常模式,拉到最后一个就到底了*/

2.设置可见选项数量(一次最多显示row_cnt个选项)

void lv_roller_set_visible_row_count(lv_obj_t * obj, uint8_t row_cnt);

3.API

滑块部件(lv_slider)

1.设置范围和当前值

static inline void lv_slider_set_range(lv_obj_t * obj, int32_t min, int32_t max);
static inline void lv_slider_set_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim);

2.设置滑块模式

static inline void lv_slider_set_mode(lv_obj_t * obj, lv_slider_mode_t mode)

LV_SLIDER_MODE_RANGE:从设定绘制值开始绘制到当前值

LV_SLIDER_MODE_SYMMETRICAL:从0值开始绘制到当前值

LV_SLIDER_MODE_NORMAL:从滑块的最左侧绘制到当前值

3.设定绘制值

void lv_bar_set_start_value(lv_obj_t * obj, int32_t value, lv_anim_enable_t anim);

4.设置只能通过滑杆改变值(而不能通过单击滑杆部位改变值)

lv_obj_clear_flag(slider1, LV_OBJ_FLAG_ADV_HITTEST);

5.API

开关部件(lv_switch)

1.获取开关部件状态

/*state为LV_STATE_CHECKED
  返回true为开启,否则为关闭*/
bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state)

 表格部件(lv_table)

1.设置行数、列数

void lv_table_set_col_cnt(lv_obj_t * obj, uint16_t col_cnt);
void lv_table_set_row_cnt(lv_obj_t * obj, uint16_t row_cnt);

2.设置表格内容

void lv_table_set_cell_value(lv_obj_t * obj, uint16_t row, uint16_t col, const char * txt);
void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, const char * fmt, ...);//此函数不能设置'%f','%lf'的数据,除非先用sprintf再用上面那个函数

3.设置、获取用户数据(用户数据不会显式在表格上)

void lv_table_set_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col, void * user_data);
void * lv_table_get_cell_user_data(lv_obj_t * obj, uint16_t row, uint16_t col);

例如

typedef struct{
  int id;
  double value;
}UserData;  
UserData *data = (UserData *)malloc(sizeof(UserData));
data->id = 567;
data->value = 3.14;
lv_table_set_cell_user_data(table, 0, 0, data);
UserData  *getdata = (UserData *)lv_table_get_cell_user_data(table, 0, 0);
lv_obj_t *label1 = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(label1, "User Data id : %d", getdata->id);
lv_obj_set_pos(label1, 0, 0);
lv_obj_t *label2 = lv_label_create(lv_scr_act());
char s[105];
sprintf(s, "User Data value : %.2lf", getdata->value);
lv_label_set_text(label2, s);
lv_obj_set_pos(label2, 150, 0);

效果

4.向右合并单元格(一次只能合并当前列和右边第一列,可以链式向右合并,但不能垂直合并)

例如,合并第一行第一列和第二列

lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);

若要合并第一行所有列,则链式合并

lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_add_cell_ctrl(table, 0, 1, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_add_cell_ctrl(table, 0, 2, LV_TABLE_CELL_CTRL_MERGE_RIGHT);

效果

5.API

文本区域部件(lv_textarea)

1.添加字符和文本

void lv_textarea_add_char(lv_obj_t * obj, uint32_t c);
void lv_textarea_add_text(lv_obj_t * obj, const char * txt);

2.删除字符

void lv_textarea_del_char(lv_obj_t * obj);//删除光标左侧的字符,相当于backspace
void lv_textarea_del_char_forward(lv_obj_t * obj);//删除光标右侧的字符,相当于delete

3.设置占位符文本(仅在无输入内容下显示,起到提示的作用)

void lv_textarea_set_placeholder_text(lv_obj_t * obj, const char * txt);

 4.移动、设置光标

void lv_textarea_set_cursor_pos(lv_obj_t * obj, int32_t pos);//pos为0时,光标在第一个字符前面
void lv_textarea_cursor_right(lv_obj_t * obj);
void lv_textarea_cursor_left(lv_obj_t * obj);
void lv_textarea_cursor_down(lv_obj_t * obj);
void lv_textarea_cursor_up(lv_obj_t * obj);

5.文本区域的单行模式与密码模式

void lv_textarea_set_one_line(lv_obj_t * obj, bool en)//en为true时单行显示
void lv_textarea_set_password_mode(lv_obj_t * obj, bool en);//en为true时为密码模式,输入字符转化为'.'
void lv_textarea_set_password_show_time(lv_obj_t * obj, uint16_t time);//设置输入字符转化为'.'的时间,单位为ms

6.限制输入的字符类型以及总文本长度

void lv_textarea_set_accepted_chars(lv_obj_t * obj, const char * list);
void lv_textarea_set_max_length(lv_obj_t * obj, uint32_t num);

7.API

色环部件(lv_colorwheel)

1.创建色环

/*第二个参数用来决定knob的颜色是否与当前色环所选择的颜色一致。true则二者一致*/
lv_obj_t * lv_colorwheel_create(lv_obj_t * parent, bool knob_recolor);

 2.设置色环的模式

/*
mode的宏有:
LV_COLORWHEEL_MODE_HUE:色相,即所有颜色
LV_COLORWHEEL_MODE_SATURATION:饱和度,白色到设置颜色的变化
LV_COLORWHEEL_MODE_VALUE:数值,黑色到设置颜色的变化
*/
void lv_colorwheel_set_mode(lv_obj_t * obj, lv_colorwheel_mode_t mode);
/*设置特定颜色的函数*/
bool lv_colorwheel_set_rgb(lv_obj_t * obj, lv_color_t color);

例如

  lv_obj_t *colorwheel = lv_colorwheel_create(lv_scr_act(), true);
  lv_obj_set_size(colorwheel, 100, 100);
  lv_obj_center(colorwheel);
  lv_obj_update_layout(colorwheel);
  lv_colorwheel_set_mode(colorwheel, LV_COLORWHEEL_MODE_HUE);

  lv_obj_t *colorwheel1 = lv_colorwheel_create(lv_scr_act(), true);
  lv_obj_set_size(colorwheel1, 100, 100);
  lv_obj_align(colorwheel1, LV_ALIGN_CENTER, -150, 0);
  lv_obj_update_layout(colorwheel1);
  lv_colorwheel_set_mode(colorwheel1, LV_COLORWHEEL_MODE_SATURATION);

  lv_obj_t *colorwheel2 = lv_colorwheel_create(lv_scr_act(), true);
  lv_obj_set_size(colorwheel2, 100, 100);
  lv_obj_align(colorwheel2, LV_ALIGN_CENTER, 150, 0);
  lv_obj_update_layout(colorwheel2);
  lv_colorwheel_set_rgb(colorwheel2, lv_color_make(0, 255, 0));
  lv_colorwheel_set_mode(colorwheel2, LV_COLORWHEEL_MODE_VALUE);

效果

3.API

 

图片按钮部件(lv_imgbtn)

1.四种状态解析

LVGL图片按钮共有四种状态,分别是:释放,按下,选中释放,选中按下。四者的关系是

 如果释放与选中按下,按下与选中释放各选择同一张图片,则可以实现按钮状态切换的功能,如下图所示:

2.设置图片来源 

/*其中src_left与src_right设置为NULL,第二个参数用于设置显示改图片时控件的状态*/
void lv_imgbtn_set_src(lv_obj_t * obj, lv_imgbtn_state_t state, const void * src_left, 
const void * src_mid, const void * src_right);

3.API

键盘部件(lv_keyboard) 

1.设置键盘模式

/*默认情况下,可以自由切换键盘模式,但是如果指定特定键盘模式,那么就无法切换*/
void lv_keyboard_set_mode(lv_obj_t * obj, lv_keyboard_mode_t mode);

2.关联键盘与文本区域

void lv_keyboard_set_textarea(lv_obj_t * obj, lv_obj_t * ta);

3.按键弹窗设置

void lv_keyboard_set_popovers(lv_obj_t * obj, bool en);

效果

4.自定义键盘布局

lv_keyboard_set_mode(keyboard, LV_KEYBOARD_MODE_USER_1);
  const char *kb_map[] = {
      "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "\n",
      "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "\n",
      "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "\n",
      "u", "v", "w", "x", "y", "z", ""
      };

  // 定义按钮控制信息
  const lv_btnmatrix_ctrl_t kb_ctrl_map[] = {
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
      LV_BTNMATRIX_CTRL_RECOLOR, // 第一行
  };
  lv_keyboard_set_map(keyboard, LV_KEYBOARD_MODE_USER_1, kb_map, kb_ctrl_map);

 kb_map:用于自定义键盘布局,'\n'换行,详见按钮组布局方法

kb_ctrl_map:用于控制按键。此处使用LV_BTNMATRIX_CTRL_RECOLOR效果较好。注意,这里不能在定义键盘名称时附加颜色,例如'#ff0000 a#',虽然这样可以起到重新着色的效果,但是实际键盘输入是'#ff0000 a#',如下图

5.API

 LED部件(lv_led) 

1.API

示例

lv_obj_t *led = lv_led_create(lv_scr_act());
  lv_led_set_color(led, lv_color_make(255, 0, 0));
  lv_obj_align(led, LV_ALIGN_CENTER, 0, 0);
  lv_led_set_brightness(led, 100);
  lv_led_on(led);
  lv_obj_t *led1 = lv_led_create(lv_scr_act());
  lv_led_set_color(led1, lv_color_make(255, 0, 0));
  lv_obj_align(led1, LV_ALIGN_CENTER, -50, 0);
  lv_led_set_brightness(led1, 100);
  lv_led_off(led1);

效果

列表(lv_list) 

1.添加按钮

/*第2、3个参数可选,不使用则用NULL*/
lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * icon, const char * txt)

2.添加列表文本

lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt);

3.为每个按钮添加回调

btn = lv_list_add_btn(list, LV_SYMBOL_FILE, "New");
lv_obj_add_event_cb(btn, lv_list_New_btn_callback, LV_EVENT_CLICKED, NULL);

示例

  lv_obj_t *list = lv_list_create(lv_scr_act());
  lv_obj_set_width(list, 200);
  lv_obj_set_height(list, 150);
  lv_obj_center(list);
  lv_obj_t *btn;
  lv_list_add_text(list, LV_SYMBOL_DRIVE"File");
  btn = lv_list_add_btn(list, LV_SYMBOL_FILE, "New");
  lv_obj_add_event_cb(btn, lv_list_New_btn_callback, LV_EVENT_CLICKED, NULL);
  lv_list_add_text(list, "Operation");
  btn = lv_list_add_btn(list, LV_SYMBOL_AUDIO, "Music");
  lv_obj_add_event_cb(btn, lv_list_Music_btn_callback, LV_EVENT_CLICKED, NULL);

效果

4.API

 消息框部件(lv_msgbox)

 1.消息框部件的组成

2.创建消息框组件

/*第一个参数设置为NULL,则在显示以后,在关闭消息框之前,不能再点击其他部件;否则就设置为其他父部件*/
lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char * txt, const char * btn_txts[],bool add_close_btn)

 示例

static const char *btns[] = {"OK", ""};
msgbox = lv_msgbox_create(lv_scr_act(), LV_SYMBOL_WARNING"Notice", "Excessive volume may damage hearing.", btns, true);

效果

3.综合示例

lv_obj_t *label, *msgbox, *slider;
static void lv_slider_cb(lv_event_t *e)
{
  static uint8_t Lower80 = 1;
  lv_obj_t *slider = lv_event_get_current_target(e);
  uint16_t SliderValue = lv_slider_get_value(slider);
  lv_label_set_text_fmt(label, "Volumn : %d", SliderValue);
  if (SliderValue > 80 && Lower80)
  {
    Lower80 = 0;
    lv_obj_clear_flag(msgbox, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_state(slider, LV_STATE_DISABLED);
    // lv_obj_add_flag(slider, LV_OBJ_FLAG_EVENT_BUBBLE);
  }
  else if (SliderValue < 80)
    Lower80 = 1;
}
static void lv_msgbox_btn_callback(lv_event_t *e)
{
  lv_obj_t *TarMsgbox = lv_event_get_current_target(e);
  if (lv_msgbox_get_active_btn(TarMsgbox) == 0)
  {
    lv_obj_add_flag(TarMsgbox, LV_OBJ_FLAG_HIDDEN);
    lv_obj_clear_state(slider, LV_STATE_DISABLED);
    // lv_obj_clear_flag(slider, LV_OBJ_FLAG_EVENT_BUBBLE);
  }
}
  slider = lv_slider_create(lv_scr_act());
  lv_slider_set_mode(slider, LV_SLIDER_MODE_NORMAL);
  lv_slider_set_range(slider, 0, 100);
  lv_obj_set_size(slider, 500, 15);
  lv_obj_center(slider);
  lv_obj_add_event_cb(slider, lv_slider_cb, LV_EVENT_VALUE_CHANGED, NULL);
  label = lv_label_create(lv_scr_act());
  lv_label_set_text_fmt(label, "Volumn : %d", lv_slider_get_value(slider));
  lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -10);
  static const char *btns[] = {"OK", ""};
  msgbox = lv_msgbox_create(lv_scr_act(), LV_SYMBOL_WARNING"Notice", "Excessive volume may damage hearing.", btns, true);
  lv_obj_add_event_cb(msgbox, lv_msgbox_btn_callback, LV_EVENT_CLICKED, NULL);
  lv_obj_add_flag(msgbox, LV_OBJ_FLAG_HIDDEN);
  lv_obj_align(msgbox, LV_ALIGN_CENTER, 0, 0);

效果

4.API

微调器部件(lv_spinbox)

1.数值格式设置

/*第二个参数表示总位数,第三个参数表示小数点以后的位数,设置为0则忽略小数点*/
void lv_spinbox_set_digit_format(lv_obj_t * obj, uint8_t digit_count, uint8_t separator_position);

 2.设置编辑的位数

/*pos为0表示编辑右数第一位*/
void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint8_t pos);

3.设置部件的翻转模式(防止超范围)

/*b为true表示使能翻转*/
void lv_spinbox_set_rollover(lv_obj_t * obj, bool b);

4.综合示例

lv_obj_t *spinbox, *btInc, *btDec;
static void lv_btn_cb(lv_event_t * e)
{
  lv_obj_t *tarBtn = lv_event_get_current_target(e);
  static int8_t count = 0;
  if (tarBtn == btInc)
  {
    count++;
    lv_spinbox_increment(spinbox);
    // lv_spinbox_set_value(spinbox, count);
  }
  else 
  {
    count--;
    lv_spinbox_decrement(spinbox);
    // lv_spinbox_set_value(spinbox, count);
  }
    
}
  spinbox = lv_spinbox_create(lv_scr_act());
  lv_spinbox_set_digit_format(spinbox, 5, 2);
  lv_obj_center(spinbox);
  lv_obj_set_width(spinbox, 100);
  lv_spinbox_set_range(spinbox, -10000, 10000);
  lv_spinbox_set_value(spinbox, 0);
  lv_spinbox_set_step(spinbox, 1);
  btInc = lv_btn_create(lv_scr_act());
  btDec = lv_btn_create(lv_scr_act());
  lv_obj_align_to(btInc, spinbox, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
  lv_obj_align_to(btDec, spinbox, LV_ALIGN_OUT_LEFT_MID, 0, 0);
  lv_label_set_text(lv_label_create(btInc), "+");
  lv_label_set_text(lv_label_create(btDec), "-");
  lv_obj_add_event_cb(btInc, lv_btn_cb, LV_EVENT_CLICKED, NULL);
  lv_obj_add_event_cb(btDec, lv_btn_cb, LV_EVENT_CLICKED, NULL);

效果

5.API

加载器部件(lv_spinner)

1.API

平铺视图部件(lv_tileview)

1.添加页面

/*注意先是列,再是行,第4个参数一定要根据实际的页面分布来选择,可选宏为
LV_DIR_LEFT
LV_DIR_RIGHT
LV_DIR_TOP
LV_DIR_BOTTOM
LV_DIR_HOR
LV_DIR_VER
LV_DIR_ALL
若tile1在tile2的左边,则添加tile1时应该设置LV_DIR_RIGHT向右滚动
*/
lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir)

 举例

lv_obj_t *tileview = lv_tileview_create(lv_scr_act());
lv_obj_t *tile5 = lv_tileview_add_tile(tileview, 0, 0, LV_DIR_BOTTOM);
lv_obj_t *tile1 = lv_tileview_add_tile(tileview, 0, 1, LV_DIR_TOP | LV_DIR_BOTTOM | LV_DIR_RIGHT);
lv_obj_t *tile2 = lv_tileview_add_tile(tileview, 1, 1, LV_DIR_RIGHT | LV_DIR_LEFT);
lv_obj_t *tile3 = lv_tileview_add_tile(tileview, 2, 1, LV_DIR_RIGHT | LV_DIR_LEFT);
lv_obj_t *tile4 = lv_tileview_add_tile(tileview, 3, 1, LV_DIR_LEFT);
lv_obj_t *tile6 = lv_tileview_add_tile(tileview, 0, 2, LV_DIR_TOP);

2.切换页面

/*根据行列坐标选择页面,最后一个参数可选宏为LV_ANIM_ON/OFF,选择开机切换页面的动画效果*/
void lv_obj_set_tile_id(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en);

3.综合示例

页面分布

5

1 2 3 4

6

  lv_obj_t *tileview = lv_tileview_create(lv_scr_act());
  lv_obj_t *tile5 = lv_tileview_add_tile(tileview, 0, 0, LV_DIR_BOTTOM);
  lv_obj_t *tile1 = lv_tileview_add_tile(tileview, 0, 1, LV_DIR_TOP | LV_DIR_BOTTOM | LV_DIR_RIGHT);
  lv_obj_t *tile2 = lv_tileview_add_tile(tileview, 1, 1, LV_DIR_RIGHT | LV_DIR_LEFT);
  lv_obj_t *tile3 = lv_tileview_add_tile(tileview, 2, 1, LV_DIR_RIGHT | LV_DIR_LEFT);
  lv_obj_t *tile4 = lv_tileview_add_tile(tileview, 3, 1, LV_DIR_LEFT);
  lv_obj_t *tile6 = lv_tileview_add_tile(tileview, 0, 2, LV_DIR_TOP);
  lv_obj_t *label5 = lv_label_create(tile5);
  lv_label_set_text(label5, "tile5");
  lv_obj_align(label5, LV_ALIGN_CENTER, 0, 0);
  lv_obj_t *label1 = lv_label_create(tile1);
  lv_label_set_text(label1, "tile1");
  lv_obj_align(label1, LV_ALIGN_CENTER, 0, 0);
  lv_obj_t *label2 = lv_label_create(tile2);
  lv_label_set_text(label2, "tile2");
  lv_obj_align(label2, LV_ALIGN_CENTER, 0, 0);
  lv_obj_t *label3 = lv_label_create(tile3);
  lv_label_set_text(label3, "tile3");
  lv_obj_align(label3, LV_ALIGN_CENTER, 0, 0);
  lv_obj_t *label4 = lv_label_create(tile4);
  lv_label_set_text(label4, "tile4");
  lv_obj_align(label4, LV_ALIGN_CENTER, 0, 0);
  lv_obj_t *label6 = lv_label_create(tile6);
  lv_label_set_text(label6, "tile6");
  lv_obj_align(label6, LV_ALIGN_CENTER, 0, 0);
  lv_obj_set_tile_id(tileview, 0, 2, LV_ANIM_ON);

效果

4.API

 窗口部件(lv_win)

1.添加标题与按键

/*标题与按键添加在窗口的头部,并且根据调用顺序从左往右依次显示*/
lv_obj_t * lv_win_add_title(lv_obj_t * win, const char * txt);
lv_obj_t * lv_win_add_btn(lv_obj_t * win, const void * icon, lv_coord_t btn_w);

举例

  lv_obj_t *win = lv_win_create(lv_scr_act(), 50);
  lv_obj_set_size(win, 300, 300);
  lv_obj_center(win);
  lv_win_add_btn(win, LV_SYMBOL_AUDIO, 40);
  lv_win_add_title(win, "Tile");
  lv_win_add_btn(win, LV_SYMBOL_CALL, 40);

效果

2.API

 

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bahair_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值