LVGL快速入门笔记

目录

一、基础知识

1. 基础对象(lv_obj)

2. 基础对象的大小(size)

3. 基础对象的位置(position)

3.1 直接设置方式

3.2 参照父对象对齐

3.3 获取位置

4. 基础对象的盒子模型(border-box)

5. 基础对象的样式(styles)

5.1 样式的状态和部分

5.1.1 对象可以处于以下状态States的组合:

5.1.2 对象可以有 部分(parts) ,它们也可以有自己的样式。LVGL 中存在以下预定义部分:

6. 基础对象的事件(events)

二、基础组件

1. 标签 lv_label

2. 按钮 lv_btn

3. 开关 lv_switch

4. 复选框 lv_checkbox

5. 下拉列表 lv_dropdown

6. 滚轮 lv_roller

7. 进度条 lv_bar

8. 滑动条 lv_slider

9. 圆弧 lv_arc

10. 定时器 lv_timer

11. 线条 lv_line

12. 文本框 lv_textarea

13. 按钮矩阵 lv_btnmatrix

14. 窗体部件 lv_win

15. 图片部件 lv_img

一、基础知识

1. 基础对象(lv_obj)

lv_scr_act(void); // 活动屏幕

lv_layer_top(void); // 顶层

lv_layer_sys(void); // 系统层

lv_layer_sys<-lv_layer_top<-lv_scr_act 最上层到底层的显示排序

void lv_100ask_demo_test(void)
{
    lv_obj_t * cb = lv_checkbox_create(lv_layer_sys());
    lv_obj_t * obj = lv_obj_create(lv_layer_top());
    lv_obj_t * label = lv_label_create(lv_scr_act());
​
    lv_obj_center(cb);
    lv_obj_center(label);
    lv_obj_center(obj);
}

2. 基础对象的大小(size)

设置宽度:lv_obj_set_width(obj, new_width);

设置高度:lv_obj_set_height(obj, new_height);

同时设置宽度、高度:lv_obj_set_size(obj, new_ width, new_ height)

获取宽度:lv_obj_get_width(obj);

获取高度:lv_obj_get_height(obj);

3. 基础对象的位置(position)

3.1 直接设置方式

设置x轴方向的坐标位置:lv_obj_set_x(obj, new_x);

设置y轴方向的坐标位置:lv_obj_set_y(obj, new_y);

同时设置x、y坐标位置:lv_obj_set_pos(obj, new_x, new_y);

3.2 参照父对象对齐

lv_obj_set_align(obj, LV_ALIGN...);

参照父对象对齐后再设置坐标位置:

lv_obj_align(obj, LV_ALIGN..., x, y);

参照另一个对象(无父子关系)对齐后设置坐标位置:

lv_obj_align_to(obj_to_align, obj_referece, LV_ALIGN_..., x, y)

对齐类型(LV_ALIGN_...)

void lv_100ask_demo_test(void)
{
    lv_obj_t * cb = lv_checkbox_create(lv_scr_act());
    lv_obj_t * obj = lv_obj_create(lv_scr_act());
    lv_obj_t * label = lv_label_create(lv_scr_act());
    //lv_obj_center(cb);
    lv_obj_set_align(obj, LV_ALIGN_CENTER);
    lv_obj_align(label, LV_ALIGN_CENTER, 100, 0);
    lv_obj_align_to(cb, obj, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);
}
3.3 获取位置

获取x轴坐标位置:lv_obj_get_x(obj);

获取y轴坐标位置:lv_obj_get_y(obj);

4. 基础对象的盒子模型(border-box)

void lv_100ask_demo_test(void)
{
    lv_obj_t * obj1 = lv_obj_create(lv_scr_act());
    lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0);
    lv_obj_set_style_border_width(obj1, 10, 0);
    lv_obj_set_style_outline_width(obj1, 10, 0);//在border基础上加宽
#if 0
    lv_obj_t * obj2 = lv_obj_create(lv_scr_act());
    lv_obj_t * obj_out_top = lv_obj_create(lv_scr_act());
    lv_obj_t * obj_out_bottom = lv_obj_create(lv_scr_act());
    lv_obj_t * obj_out_left = lv_obj_create(lv_scr_act());
    lv_obj_t * obj_out_right = lv_obj_create(lv_scr_act());
    //lv_obj_set_style_outline_width(obj_out_left, 10, 0);
​
    lv_obj_align(obj1, LV_ALIGN_CENTER, 0, 0);
    lv_obj_align_to(obj_out_top, obj1, LV_ALIGN_OUT_TOP_MID, 0, 0);
    lv_obj_align_to(obj_out_bottom, obj1, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);
    lv_obj_align_to(obj_out_left, obj1, LV_ALIGN_OUT_LEFT_MID, 0, 0);
    lv_obj_align_to(obj_out_right, obj1, LV_ALIGN_OUT_RIGHT_MID, 0, 0);
    lv_obj_align_to(obj2, obj_out_right, LV_ALIGN_OUT_TOP_MID, 0, 0);
​
#endif
}

5. 基础对象的样式(styles)

void lv_100ask_demo_test(void)
{
    // 正常样式
    static lv_style_t style_obj;
    lv_style_init(&style_obj);
​
    lv_style_set_bg_color(&style_obj, lv_color_hex(0x000000));      // 设置背景色
    lv_style_set_text_color(&style_obj, lv_color_hex(0xc43e1c));    // 设置文字颜色
    lv_style_set_bg_opa(&style_obj, 30);                          // 设置透明度
    
    lv_obj_t * obj = lv_obj_create(lv_scr_act());
    lv_obj_add_style(obj, &style_obj, 0);  // 默认状态: LV_STATE_DEFAULT
    
    lv_obj_t * obj2 = lv_obj_create(lv_scr_act());
    lv_obj_align(obj2, LV_ALIGN_CENTER, 0 ,0);
    lv_obj_add_style(obj2, &style_obj, LV_STATE_PRESSED);  // 按下状态,当对象被按下的时候应用该样式
    
    lv_obj_t * obj3 = lv_obj_create(lv_scr_act());
    lv_obj_align_to(obj3, obj2, LV_ALIGN_OUT_BOTTOM_MID, 0, 0);
    lv_obj_set_style_bg_color(obj3,  lv_color_hex(0xc43e1c), LV_STATE_PRESSED);   // 设置背景色
    lv_obj_set_style_bg_opa(obj3, LV_OPA_50, 0);
    
    lv_obj_t * label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "Hello, LVGL!");
    lv_obj_align_to(label, obj2, LV_ALIGN_OUT_TOP_MID, 0, 0);
    lv_obj_add_style(label, &style_obj, 0);  // 默认状态: LV_STATE_DEFAULT
}

5.1 样式的状态和部分
5.1.1 对象可以处于以下状态States的组合:

LV_STATE_DEFAULT (0x0000) 正常,释放状态

LV_STATE_CHECKED (0x0001) 切换或检查状态

LV_STATE_FOCUSED (0x0002) 通过键盘或编码器聚焦或通过触摸板/鼠标点击

LV_STATE_FOCUS_KEY (0x0004) 通过键盘或编码器聚焦,但不通过触摸板/鼠标聚焦

LV_STATE_EDITED (0x0008) 由编码器编辑

LV_STATE_HOVERED (0x0010) 鼠标悬停(现在不支持)

LV_STATE_PRESSED (0x0020) 被按下

LV_STATE_SCROLLED (0x0040) 正在滚动

LV_STATE_DISABLED (0x0080) 禁用状态

LV_STATE_USER_1 (0x1000) 自定义状态

LV_STATE_USER_2 (0x2000) 自定义状态

LV_STATE_USER_3 (0x4000) 自定义状态

LV_STATE_USER_4 (0x8000) 自定义状态

5.1.2 对象可以有 部分(parts) ,它们也可以有自己的样式。LVGL 中存在以下预定义部分:

LV_PART_MAIN 类似矩形的背景

LV_PART_SCROLLBAR 滚动条

LV_PART_INDICATOR 指标,例如用于滑块、条、开关或复选框的勾选框

LV_PART_KNOB 像手柄一样可以抓取调整值

LV_PART_SELECTED 表示当前选择的选项或部分

LV_PART_ITEMS 如果小部件具有多个相似元素(例如表格单元格)

LV_PART_TICKS 刻度上的刻度,例如对于图表或仪表

LV_PART_CURSOR 标记一个特定的地方,例如文本区域或图表的光标

LV_PART_CUSTOM_FIRST 可以从这里添加自定义部件。

这些可能会随着lvgl的更新而不断增加,同学们可以阅读最新版本的文档获取最新资料。

6. 基础对象的事件(events)

static void my_event_cb(lv_event_t * e)
{
    lv_obj_t * obj1 = lv_event_get_target(e);        // 获取触发事件的部件(对象)
    lv_event_code_t code = lv_event_get_code(e);    // 获取当前部件(对象)触发的事件代码
    lv_obj_t * label1 = lv_event_get_user_data(e);   // 获取添加事件时传递的用户数据
​
    switch(code){
        case LV_EVENT_PRESSED:
            lv_label_set_text(label1, "LV_EVENT_PRESSED");
            lv_obj_set_style_bg_color(obj1, lv_color_hex(0xc43e1c), 0);  // 通过本地样式(私有样式)设置背景色
            printf("LV_EVENT_PRESSED\n");
            break;
        case LV_EVENT_LONG_PRESSED:
            lv_label_set_text(label1, "LV_EVENT_LONG_PRESSED");
            lv_obj_set_style_bg_color(obj1, lv_color_hex(0x4cbe37), 0);  // 通过本地样式(私有样式)设置背景色
            printf("LV_EVENT_LONG_PRESSED\n");
            break;
        default:
            //printf("NONE\n");
            break;
    }
}
​
void lv_100ask_demo_course_2_2_6(void)
{
    /* 创建基础部件(对象) */
    lv_obj_t * obj = lv_obj_create(lv_scr_act());
​
    /* 创建label部件(对象) */
    lv_obj_t * label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, "test");   // 设置label展示的文字
    lv_obj_center(label);               // 将对象与其父对象的中心对齐,这里的父对象是屏幕:lv_scr_act()
​
    // 为obj1添加事件回调函数,所有的事件类型都能触发该回调函数
    lv_obj_add_event_cb(obj, my_event_cb, LV_EVENT_ALL, label);
}

二、基础组件

1. 标签 lv_label

创建标签:

lv_obj_t * label = lv_label_create(parent);

设置显示文本:

直接设置要显示的文本:lv_label_set_text(label, "New text");

格式化给定要显示的文本:lv_label_set_text_fmt(label, “%s: %d”, “Value”, 15);

文本不存储在动态内存中,而是直接使用给定的缓冲区:lv_label_set_text_static(label, "New text");

要在label换行非常简单,像printf函数那样使用 \n 即可:lv_label_set_text(label, " line1\nline2\n\nline4 ");

设置显示文本大小:

默认情况标签的大小会自动拓展成和文本一样的大小(LV_SIZE_CONTENT),如果可以像前面课程说到的方法显式设置宽高: lv_obj_set_size lv_obj_set_width lv_obj_set_height

这样就可能出现文本的宽度或高度大小label的情况,就需要做一些调整,下面是几种模式: LV_LABEL_LONG_WRAP 如果有多个换行,并且如果高度为LV_SIZE_CONTENT,那么高度会根据文本换行被自动扩展;否则文本将被剪掉。(默认设置)

LV_LABEL_LONG_DOT 如果文本太长,就保持大小并在末尾写3个点

LV_LABEL_LONG_SCROLL 如果文本比标签宽(太长),则可以水平来回滚动显示它。如果它很高(多个\n换行),可以垂直滚动。只滚动一个方向,水平滚动的优先级更高。

LV_LABEL_LONG_SCROLL_CIRCULAR 如果文本比标签宽,则水平滚动它。如果它更高,就垂直滚动。只滚动一个方向,水平滚动的优先级更高。

LV_LABEL_LONG_CLIP 剪掉超出标签范围外的文本部分。

可以使用 lv_label_set_long_mode(label, LV_LABEL_LONG_...) 指定模式。

注意:LV_LABEL_LONG_DOT 是直接操作文本缓冲区以添加/删除点。如果使用 lv_label_set_text 和 lv_label_set_text_fmt 它们会分配一个单独的缓冲区,不会出问题。但是如果使用 lv_label_set_text_static 时我们传递给它的缓冲区必须是可写的。

文本着色:

我们可以很方便地给我们的要显示的文本重新着色,可以通过样式来上色,例如: lv_style_set_text_color(&style_obj, lv_color_hex(0xf7b37b));

lv_obj_set_style_text_color(label, lv_color_hex(0xf7b37b), 0);

也可以让文本某些部分重新着色,例如:

lv_label_set_recolor(label1, true);

lv_label_set_text(label1, "#0000ff Re-color# #ff00ff words# #ff0000 of a# label);

文本选择:

如果在 lv_conf.h 中打开了 LV_LABEL_TEXT_SELECTION (默认开启),就可以选择部分文本了。这个和我们在PC用鼠标选中文本类似,但是这个效果只能在文本框(lv_textarea)中实现。Label只能事先手动选择指定范围的文本:

lv_label_set_text_sel_start(label, 1);

lv_label_set_text_sel_end(label, 6);

注意,这里的第一个字符从1开始算,而不是0。

显示图标:

LVGL内置了一些图标,它们是全局变量我们可以直接使用:

用法很简单(LV_SYMBOL_...):

lv_label_set_text(my_label, LV_SYMBOL_OK); // 直接显示图标

lv_label_set_text(my_label, LV_SYMBOL_OK “Apply”); // 图标与字符串一起使用

lv_label_set_text(my_label, LV_SYMBOL_OK LV_SYMBOL_WIFI LV_SYMBOL_PLAY); // 多个图标一起使用

显示中文字体:

有待补充*

void lv_100ask_demo_test(void)
{
    char * text = "www.100ask.net";   // 要显示的文字
    lv_obj_t * label = lv_label_create(lv_scr_act());   // 创建一个label部件(对象),他的父对象是活动屏幕对象
​
    lv_obj_set_size(label, 100, 100);//设置大小都是一样的
    lv_obj_set_align(label, LV_ALIGN_CENTER);
    
    //lv_label_set_text(label, text);
    //lv_label_set_text(label, "www.100ask.net\nywh"); // 也可以这样使用
    //lv_label_set_text_fmt(label, "%s: %d", "Value", 15);
    //lv_label_set_text_static(label, text);
    
    /* 设置要显示的文字,直接使用给定的缓冲区(不常用) */
    //lv_label_set_text_static(label, text);
    //lv_label_set_text_static(label, "www.100ask.net"); // 也可以这样使用
    
    /* 设置文字字号(内置ASCII字库) */
    /* 使用其他字号的字体,如果不设置默认使用 lv_font_montserrat_14 ,在 lv_conf.h 中 LV_FONT_DEFAULT 定义 */
    lv_obj_set_style_text_font(label, &lv_font_montserrat_28, 0);  // 为了方便,这里使用本地(私有)样式
    
    lv_obj_set_style_text_color(label, lv_color_hex(0xf7b37b), 0);
    
    lv_label_set_recolor(label, true);
    lv_label_set_text(label,LV_SYMBOL_PLAY "#0000ff Re-color# #ff00ff words# #ff0000 of a# label " LV_SYMBOL_OK " " LV_SYMBOL_WIFI);
    
    lv_label_set_long_mode(label,LV_LABEL_LONG_SCROLL);
}

2. 按钮 lv_btn

创建按键的方法:

lv_obj_t * btn = lv_btn_create(parent);

部分和样式:

// 修改按钮部件(对象)矩形背景部分的样式 lv_obj_set_style_bg_color(btn, lv_color_hex(0x1e1e1e), LV_PART_MAIN | LV_STATE_PRESSED);

static void btn_toggle_event_cb(lv_event_t * e)
{
    lv_obj_t * obj = lv_event_get_target(e);        // 获取触发事件的部件(对象)
    lv_event_code_t code = lv_event_get_code(e);    // 获取当前部件(对象)触发的事件代码
​
    switch(code){
        case LV_EVENT_VALUE_CHANGED:
            printf("LV_EVENT_VALUE_CHANGED\n");
            break;
        default:
            //printf("NONE\n");
            break;
    }
​
}
​
void lv_100ask_demo_test(void)
{
    /* 创建一个btn部件(对象) */
    lv_obj_t * btn = lv_btn_create(lv_scr_act());       // 创建一个btn部件(对象),他的父对象是活动屏幕对象
​
    lv_obj_set_align(btn, LV_ALIGN_CENTER);
    
    // 修改按钮部件(对象)矩形背景部分的样式
    lv_obj_set_style_bg_color(btn, lv_color_hex(0x1e1e1e), LV_PART_MAIN | LV_STATE_PRESSED);
    
    // 打开了 LV_OBJ_FLAG_CHECKABLE ,当对象被点击时有选中切换(Toggle)状态的效果
    // 其触发的是 LV_EVENT_VALUE_CHANGED 事件类型
    lv_obj_add_flag(btn, LV_OBJ_FLAG_CHECKABLE);
    
    // 处理 LV_EVENT_VALUE_CHANGED 事件类型示例
    lv_obj_add_event_cb(btn, btn_toggle_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}

3. 开关 lv_switch

static void sw_event_handler(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *sw = lv_event_get_target(e);
​
    if (code == LV_EVENT_VALUE_CHANGED)
    {
        // 判断开关状态
        /* 方式1 */
        // 返回 bool 类型, 开-1 ; 关-2
        //if(lv_obj_has_state(sw, LV_STATE_CHECKED))
        //    LV_LOG_USER("ON!");
        //else
        //    LV_LOG_USER("OFF!");
    
        // 更简介的写法
        LV_LOG_USER("State: %s", lv_obj_has_state(sw, LV_STATE_CHECKED) ? "ON" : "OFF");
​
        /* 方式2 */
        //if(lv_obj_get_state(sw) & LV_STATE_CHECKED)
        //    LV_LOG_USER("ON!");
        //else
        //    LV_LOG_USER("OFF!");
        //LV_LOG_USER("State: %s", (lv_obj_get_state(sw) & LV_STATE_CHECKED) ? "ON" : "OFF");
    }
​
}
​
void lv_100ask_demo_test(void)
{
    /* 创建一个 switch 部件(对象) */
    lv_obj_t * sw = lv_switch_create(lv_scr_act());       // 创建一个 switch 部件(对象),他的父对象是活动屏幕对象
    lv_obj_center(sw);                                    // 方法1:让对象居中,简洁
    //lv_obj_align(sw, LV_ALIGN_CENTER, 0, 0);            // 方法2:让对象居中,较为灵活
​
    // 修改开关对象的大小,注意比例不能是 1:1 (比如:宽高都是100),否则只能看到一个大圆
    //lv_obj_set_size(sw, 200, 100);
    
    // 开操作
    //lv_obj_add_state(sw, LV_STATE_CHECKED);                       // 开关默认处于关闭状态,这里设置为打开状态
    //lv_obj_add_state(sw, LV_STATE_CHECKED | LV_STATE_DISABLED);   // 当前状态是开,并且不可更改
    
    // 关操作
    //lv_obj_clear_state(sw, LV_STATE_CHECKED);         // 关
    //lv_obj_add_state(sw, LV_STATE_DISABLED);              // 当前状态是关,并且不可更改
    
    // 清除禁用状态,一般由其他部件(外部)清除
    //lv_obj_clear_state(sw, LV_STATE_ DISABLED);       // 清除禁用状态,按钮可正常使用
    
    // 添加事件,当我们点击开关,改变开关的状态时,会触发 LV_EVENT_VALUE_CHANGED 事件类型
    // 当然我们可以处理他触发的其他事件类型,比如: LV_EVENT_CLICKED
    lv_obj_add_event_cb(sw, sw_event_handler, LV_EVENT_VALUE_CHANGED, NULL);
​
}

4. 复选框 lv_checkbox

static void cb_event_handler(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *cb = lv_event_get_target(e);
​
    if (code == LV_EVENT_VALUE_CHANGED)
    {
        const char * txt = lv_checkbox_get_text(cb);
    
        // 判断开关状态
        /* 方式1 */
        // 返回 bool 类型, 开-1 ; 关-2
        //if(lv_obj_has_state(cb, LV_STATE_CHECKED))
        //    LV_LOG_USER("%s: CHECKED!", txt);
        //else
        //    LV_LOG_USER("%s: UNCHECKED!", txt);
    
        // 更简介的写法
        LV_LOG_USER("%s: %s", txt, lv_obj_has_state(cb, LV_STATE_CHECKED) ? "CHECKED" : "UNCHECKED");
​
​
        /* 方式2 */
        //if(lv_obj_get_state(cb) & LV_STATE_CHECKED)
        //    LV_LOG_USER("%s: CHECKED!", txt);
        //else
        //    LV_LOG_USER("%s: UNCHECKED!", txt);
        //LV_LOG_USER("%s: %s", txt, (lv_obj_get_state(cb) & LV_STATE_CHECKED) ? "CHECKED" : "UNCHECKED");
    }
​
}
​
void lv_100ask_demo_test(void)
{
    /* 创建一个 checkbox 部件(对象) */
    lv_obj_t * cb = lv_checkbox_create(lv_scr_act());     // 创建一个 switch 部件(对象),他的父对象是活动屏幕对象
    lv_checkbox_set_text(cb, "100ASK LVGL Tutorial " LV_SYMBOL_PLAY);  // 修改复选框的提示文字(覆盖)
​
    lv_obj_center(cb);                                    // 方法1:让对象居中,简洁
    
    lv_obj_set_style_bg_opa(cb, 15, LV_PART_MAIN);                         // 修改复选框的背景透明度
    lv_obj_set_style_bg_color(cb, lv_color_hex(0xc43e1c), LV_PART_MAIN);    // 修改复选框的背景颜色
    
    lv_obj_set_style_pad_column(cb, 35, 0);                   // 设置复选框的勾选框和提示文字的距离
​
    lv_obj_set_style_bg_color(cb, lv_color_hex(0xc43e1c), LV_PART_INDICATOR);   // 修改勾选框部分,勾选时的背景颜色
    lv_obj_set_style_bg_color(cb, lv_color_hex(0x7719aa), LV_PART_INDICATOR | LV_STATE_CHECKED); // 修改勾选框部分,不勾选时的背景颜色
    
    // 勾选操作
    //lv_obj_add_state(cb, LV_STATE_CHECKED);                       // 复选框默认处于不勾选状态,这里设置为勾选状态状态
    //lv_obj_add_state(cb, LV_STATE_CHECKED | LV_STATE_DISABLED);   // 当前状态是勾选状态,并且不可更改
    
    // 不勾选操作
    //lv_obj_clear_state(cb, LV_STATE_CHECKED);         // 不勾选
    //lv_obj_add_state(cb, LV_STATE_DISABLED);          // 当前状态是不勾选状态,并且不可更改
    
    // 清除禁用状态,一般由其他部件(外部)清除
    //lv_obj_clear_state(cb, LV_STATE_DISABLED);       // 清除禁用状态,复选框可正常使用
    
    // 添加事件,当我们点击复选框,改变勾选框的状态时,会触发 LV_EVENT_VALUE_CHANGED 事件类型
    // 当然我们可以处理他触发的其他事件类型,比如: LV_EVENT_CLICKED
    lv_obj_add_event_cb(cb, cb_event_handler, LV_EVENT_VALUE_CHANGED, NULL);
​
}

5. 下拉列表 lv_dropdown

static void dd_event_handler(lv_event_t* e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t* obj = lv_event_get_target(e);
    if (code == LV_EVENT_VALUE_CHANGED) {
        char buf[32];
        lv_dropdown_get_selected_str(obj, buf, sizeof(buf));
        //LV_LOG_USER("Option: %s", buf);
        if (strcmp(buf, "Apple") == 0)
        {
            printf("Apple\r\n");
        }
        else if (strcmp(buf, "Banana") == 0)
        {
            printf("Banana\r\n");
        }
        else if (strcmp(buf, "ywh") == 0)
        {
            printf("ywh\r\n");
        }
        else if (strcmp(buf, "Orange") == 0)
        {
            printf("Orange\r\n");
        }
    }
}
​
void lv_example_flex_2(void)
{
    lv_obj_t* dd = lv_dropdown_create(lv_scr_act());
    lv_dropdown_set_options(dd, "Apple\n"
                                "Banana\n"
                                "Orange\n"
                                "Cherry\n"
                                "Grape\n"
                                "Raspberry\n"
                                "Melon\n"
                                "Orange\n"
                                "Lemon\n"
                                "Nuts");
    lv_dropdown_add_option(dd,"ywh",0);
    lv_dropdown_set_selected(dd,2);
    lv_obj_set_align(dd, LV_ALIGN_CENTER);
​
    lv_obj_add_event_cb(dd,dd_event_handler,LV_EVENT_VALUE_CHANGED,NULL);
}

6. 滚轮 lv_roller

static void event_handler(lv_event_t* e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t* obj = lv_event_get_target(e);
    if (code == LV_EVENT_VALUE_CHANGED) {
        char buf[32];
        lv_roller_get_selected_str(obj, buf, sizeof(buf));
        if ( strcmp(buf,"January") == 0)
        {
            printf("January\r\n");
        }
        else if (strcmp(buf, "February") == 0)
        {
            printf("February\r\n");
        }
        else if (strcmp(buf, "March") == 0)
        {
            printf("March\r\n");
        }
    }
}
​
void lv_example_flex_2(void)
{
    lv_obj_t* roller1 = lv_roller_create(lv_scr_act());
    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_INFINITE);
​
    lv_roller_set_visible_row_count(roller1, 4);
    lv_obj_center(roller1);
    
    lv_obj_add_event_cb(roller1, event_handler, LV_EVENT_ALL, NULL);
}
​

7. 进度条 lv_bar

void lv_example_flex_2(void)
{
    lv_obj_t* bar1 = lv_bar_create(lv_scr_act());
    lv_obj_set_size(bar1, 200, 20);
    lv_obj_center(bar1);
    lv_bar_set_value(bar1, 70, LV_ANIM_OFF);
}

8. 滑动条 lv_slider

void lv_example_flex_2(void)
{
    static lv_style_t style_part_main;                  // 保存part main样式
    static lv_style_t style_part_knob;                  // 保存part knob(旋钮)样式
    static lv_style_t style_part_indicator;             // 保存part indicator(指示器)样式
​
#if 1
    // 创建一个 slider 组件(对象),他的父对象是活动屏幕对象
    lv_obj_t* slider = lv_slider_create(lv_scr_act());
​
    /* 设置位置 */
    lv_obj_center(slider);                              // 方法1:让对象居中,简洁
    //lv_obj_align(slider, LV_ALIGN_CENTER, 0, 0);      // 方法2:让对象居中,较为灵活
    
    /*调整大小,让 slider 垂直摆放  */
    lv_obj_set_size(slider, 60, 150);
    
    /* 初始化样式 */
    lv_style_init(&style_part_main);
    lv_style_init(&style_part_knob);
    lv_style_init(&style_part_indicator);
    
    /* 设置 PART MAIN 样式 */
    lv_style_set_radius(&style_part_main, 15);          // 设置四个角的圆角
    lv_style_set_bg_color(&style_part_main,
        lv_color_hex(0xc43e1c));        // 设置背景颜色
    lv_style_set_pad_top(&style_part_main, -2);         // 设置顶部(top)的填充(top)大小
    lv_style_set_pad_bottom(&style_part_main, -2);      // 设置底部部(bottom)的填充(top)大小
    //lv_style_set_bg_opa(&style_part_main, LV_OPA_100);    // 设置背景透明度
    
    /* 设置 PART KNOB 样式 */
    // 将 knob 部分整个设置为透明,就能达到去除旋钮的效果
    // set_opa是设置不透明度,设置不透明度为0就是完全透明
    lv_style_set_opa(&style_part_knob, LV_OPA_0);
    
    /* 设置 PART INDICATOR 样式 */
    lv_style_set_radius(&style_part_indicator, 0);      // 设置四个角的圆角
    lv_style_set_bg_color(&style_part_indicator,lv_color_hex(0xffffff));
    
    /* 将样式应用到 slider */
    // 将保存在 style_part_main 中的样式应用到
    // slider 的 LV_PART_MAIN 上
    lv_obj_add_style(slider, &style_part_main, LV_PART_MAIN);
    
    // 将保存在 style_part_knob 中的样式应用到
    // slider 的 LV_PART_KNOB 上
    lv_obj_add_style(slider, &style_part_knob, LV_PART_KNOB);
    
    // 将保存在 style_part_indicator 中的样式应用到
    // slider 的 LV_PART_INDICATOR 上
    lv_obj_add_style(slider, &style_part_indicator, LV_PART_INDICATOR);
    
    /* 在 slider 内部放一个小图标,用来表明slider的作用 */
    // 这里使用 lvgl 的内置符号(方便、节省内存),可以使用img展示。
    // lvgl内置符号: http://lvgl.100ask.net/8.2/overview/font.html#special-fonts
    lv_obj_t* label = lv_label_create(slider);
    lv_label_set_text(label, LV_SYMBOL_VOLUME_MAX);
    
    // 在lvgl中内置符号可以像 text 那样使用,lvgl 内置了很多不一样的字体(ASCII),
    // 使用不同尺寸的内置字体就能展示不一样大小的 text ,默认是:lv_font_montserrat_14
    // 需要设置内置字体,请查看: lv_conf.h 中的 LV_FONT_MONTSERRAT_...
    lv_obj_set_style_text_font(label, &lv_font_montserrat_20, 0);
    lv_obj_set_style_text_color(label, lv_color_hex(0xac8477), 0);
    lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -20);
​
#endif
}

9. 圆弧 lv_arc

static void value_changed_event_cb(lv_event_t* e)
{
    lv_obj_t* arc = lv_event_get_target(e);
    lv_obj_t* label = lv_event_get_user_data(e);
​
    lv_label_set_text_fmt(label, "%d%%", lv_arc_get_value(arc));
    if (lv_arc_get_value(arc) == 50)
    {
        printf("*******\r\n");
    }
    /*Rotate the label to the current position of the arc*/
    lv_arc_rotate_obj_to_angle(arc, label, 25);
​
}
​
void lv_example_flex_2(void)
{
    lv_obj_t* label = lv_label_create(lv_scr_act());
​
    /*Create an Arc*/
    lv_obj_t* arc = lv_arc_create(lv_scr_act());
    lv_obj_set_size(arc, 150, 150);
    lv_arc_set_rotation(arc, 135);
    lv_arc_set_bg_angles(arc, 0, 270);
    lv_arc_set_value(arc, 10);
    lv_obj_center(arc);
    lv_obj_add_event_cb(arc, value_changed_event_cb, LV_EVENT_VALUE_CHANGED, label);
    
    /*Manually update the label for the first time*/
    lv_event_send(arc, LV_EVENT_VALUE_CHANGED, NULL);
}
​
​

10. 定时器 lv_timer

11. 线条 lv_line

void lv_example_flex_2(void)
{
    static lv_style_t style_line;
    lv_style_init(&style_line);
    lv_style_set_line_width(&style_line, 8);
    lv_style_set_line_color(&style_line, lv_palette_main(LV_PALETTE_RED));
    lv_style_set_line_rounded(&style_line, true);//转折点变直 更好看
​
    static lv_point_t line_points[] = {
        {5, 5},
        {70, 70},
        {120, 10},
        {180, 60},
        {240, 10}
    };
    
    lv_obj_t* line1 = lv_line_create(lv_scr_act());
    lv_line_set_points(line1, line_points, 5);     /*Set the points*/
    lv_obj_add_style(line1, &style_line, 0);
    lv_obj_center(line1);
}

12. 文本框 lv_textarea

static void ta_event_cb(lv_event_t* e);
​
static lv_obj_t* kb;
​
void lv_example_flex_2(void)
{
    /*Create the password box*/
    lv_obj_t* pwd_ta = lv_textarea_create(lv_scr_act());
    lv_textarea_set_text(pwd_ta, "");
    lv_textarea_set_password_mode(pwd_ta, true);
    lv_textarea_set_one_line(pwd_ta, true);
    lv_obj_set_width(pwd_ta, lv_pct(40));
    lv_obj_set_pos(pwd_ta, 5, 20);
    lv_obj_add_event_cb(pwd_ta, ta_event_cb, LV_EVENT_ALL, NULL);
​
    /*Create a label and position it above the text box*/
    lv_obj_t* pwd_label = lv_label_create(lv_scr_act());
    lv_label_set_text(pwd_label, "Password:");
    lv_obj_align_to(pwd_label, pwd_ta, LV_ALIGN_OUT_TOP_LEFT, 0, 0);
    
    /*Create the one-line mode text area*/
    lv_obj_t* text_ta = lv_textarea_create(lv_scr_act());
    lv_textarea_set_one_line(text_ta, true);
    lv_textarea_set_password_mode(text_ta, false);
    lv_obj_set_width(text_ta, lv_pct(40));
    lv_obj_add_event_cb(text_ta, ta_event_cb, LV_EVENT_ALL, NULL);
    lv_obj_align(text_ta, LV_ALIGN_TOP_RIGHT, -5, 20);
​
​
    /*Create a label and position it above the text box*/
    lv_obj_t* oneline_label = lv_label_create(lv_scr_act());
    lv_label_set_text(oneline_label, "Text:");
    lv_obj_align_to(oneline_label, text_ta, LV_ALIGN_OUT_TOP_LEFT, 0, 0);
    
    /*Create a keyboard*/
    kb = lv_keyboard_create(lv_scr_act());
    lv_obj_set_size(kb, LV_HOR_RES, LV_VER_RES / 2);
    
    lv_keyboard_set_textarea(kb, pwd_ta); /*Focus it on one of the text areas to start*/
​
}
​
static void ta_event_cb(lv_event_t* e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t* ta = lv_event_get_target(e);
    if (code == LV_EVENT_CLICKED || code == LV_EVENT_FOCUSED) {
        /*Focus on the clicked text area*/
        if (kb != NULL) lv_keyboard_set_textarea(kb, ta);
    }
​
    else if (code == LV_EVENT_READY) {
        LV_LOG_USER("Ready, current text: %s", lv_textarea_get_text(ta));
    }
}

13. 按钮矩阵 lv_btnmatrix

static const char *map[] = {"btn1","\n","btn2","btn3",""};
​
static void event_cb(lv_event_t *e)
{
    uint8_t id;
    lv_obj_t* target = lv_event_get_target(e);
    id = lv_btnmatrix_get_selected_btn(target);
    printf("%d %s \r\n",id,lv_btnmatrix_get_btn_text(target,id));
}
​
void lv_example_flex_2(void)
{
    lv_obj_t * btnm = lv_btnmatrix_create(lv_scr_act());
    lv_btnmatrix_set_map(btnm,map);
    lv_btnmatrix_set_btn_width(btnm,2,2);
    lv_obj_center(btnm);
​
    lv_obj_add_event_cb(btnm,event_cb,LV_EVENT_VALUE_CHANGED,NULL);
}

14. 窗体部件 lv_win

案例1

void lv_example_flex_2(void)
{
    lv_obj_t *win = lv_win_create(lv_scr_act(),30);
​
    lv_obj_t* title = lv_win_add_title(win,"Setting");
    lv_obj_t* btn = lv_win_add_btn(win,LV_SYMBOL_CLOSE,20);
    
    lv_obj_t* content = lv_win_get_content(win);
    lv_obj_t* label = lv_label_create(content);
}

案例2

static void page_switch_event_handler(lv_event_t* e)
{
    lv_obj_t* btn = lv_event_get_target(e);
    lv_obj_t* page_to_switch = lv_event_get_user_data(e);
​
    /* 隐藏当前页面,显示另一个页面 */
    lv_obj_add_flag(lv_obj_get_parent(btn), LV_OBJ_FLAG_HIDDEN);
    lv_obj_clear_flag(page_to_switch, LV_OBJ_FLAG_HIDDEN);
​
}
​
void lv_example_flex_2(void)
{
    /* 创建第一个页面 */
    lv_obj_t* page1 = lv_obj_create(lv_scr_act());
    lv_obj_set_size(page1, 300, 400);
    lv_obj_center(page1);
​
    /* 创建第二个页面,但初始时隐藏 */
    lv_obj_t* page2 = lv_obj_create(lv_scr_act());
    lv_obj_set_size(page2, 200, 200);
    lv_obj_center(page2);
    lv_obj_add_flag(page2, LV_OBJ_FLAG_HIDDEN);
    
    /* 在第一个页面上添加按钮,用于跳转到第二个页面 */
    lv_obj_t* btn1 = lv_btn_create(page1);
    lv_obj_set_size(btn1, 100, 50);
    lv_obj_center(btn1);
    lv_obj_add_event_cb(btn1, page_switch_event_handler, LV_EVENT_CLICKED, page2);
    
    lv_obj_t* label1 = lv_label_create(btn1);
    lv_label_set_text(label1, "Go to Page 2");
    
    /* 在第二个页面上添加按钮,用于返回到第一个页面 */
    lv_obj_t* btn2 = lv_btn_create(page2);
    lv_obj_set_size(btn2, 100, 50);
    lv_obj_center(btn2);
    lv_obj_add_event_cb(btn2, page_switch_event_handler, LV_EVENT_CLICKED, page1);
    
    lv_obj_t* label2 = lv_label_create(btn2);
    lv_label_set_text(label2, "Back to Page 1");
​
}

案例3

static void page_switch_event_handler(lv_event_t* e)
{
    lv_obj_t* btn = lv_event_get_target(e);
    lv_obj_t* page_to_switch = lv_event_get_user_data(e);
​
    /* 隐藏当前页面,显示另一个页面 */
    lv_obj_add_flag(lv_obj_get_parent(btn), LV_OBJ_FLAG_HIDDEN);
    lv_obj_clear_flag(page_to_switch, LV_OBJ_FLAG_HIDDEN);
​
}
​
void lv_example_flex_2(void)
{
    /* 创建第一个页面 */
    lv_obj_t* page1 = lv_obj_create(lv_scr_act());
    //lv_obj_set_size(page1, 200, 200);
    lv_obj_set_size(page1, lv_pct(100), lv_pct(100));
    lv_obj_center(page1);
    lv_obj_set_style_bg_color(page1, lv_color_hex(0xFFAAAA), 0); // 设置红色背景
​
    /* 在第一个页面上添加标签 */
    lv_obj_t* label_page1 = lv_label_create(page1);
    lv_label_set_text(label_page1, "This is Page 1");
    lv_obj_align(label_page1, LV_ALIGN_TOP_MID, 0, 10);
    
    /* 创建第二个页面,但初始时隐藏 */
    lv_obj_t* page2 = lv_obj_create(lv_scr_act());
    lv_obj_set_size(page2, 200, 200);
    //lv_obj_set_size(page1, lv_pct(100), lv_pct(100));
    lv_obj_center(page2);
    lv_obj_add_flag(page2, LV_OBJ_FLAG_HIDDEN);
    lv_obj_set_style_bg_color(page2, lv_color_hex(0xAAAAFF), 0); // 设置蓝色背景
    
    /* 在第二个页面上添加标签 */
    lv_obj_t* label_page2 = lv_label_create(page2);
    lv_label_set_text(label_page2, "This is Page 2");
    lv_obj_align(label_page2, LV_ALIGN_TOP_MID, 0, 10);
    
    /* 在第一个页面上添加按钮,用于跳转到第二个页面 */
    lv_obj_t* btn1 = lv_btn_create(page1);
    lv_obj_set_size(btn1, 100, 50);
    lv_obj_center(btn1);
    lv_obj_add_event_cb(btn1, page_switch_event_handler, LV_EVENT_CLICKED, page2);
    
    lv_obj_t* label1 = lv_label_create(btn1);
    lv_label_set_text(label1, "Go to Page 2");
    
    /* 在第二个页面上添加按钮,用于返回到第一个页面 */
    lv_obj_t* btn2 = lv_btn_create(page2);
    lv_obj_set_size(btn2, 100, 50);
    lv_obj_center(btn2);
    lv_obj_add_event_cb(btn2, page_switch_event_handler, LV_EVENT_CLICKED, page1);
    
    lv_obj_t* label2 = lv_label_create(btn2);
    lv_label_set_text(label2, "Back to Page 1");
}

15. 图片部件 lv_img

LV_IMG_DECLARE(image_kedaya);
​
static void set_angle(void* img, int32_t v)
{
    lv_img_set_angle(img, v);
}
​
static void set_zoom(void* img, int32_t v)
{
    lv_img_set_zoom(img, v);
}
​
void lv_example_flex_2(void)
{
    lv_obj_t* img = lv_img_create(lv_scr_act());
    lv_img_set_src(img,&image_kedaya);
    lv_obj_set_size(img, LV_SIZE_CONTENT, LV_SIZE_CONTENT);
    lv_img_set_zoom(img,128);
    lv_obj_center(img);
​
    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_var(&a, img);
    lv_anim_set_exec_cb(&a, set_angle);
    lv_anim_set_values(&a, 0, 3600);
    lv_anim_set_time(&a, 5000);
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
    lv_anim_start(&a);
    
    lv_anim_set_exec_cb(&a, set_zoom);
    lv_anim_set_values(&a, 128, 256);
    lv_anim_set_playback_time(&a, 3000);
    lv_anim_start(&a);
}

  • 60
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

7yewh

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

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

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

打赏作者

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

抵扣说明:

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

余额充值