如何实现lvgl浮动窗口

lvgl在不干扰普通窗口的条件下
从上下左右的边界出的四个方向拉出新窗口
效果为手表或者手机的下拉菜单
名称为浮动窗口
有怎样的做法可以完成这个功能

以下答案引用自GPT-3大模型,请合理使用:

实例

通过lv_conf.h配置文件中定义的LV_ANTE_FLOAT_ENABLE可以使用一个浮动窗口。

如果想要实现拉出四个方向的新窗口,我们可以创建两个独立的浮动窗口,一个用于快速添加按钮,另一个用于设置窗口样式。

以下是一个示例:
```c
/***************************************************************
 *  初始化浮动窗口
 **************************************************************/
void init_float_win()
{
    //创建主浮动窗口
    lv_obj_t *main_win = lv_win_create(NULL,NULL);  
    lv_win_set_style(main_win, LV_WIN_STYLE_CONTENT_SCRL, &style_content_scrl_transp);
    lv_obj_set_size(main_win, 300, 200);
    lv_obj_set_pos(main_win, 0, 0);
    lv_win_add_btn(main_win, LV_BTN_POS_RIGHT, NULL);
    lv_win_set_btn_size(main_win, LV_DPI / 4);
    lv_obj_set_hidden(main_win, true);

    //创建子浮动窗口并添加按钮
    lv_obj_t *sub_win = lv_win_create(NULL,NULL);  
    lv_win_set_style(sub_win, LV_WIN_STYLE_CONTENT_SCRL, &style_content_scrl_transp);
    lv_obj_set_size(sub_win, 150, 150);
    lv_obj_set_pos(sub_win, 0, 0);
    lv_win_add_btn(sub_win, LV_BTN_POS_RIGHT, NULL);
    lv_win_set_btn_size(sub_win, LV_DPI / 4);
    lv_obj_set_hidden(sub_win, true);
    //添加按钮列表
    lv_obj_t * btn_list = lv_list_create(sub_win , NULL);
    lv_obj_align(btn_list, NULL, LV_ALIGN_CENTER, 0, 0);
    lv_obj_t * btn1 = lv_list_add(btn_list ,LV_SYMBOL_OK, "Btn1", NULL);
    lv_obj_t * btn2 = lv_list_add(btn_list ,symbol_bookmark, "Btn2", NULL);
    lv_obj_t * btn3 = lv_list_add(btn_list ,LV_SYMBOL_FILE, "Btn3", NULL);
    lv_obj_t * btn4 = lv_list_add(btn_list ,LV_SYMBOL_FILE, "Btn4", NULL);
    lv_list_set_style(btn_list,LV_LIST_STYLE_BG,&window_style_bg);
    lv_list_set_style(btn_list,LV_LIST_STYLE_SCRL,&style_content_scrl_transp);  
    lv_list_set_style(btn_list,LV_LIST_STYLE_BTN_REL,&style_btn_rel);
    lv_list_set_style(btn_list,LV_LIST_STYLE_BTN_PR,&style_btn_pr);
    
    //给两个浮动

如果我的回答解决了您的问题,请采纳我的回答

该回答引用ChatGPT

1、导入lvgl库并初始化

#include "lvgl/lvgl.h"

int main(void) {
    lv_init();  // 初始化lvgl
    lv_disp_drv_t disp_drv; // 定义显示驱动
    lv_disp_drv_init(&disp_drv); // 初始化显示驱动
    // 设置显示驱动的分辨率和回调函数
    disp_drv.hor_res = 480;
    disp_drv.ver_res = 320;
    disp_drv.flush_cb = your_flush_cb; // 用您的刷新函数替换 your_flush_cb
    lv_disp_drv_register(&disp_drv); // 注册显示驱动
    // ...
}

2、创建一个基本窗口并添加一个滑动对象

// 创建一个基本窗口
lv_obj_t *base_win = lv_win_create(lv_scr_act(), NULL);
// 设置基本窗口的大小和位置
lv_obj_set_size(base_win, lv_obj_get_width(lv_scr_act()), lv_obj_get_height(lv_scr_act()));
lv_obj_align(base_win, NULL, LV_ALIGN_CENTER, 0, 0);

// 在基本窗口中添加一个滑动对象
lv_obj_t *slider = lv_slider_create(base_win, NULL);
// 设置滑动对象的大小和位置
lv_obj_set_size(slider, 200, 20);
lv_obj_align(slider, NULL, LV_ALIGN_CENTER, 0, 0);


3、创建浮动窗口并将其附加到基本窗口

// 创建浮动窗口
lv_obj_t *float_win = lv_win_create(lv_scr_act(), NULL);
// 设置浮动窗口的大小和位置
lv_obj_set_size(float_win, lv_obj_get_width(lv_scr_act()), lv_obj_get_height(lv_scr_act()) / 2);
lv_obj_align(float_win, base_win, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);

// 设置浮动窗口的标题和边框
lv_obj_set_style_local_value_str(float_win, LV_WIN_PART_BG, LV_STATE_DEFAULT, "My float window");
lv_obj_set_style_local_border_width(float_win, LV_WIN_PART_BG, LV_STATE_DEFAULT, 0);

// 将浮动窗口的拖动栏从左边移动到右边
lv_obj_t *header = lv_win_get_header(float_win);
lv_obj_set_style_local_pad_left(header, LV_WIN_PART_LEFT, LV_STATE_DEFAULT, lv_obj_get_width(float_win) - lv_obj_get_width(header));

// 向浮动窗口中添加一些内容
lv_obj_t *label = lv_label_create(float_win, NULL);
lv_label_set_text(label, "Hello, world!");


4、设置基本窗口的事件回调函数,以在滑动对象被拖动时显示/隐藏浮动窗口

// 定义事件回调函数
static void slider_event_cb(lv_obj_t *slider, lv_event_t event) {
    if (event == LV_EVENT_VALUE_CHANGED) {
        // 获取滑动对象的值(0~100)
        int16_t value = lv_slider_get_value(slider);
        if (value > 75) {
            lv_obj_set_hidden(float


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^