弹窗

弹窗是建立在sys(lv_layer_sys())层的一组页面,由popup_fwk进行管理,与app_fwk是相互独立的。

  • 可配置优先级

  • 可配置生命周期

  • 可配置不同的背景色

  • 可配置不同的透明度

注册一个弹窗

  1. 注册一个内置弹窗

    POPUP_REGISTER(id, priority, time, ptr_size)

    id                  : 弹窗名称
    priority            : 弹窗优先级,数字越大,优先级越高
    time                : 弹窗自动退出时间
    ptr_size            : 弹窗全局内存大小,该内存由框架申请释放,页面可以直接使用
  1. 注册一个动态弹窗

    1)动态弹窗重新定义POPUP_REGISTER(id, priority, time, ptr_size)
    2)弹窗类型为POPUP_DYNAMIC
    
    POPUP_REGISTER(id, priority, time, ptr_size)

注册框架消息

    POPUP_MSG_HANDLER 中popup_msg_t 类型如下
    
    POPUP_MSG_ONSTART    : 弹窗启动消息,可以在该消息中做一些数据初始化,以及背景页面创建,此消息只接收一次
    POPUP_MSG_ONRESUME   : 弹窗激活消息,只有弹窗被设置puase状态才可以被使用
    POPUP_MSG_ONPAUSE    : 弹窗暂停消息,只有弹窗启动或者激活或者重新刷新才可以被调用
    POPUP_MSG_ONREFR     : 弹窗刷新消息,收到重复的弹窗消息会被调用
    POPUP_MSG_ONSTOP     : 弹窗销毁消息,在该事件中释放用户申请的内存,以及删除创建的task,建立在当前screen上面的obj不用主动删除,
                           框架在发送完该消息后,会直接把当前屏以及上面的控件全部删除
    POPUP_MSG_ONDESTROY  : 弹窗摧毁消息,它不会立即执行,而是在应用于列表嵌套时设置,并在退出列表循环后执行
    POPUP_MSG_ONSUSPEND  : 弹窗挂起消息,它不会创建弹窗消息

注册流程说明

  1. 注册弹窗

  2. 运行弹窗使用下面接口

    popup_run(const char *id, void *user_data)
    id                   : 弹窗名称
    user_data            : 自定义数据,可以通过"POPUP_GET_NODE_PARAM"接口获取,需注意该接口仅在"msg_handle"中有效
  1. 示例,注册一个remind弹窗

    static void on_start(void)
    {   
        /* 获取框架申请的内存,全局指针所对应的结构体大小一定要和申请的大小一致                                            */
        p_alarm = (app_alarm_gui_t *)APP_GET_PAGE_MEM_PTR;
        RT_ASSERT(p_alarm);

        /* 在当前screen上面建立背景页面,包括基础数据读取以及页面标题栏                                                    */
        p_alarm->bg_page = app_alarm_gui_init(lv_scr_act());

        /* 创建一个刷新timer,定时查询状态,亦可使用数据订阅                                                                */
        p_alarm->timer = lv_timer_create(alarm_task_cb, 1000, (void *)0);

        /* 将timer设置pause状态,因为初始页面不需要刷新,暂时关闭timer                                                      */
        lv_timer_pause(p_alarm->timer);
    }
    static void on_start(void *param)
    {
        /* 获取框架申请的内存,全局指针所对应的结构体大小一定要和申请的大小一致                                            */
        p_alarm = (popup_alarm_t *) POPUP_GET_NODE_MEM_PTR;
        RT_ASSERT(p_alarm);

        /* 获取背景对象,并以此对象作为父控件                                                                              */
        p_alarm->bg_page = POPUP_GET_NODE_PARENT;
        /* 获取自定义数据,即运行弹窗传入的数据                                                                            */
        p_alarm->alarm = (alarm_node_t *)POPUP_GET_NODE_PARAM;
        
        lv_ext_set_local_bg_opa(p_alarm->bg_page, LV_OPA_100, LV_PART_MAIN);
        lv_ext_set_local_bg(p_alarm->bg_page, LV_COLOR_BLACK, LV_OPA_COVER);
        app_screen_lock_enable(false);

        /* 构建页面的所有内容创建完成                                                                                     */
        popup_alarm_page(p_alarm->bg_page);
    }

    static void on_refr(void *param)
    {
        if (NULL != p_alarm->bg_page)
        {
            /* 获取自定义数据,即运行弹窗传入的数据                                                                        */
            p_alarm->alarm = (alarm_node_t *)POPUP_GET_NODE_PARAM;
            if (p_alarm->gif_anim)
            {
                lvsf_gif_anim_pause(p_alarm->gif_anim);
                lvsf_gif_anim_deinit(p_alarm->gif_anim);
                p_alarm->gif_anim = NULL;
            }
            /* 清除当前页面所有子对象,重新构建页面的所有内容创建完成                                                     */
            lv_obj_clean(p_alarm->bg_page);
            popup_alarm_page(p_alarm->bg_page);
        }
    }

    static void on_stop(void *param)
    {
        app_screen_lock_enable(true);

        /* 页面即将销毁,先停掉gif动画                                                                                     */
        popup_alarm_delete();

        /* 将全局指针变量置空,防止其他地方使用时非空判断出现异常,该指针指向的内存会在框架执行完stop 消息后释放           */
        p_alarm = NULL;
    }
    /* 注册alarm弹窗,并使用框架申请的大小为'sizeof(popup_alarm_t)' 的内存,优先级为5,10s后弹窗自动退出                  */
    POPUP_REGISTER("alarm", 5, 10000, sizeof(popup_alarm_t)); //build for simulator