发布于:,更新于:

《方案》通用的弹窗模块

拼图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()      ///开始弹