弹窗
弹窗是建立在sys(lv_layer_sys())层的一组页面,由popup_fwk进行管理,与app_fwk是相互独立的。
可配置优先级
可配置生命周期
可配置不同的背景色
可配置不同的透明度
注册一个弹窗
注册一个内置弹窗
POPUP_REGISTER(id, priority, time, ptr_size)
id : 弹窗名称
priority : 弹窗优先级,数字越大,优先级越高
time : 弹窗自动退出时间
ptr_size : 弹窗全局内存大小,该内存由框架申请释放,页面可以直接使用
注册一个动态弹窗
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 : 弹窗挂起消息,它不会创建弹窗消息
注册流程说明
注册弹窗
运行弹窗使用下面接口
popup_run(const char *id, void *user_data)
id : 弹窗名称
user_data : 自定义数据,可以通过"POPUP_GET_NODE_PARAM"接口获取,需注意该接口仅在"msg_handle"中有效
示例,注册一个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