威三电子  

               威三电子

使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第十九讲)

2026-08-06 13:34:52

浏览:

为列表元素添加事件的原理就是利用返回值的对象值设置每行的事件,以下是我利用列表元素以及按键制作的样式,点击按键删除列表元素: 通过添加按键行为以及回调函数,实现


为列表元素添加事件的原理就是利用返回值的对象值设置每行的事件,以下是我利用列表元素以及按键制作的样式,点击按键删除列表元素:

 

通过添加按键行为以及回调函数,实现删除文件和列表元素的功能,以下是实现代码:

void create_file_list_with_sizes(lv_obj_t *parent, const char *path)

{

    DIR dir;

    FILINFO fno;

    FRESULT res;

    // 创建一个新的局部列表对象

    lv_obj_t *list = lv_list_create(parent);  // 在父容器中创建列表对象

    // 设置列表的宽度和高度,可以根据需要调整

    lv_obj_set_size(list, 400, 340);  // 宽380,高240

    lv_obj_add_flag(list, LV_OBJ_FLAG_SCROLLABLE);  // 启用滚动

    lv_obj_align(list, LV_ALIGN_CENTER, 0, 0);  // 将列表对齐到父容器的中

    // 设置列表的背景颜色为黑色

    static lv_style_t list_style;

    lv_style_init(&list_style);

    lv_style_set_bg_color(&list_style, lv_color_hex(0x000000));  // 背景为黑色

    lv_style_set_bg_opa(&list_style, LV_OPA_COVER);  // 完全覆盖

    lv_style_set_border_width(&list_style, 0);  // 设置边框宽度为0,隐藏边框

    lv_obj_add_style(list, &list_style, 0);  // 将样式应用到列表对象

    // 使列表项的字体不随列表滚动

    lv_obj_add_flag(list, LV_OBJ_FLAG_SCROLLABLE);  // 启用滚动,但不影响文本

    res = f_opendir(&dir, path);  // 打开目录

    if (res != FR_OK) {

        printf('Failed to open directory\n');

        return;

    }

    //lv_list_clean_custom(list);

    while (1)

    {

        res = f_readdir(&dir, &fno);  // 读取目录项

        if (res != FR_OK || fno.fname[0] == 0) {

            break;  // 读取完毕

        }

        if (fno.fattrib & AM_DIR) {

            continue;  // 如果是目录,跳过

        }

        // 获取文件大小

        DWORD file_size = fno.fsize;

        // 转换文件大小为适当的单位

        char size_str[32];

        if (file_size < 1024) {

            snprintf(size_str, sizeof(size_str), '%lu bytes', file_size);

        } else if (file_size < 1024 * 1024) {

            snprintf(size_str, sizeof(size_str), '%.2f KB', file_size / 1024.0);

        } else if (file_size < 1024 * 1024 * 1024) {

            snprintf(size_str, sizeof(size_str), '%.2f MB', file_size / (1024.0 * 1024));

        } else {

            snprintf(size_str, sizeof(size_str), '%.2f GB', file_size / (1024.0 * 1024 * 1024));

        }

        // 设置按钮的自定义样式

        static lv_style_t btn_style;

        lv_style_init(&btn_style);

        lv_style_set_bg_color(&btn_style, lv_color_hex(0x000000));  // 背景为黑色

        lv_style_set_text_color(&btn_style, lv_color_hex(0xFFFFFF));  // 文字为白色

        // 设置按钮的自定义样式

        static lv_style_t del_btn_style;

        lv_style_init(&del_btn_style);

        lv_style_set_bg_color(&del_btn_style, lv_color_hex(0xFF0000));  // 背景为红色

        lv_style_set_text_color(&del_btn_style, lv_color_hex(0xFFFFFF));  // 文字为白色

        // 创建一个带有文件名和大小的按钮项

        char btn_label[64];

        snprintf(btn_label, sizeof(btn_label), '%s - %s', fno.fname, size_str);

        // 动态添加按钮项到列表

        lv_obj_t *btn = lv_list_add_btn(list, LV_SYMBOL_FILE, btn_label);

        lv_obj_add_style(btn, &btn_style, 0);  // 添加样式

        // 禁止按钮文本滚动

        lv_obj_clear_flag(btn, LV_OBJ_FLAG_SCROLLABLE);  // 清除滚动标志,禁止文本滚动

        // 禁止按钮文本横向移动,文本居中

        lv_obj_set_style_text_align(btn, LV_ALIGN_CENTER, 0);  // 文本水平居中

        lv_obj_set_style_text_align(btn, LV_ALIGN_TOP_MID, 0);  // 文本垂直居中(可根据需求调整为垂直居上、居下等)

        // 创建删除按钮并设置位置

        lv_obj_t *del_btn = lv_btn_create(btn);  // 在文件按钮旁创建一个删除按钮

        lv_obj_set_size(del_btn, 50, 30);  // 设置删除按钮大小

        lv_obj_align(del_btn, LV_ALIGN_RIGHT_MID, 10, 0);  // 将删除按钮对齐到文件按钮右侧

        lv_obj_add_style(del_btn, &del_btn_style, 0);  // 添加样式

        // 删除按钮文本

        lv_obj_t *del_label = lv_label_create(del_btn);

        lv_label_set_text(del_label, LV_SYMBOL_CLOSE);  // 使用系统符号'X'

        lv_obj_set_style_text_color(del_label, lv_color_hex(0xFFFFFF), 0);  // 设置字体为白色

        // 为删除按钮设置事件回调

        lv_obj_add_event_cb(del_btn, delete_file_cb, LV_EVENT_CLICKED, (void *)strdup(fno.fname));  // 使用 strdup 来确保文件名在回调中是有效的

    }

    f_closedir(&dir);  // 关闭目录

}

下一期将讲解其他控件的基本使用。

本文章由威三学院出品

对课程感兴趣可以私信联系

0
使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第十九讲)
为列表元素添加事件的原理就是利用返回值的对象值设置每行的事件,以下是我利用列表元素以及按键制作的样式,点击按键删除列表元素: 通过添加按键行为以及回调函数,实现
长按图片保存/分享

北京威三电子科技有限公司

突破技术壁垒,芯创智联领航未来

 


北京威三电子科技有限公司 版权所有
京ICP备2026012969号
 

热线:

159-2199-9232

 

图片展示

淘宝店铺:

威三科教

地址:

北京市延庆区辰龙国际6号楼406室

微信公众号:

北京威三电子科技有限公司 

热线:159-2199-9232

淘宝店铺:威三科教

地址:北京市延庆区辰龙国际6号楼406


微信公众号

图片展示
北京威三电子科技有限公司 版权所有| 京ICP备2026012969号
微信公众号
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
客服中心
热线电话
15921999232
上班时间
周一到周五
二维码
扫码关注
添加微信好友,详细了解产品
使用企业微信
“扫一扫”加入群聊
复制成功!
添加微信好友,详细了解产品
我知道了