| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-12-22 | yang | 初次建立 | ===== 实验二十四:lv_list列表 ===== ==== 一、列表 ==== 列表是由一个背景页面和其上的按钮组成的。按钮包含一个可选的字符(图标)和一个文本标签。当列表内按钮总高度大于自身高度时,列表可以上下滚动。 列表与页面具有相同的部分 * LV_LIST_PART_BG * LV_LIST_PART_SCRL * LV_LIST_PART_SCRLBAR * LV_LIST_PART_EDGE_FLASH 列表上的按钮被视为普通按钮,它们只有一个主要部分称为 **LV_BTN_PART_MAIN** 。 ==== 二、添加按钮 ==== 使用 **lv_obj_t * list1 = lv_list_create(lv_scr_act(), NULL)** 创建列表后,可以使用 **lv_list_add_btn(list, &icon_img, "Text")** 或使用** lv_list_add_btn(list, SYMBOL_EDIT, "Edit text")** 添加新的列表元素(按钮)。如果不想添加图像,则使用**NULL**作为图像参数。该函数返回指向创建的按钮的指针,以允许进行进一步的配置,例如设置尺寸等。 根据对象的宽度,将按钮的宽度设置为最大。按钮的高度会根据内容自动调整。(**内容高度 + padding_top + padding_bottom**)。 列表默认使用 **LV_LABEL_LONG_SROLL_CIRC** 长模式创建标签,当标签内容宽度大于按钮宽度时,标签内容将自动循环滚动。 函数 **lv_list_get_btn_label(list_btn)** 和 **lv_list_get_btn_img(list_btn)** 可以用来获取列表按钮的标签和图像指针。若想获取标签文本可以直接使用 **lv_list_get_btn_text(list_btn)** 。 {{ :icore4t:icore4t_rtt_lvgl_24_1.png?direct |}} void lv_gui_run(void){ lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */ lv_obj_t * list1 = lv_list_create(lv_scr_act(), NULL); /* 创建列表 */ lv_obj_set_size(list1, 100, 200); /* 设置尺寸 */ lv_obj_align(list1, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */ lv_obj_set_style_local_text_font(list1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &hei_16);/* 设置字体 */ lv_obj_t * list_btn; /* 向列表添加按钮 */ list_btn = lv_list_add_btn(list1, "\uF008", "电影"); /* 设置内容为图标加文字 */ list_btn = lv_list_add_btn(list1, "\uF001", "音乐"); list_btn = lv_list_add_btn(list1, "\uF003", "邮箱"); list_btn = lv_list_add_btn(list1, "\uF03E", "图片"); list_btn = lv_list_add_btn(list1, "\uF013", "设置"); list_btn = lv_list_add_btn(list1, "\uF015", "菜单"); } ==== 三、删除按钮 ==== 要删除列表元素,只需使用函数 **lv_obj_del(btn)** 即可,参数为函数 **lv_list_add_btn()** 返回的按钮指针。使用 **lv_list_clean(list)** 可以清除列表(删除所有按钮)。 ==== 四、导航与焦点 ==== 用户可以使用 **lv_list_up(list)** 和 **lv_list_down(list)** 在列表中手动导航。使用函数 **lv_list_focus(btn, LV_ANIM_ON/OFF)** 可以直接将焦点放在按钮上。列表上滑、下滑和焦点移动的动画时间可以通过 **lv_list_set_anim_time(list, anim_time)** 来设置,参数 **anim_time** 为零代表不是动画。 ==== 五、布局 ==== 默认情况下,列表中按钮是垂直布局的。要想获取水平布局的列表,何以使用函数 **lv_list_set_layout(list, LV_LAYOUT_ROW_MID)** 。当列表到达最高或最低位置时,可以显示类似圆圈的效果。使用 **lv_list_set_edge_flash(list, true)** 可以启用此功能。 {{ :icore4t:icore4t_rtt_lvgl_24_2.png?direct |}} void lv_gui_run(void){ lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */ lv_obj_t * list1 = lv_list_create(lv_scr_act(), NULL); /* 创建列表 */ lv_obj_set_size(list1, 100, 200); /* 设置尺寸 */ lv_obj_align(list1, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */ lv_obj_set_style_local_text_font(list1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &hei_16); void lv_gui_run(void){ lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */ lv_obj_t * list1 = lv_list_create(lv_scr_act(), NULL); /* 创建列表 */ lv_obj_set_size(list1, 100, 200); /* 设置尺寸 */ lv_obj_align(list1, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */ lv_obj_set_style_local_text_font(list1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &hei_16);/* 设置字体 */ lv_list_set_layout(list1, LV_LAYOUT_ROW_MID); /* 设置布局 */ lv_obj_t * list_btn; /* 向列表添加按钮 */ lv_obj_set_size(list_btn, 100, 100); /* 设置尺寸 */ list_btn = lv_list_add_btn(list1, "\uF008", "电影"); /* 设置内容为图标加文字 */ list_btn = lv_list_add_btn(list1, "\uF001", "音乐"); list_btn = lv_list_add_btn(list1, "\uF003", "邮箱"); list_btn = lv_list_add_btn(list1, "\uF03E", "图片"); list_btn = lv_list_add_btn(list1, "\uF013", "设置"); list_btn = lv_list_add_btn(list1, "\uF015", "菜单"); } ==== 六、滚动传递 ==== 如果列表是在其他可滚动元素(如 Page)上创建的,并且列表无法进一步滚动,则滚动可以传播到父级。这样,滚动将在父级上继续。使用函数 **lv_list_set_scroll_propagation(list, true)** 来使能滚动传递。 ==== 七、事件 ==== 列表支持通用事件。所选按钮处于 **LV_BTN_STATE_PR/TG_PR** 状态。手动选择按钮使用 **lv_list_set_btn_selected(list, btn)** 。当列表失去选中后再次被选中时,它将恢复最后选中的按钮。 {{ :icore4t:icore4t_rtt_lvgl_24_3.gif?direct |}} lv_obj_t * label; static void event_handler(lv_obj_t * obj, lv_event_t event) /* 回调函数 */ { if(event == LV_EVENT_CLICKED) { /* 获取对象文本 */ lv_label_set_text_fmt(label, "Clicked: %s\n", lv_list_get_btn_text(obj)); } } void lv_gui_run(void){ lvgl2rtt_init("lcd"); /* 初始化lvgl2rtt */ label = lv_label_create(lv_scr_act(), NULL); lv_obj_set_pos(label, 20, 20); /* 设置显示坐标 */ lv_label_set_text(label, "no click"); lv_obj_t * list1 = lv_list_create(lv_scr_act(), NULL); /* 创建列表 */ lv_obj_set_size(list1, 160, 200); /* 设置尺寸 */ lv_obj_align(list1, NULL, LV_ALIGN_CENTER, 0, 0); /* 设置位置 */ lv_obj_t * list_btn; /* 向列表添加按钮 */ list_btn = lv_list_add_btn(list1, LV_SYMBOL_FILE, "New"); /* 设置内容为图标加文字 */ lv_obj_set_event_cb(list_btn, event_handler); /* 设置按钮回调函数 */ list_btn = lv_list_add_btn(list1, LV_SYMBOL_DIRECTORY, "Open"); lv_obj_set_event_cb(list_btn, event_handler); list_btn = lv_list_add_btn(list1, LV_SYMBOL_CLOSE, "Delete"); lv_obj_set_event_cb(list_btn, event_handler); list_btn = lv_list_add_btn(list1, LV_SYMBOL_EDIT, "Edit"); lv_obj_set_event_cb(list_btn, event_handler); list_btn = lv_list_add_btn(list1, LV_SYMBOL_SAVE, "Save"); lv_obj_set_event_cb(list_btn, event_handler); list_btn = lv_list_add_btn(list1, LV_SYMBOL_BELL, "Notify"); lv_obj_set_event_cb(list_btn, event_handler); list_btn = lv_list_add_btn(list1, LV_SYMBOL_BATTERY_FULL, "Battery"); lv_obj_set_event_cb(list_btn, event_handler); }