《方案》通用的弹窗模块
拼图10103D-弹框模块
一、需求分析
拼图走廊会展示各种弹框。
各弹框之间没有管道进行交流,导致弹框的优先级、弹出时机、释放时刻这些信息都是离散的,
各模块间没法通知和协调 ;
现有弹框包括:
- 每日任务列表框、每日任务待玩提示框
- 广告任务列表、广告任务提示弹框、
- 故事书活动弹框、故事书书架弹框、故事书书页弹框
弹框又分为点击弹/自动弹,2*7=14个弹框,每个行为、优先级、发送的事件都不一样;
在没有弹框管理器的情况下,逻辑特别复杂
二、开发需求
场景:
1.父节点创建时,窗口被addChild到父节点上
2.当几个窗口冲突时,根据优先级选择一个弹;
3.弹出的窗口被关闭时,自动弹出下一窗口,直到被弹完
4.以前注册的窗口不想弹了,可以clear
5.父节点释放时,窗口释放
抽象该模块的功能:
- 可以创建窗口
- 可以定义窗口的弹出队列
- 可以指定冲突窗口的优先级
- 创建和释放依赖于父节点
- 开发者只要创建窗口,指定冲突窗口优先级、定义弹出队列,无需告知模块窗口何时关闭
那么模块就应该能:
当窗口冲突时,根据优先级选择一个弹;
自动监测窗口的关闭,调用下一个窗口的创建;
三、实现
类Popper:Node
___
+create(root):Popper*
+addWindow(groupID,priority,name,function<void()> onPop):void
+waitPop():void
+tryPop():void
+clear():void
#init(root):bool
#next():void
#pop():void
___
三、示例
_popper->clear() ///清空已注册但还未弹窗口
_popper->addWindow(1,1, []()->Ref*{return window;}) ///注册1组,优先级1的弹框
_popper->addWindow(1,2, []()->Ref*{return window;}) ///注册1组,优先级2的弹框
_popper->addWindow(2,1, []()->Ref*{return window;}) ///注册2组,优先级1的弹框
_popper->addWindow(2,2, []()->Ref*{return window;}) ///注册2组,优先级2的弹框
_popper->addWindow(2,3, []()->Ref*{return window;}) ///注册2组,优先级3的弹框
_popper->pop() ///开始弹
....
_popper->clear() ///清空已注册但还未弹窗口
_popper->addWindow(1,1, []()->Ref*{return window;}) ///注册1组,优先级1的弹框
_popper->pop() ///开始弹