自己动手写框架的话,UI管理器是最基础的一部分;

打开界底层是addChild打开的;
 
 
新建一个UIManager
  1. export class UIManager {
  2. private mainContent: Laya.Sprite;
  3. private scene: GameScence;
  4. private uiList:any[];
  5.  
  6. constructor() {
  7. this.mainContent = new Laya.Sprite();
  8.  
  9. this.uiList = [];
  10. }
  11. }

  mainContent 为默认添加到的层级,

GameScence 为UI管理器默认场景
uiList放所有加载进来的场景
第一步实现 打开界面 openWindow
 
  1. public openWindow(clazz: any, param?: { data?: any }) {
  2. let view = new clazz()
  3. this.setView(clazz, view);
  4. this.mainContent.addChild(view);
  5. }

  

  初始化传进来的场景类;
存进字典
添加到显示层
 
下面是缓存的过程 setView
  1. private setView(clazz: any, view:Laya.Node):void{
  2. let v: Laya.Node = this.getView(clazz);
  3. if(!v){
  4. let uiData = {clazz: clazz, view: view};
  5. this.uiList.push(uiData);
  6. }
  7. }

  首先判断本地缓存有没有,有的话 不处理,没得话,创建,push到数组中

  1. private getView(clazz: any):Laya.Node{
  2. for(let i:number =0 ; i<this.uiList.length ; i++){
  3. let uiData = this.uiList[i];
  4. if(uiData.clazz == clazz){
  5. return uiData.view;
  6. }
  7. }
  8. }

  

根据clazz名字获取本地缓存的场景类
 
 
下面是关闭场景,

  1. public closeWindow(clazz: any): void {
  2. let v = this.getView(clazz);
  3. let index: number = this.getViewIndex(clazz);
  4. if(v){
  5. v.removeSelf();
  6. this.uiList.splice(index,1);
  7. }
  8. }

  

  1. private getViewIndex(clazz: any):number{
  2. for(let i:number =0 ; i<this.uiList.length ; i++){
  3. let uiData = this.uiList[i];
  4. if(uiData.clazz == clazz){
  5. return i;
  6. }
  7. }
  8. return -1;
  9. }

  

这就是最简单的打开和关闭;
 
还要有一个初始化UIManager的方法, 设置管理器的初始化场景
  1. public setGameScene(gameScene: GameScence): void {
  2. this.scene = gameScene;
  3. if (this.scene) {
  4. this.scene.parent.addChild(this.mainContent);
  5. }
  6. }

  

  1. export let ui: UIManager = new UIManager();
  2. window["ui"] = ui;

  

有时候通过open方法,或者UiManager打开一个场景后,场景里面的元素还不能正常获取;解决办法是
修改Node Sprite的原型, 那么,所有的场景被加载时,都会执行这些方法,
 
  1. import { LogUtil } from "../util/LogUtil";
  2.  
  3. /**
  4. * 为基类定义若干方法
  5. */
  6. export class PatchManager{}
  7. (function(){
  8. let _proto:any;
  9.  
  10. _proto = Laya.Scene.prototype;
  11. _proto.createView = function(view:Object){
  12. if (view && !this._viewCreated) {
  13. this._viewCreated = true;
  14. Laya.SceneUtils.createByData(this, view);
  15. }
  16.  
  17. this.onInit();
  18. this.onShow();
  19.  
  20. Laya.timer.frameLoop(1, this, ()=>{
  21. // console.info(this);
  22. this.onUpdate();
  23. });
  24. }
  25.  
  26. /********************************************************************************
  27. * Node
  28. ********************************************************************************/
  29. _proto = Laya.Node.prototype;
  30.  
  31. _proto.onInit = function(){
  32. }
  33.  
  34. _proto.onShow = function(){
  35. }
  36.  
  37. _proto.onUpdate = function(){
  38. }
  39.  
  40. _proto.onDisable=function(){
  41. this.onHide();
  42. }
  43.  
  44. _proto.onHide = function(){
  45. }
  46. })();

  

在场景中 直接写  onShow () {}   界面被加载完成后, 会自动调用这个方法、。
搞定。

LayaBox进阶之UI管理器的更多相关文章

  1. 游戏开发之UI管理器(跨引擎)

    使用UI管理器的目的 使用单场景与zindex结合的方式管理UI. 能够隐藏底层UI达到优化效果. 很好的组织和管理UI. 跨引擎使用. 管理器分类 根据以往经验我开发了三种类型的管理器,队列管理器, ...

  2. Python进阶(上下文管理器与with语句)

    /*上下文管理器必须有__enter__和__exit__方法*/ class MyResource: def __enter__(self): print('链接资源') return self / ...

  3. Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)

    接下来,我们继续分析UIlib.h文件中余下的文件,当然部分文件可能顺序错开分析,这样便于从简单到复杂的整个过程的里面,而避免一开始就出现各种不理解的地方. 1. UIManager.h:UI管理器, ...

  4. 第1组UI组件:布局管理器

    1 布局管理的来源 为了让UI在不同的手机屏幕上都能运行良好----不同手机屏幕的分辨率/尺寸并不完全相同,如果让程序手动控制每个组件的大小.位置,会给编程带来巨大的麻烦.为了解决这个问题.andro ...

  5. Java可视化编程,基于布局管理器的UI设计

    在<事件驱动模型>讲述了如何将用户与功能实现代码联系到一起.怎么样便于用户理解和符合用户的使用习惯? 本篇还是就此问题作分析,站在用户角度上分析UI各组件倒底该如何设计呈现. 优秀的UI会 ...

  6. Swing-布局管理器应用--WIN7上计算器的UI实现

    学完了Swing布局管理器,为了加深理解我决定做一些UI的实现,那就从WIN7上的计算器开始吧!首先,我们来研究一下它的UI.该计算器的UI主要有3个,分别是标准型.科学型和程序员型,如下图所示.   ...

  7. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  8. [cocos2dx笔记010]用于UI的事件管理器

    cocos2dx有一个编辑器:cocostudio.眼下来说,已经是比較好用了.仅仅要载入导出的资源.就能够用上了.省去手动搭建面的麻烦. 可是.非常多须要事件的地方,操作比較麻烦,所以这里提供一个事 ...

  9. 基于Web的Kafka管理器工具之Kafka-manager安装之后第一次进入web UI的初步配置(图文详解)

    前期博客 基于Web的Kafka管理器工具之Kafka-manager的编译部署详细安装 (支持kafka0.8.0.9和0.10以后版本)(图文详解) 基于Web的Kafka管理器工具之Kafka- ...

随机推荐

  1. linux 安装和卸载软件

    安装: apt-get install cups-pdf 卸载:apt -get remove cups

  2. wxpython wx.windows的API

    wx.Window is the base class for all windows and represents any visible object on screen. All control ...

  3. 有关在新版mac上 git 环境变量的配置问题

    前段时间买的新版 mpb ,各种环境什么都没有配置,想着在网上边搜边摸索着将各种开发工具逐步配置齐全,各种问题不断出现,不知道是不是新版的原因不兼容. 其中 git 的配置尤为奇怪.在git官网上直接 ...

  4. 【Leetcode】【Easy】Remove Duplicates from Sorted List

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  5. 开发时复制aspx网页的方法

    简单的copy /paste    *.aspx网页,所使用的是同一个CodeBehind  ,这往往不是我们所想要的!!!我们一般都希望使这两个网页具有各自的  *.cs文件.步骤:①新建一个Web ...

  6. March 31 2017 Week 13 Friday

    Sometimes, you think the sky is falling down, actually, that is just because you stand slanting. 有时候 ...

  7. 通过一个实际例子理解Kubernetes里pod的自动scale - 水平自动伸缩

    kubectl scale命令用于程序在负载加重或缩小时进行pod扩容或缩小,我们通过一些实际例子来观察scale命令到底能达到什么效果. 命令行创建一个deployment: kubectl run ...

  8. Document flow API in SAP CRM and C4C

    Document flow API in CRM 以一个具体的例子来说明.在Appointment的Overview page上能看见一个名叫Reference的区域,这里可以维护一些其他的业务文档的 ...

  9. python入门17 类和对象

    类:一类事物的抽象化.概念: 类的变量(属于类的变量,定义在类的开始处)  成员变量(self.变量) 类的方法( @classmethod,cls参数)   成员方法( self参数 )  静态方法 ...

  10. python入门14 字典dict

    字典dict是无序的key:value格式的数据序列 #coding:utf-8 #/usr/bin/python """ 2018-11-11 dinghanhua 字 ...