LayaBox进阶之UI管理器

时间:2023-01-25 06:26:19

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

打开界底层是addChild打开的;
 
 
新建一个UIManager
export class UIManager {
private mainContent: Laya.Sprite;
private scene: GameScence;
private uiList:any[]; constructor() {
this.mainContent = new Laya.Sprite(); this.uiList = [];
}
}

  mainContent 为默认添加到的层级,

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

  

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

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

    private getView(clazz: any):Laya.Node{
for(let i:number =0 ; i<this.uiList.length ; i++){
let uiData = this.uiList[i];
if(uiData.clazz == clazz){
return uiData.view;
}
}
}

  

根据clazz名字获取本地缓存的场景类
 
 
下面是关闭场景,
    public closeWindow(clazz: any): void {
let v = this.getView(clazz);
let index: number = this.getViewIndex(clazz);
if(v){
v.removeSelf();
this.uiList.splice(index,1);
}
}

  

    private getViewIndex(clazz: any):number{
for(let i:number =0 ; i<this.uiList.length ; i++){
let uiData = this.uiList[i];
if(uiData.clazz == clazz){
return i;
}
}
return -1;
}

  

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

  

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

  

有时候通过open方法,或者UiManager打开一个场景后,场景里面的元素还不能正常获取;解决办法是
修改Node Sprite的原型, 那么,所有的场景被加载时,都会执行这些方法,
 
import { LogUtil } from "../util/LogUtil";

/**
* 为基类定义若干方法
*/
export class PatchManager{}
(function(){
let _proto:any; _proto = Laya.Scene.prototype;
_proto.createView = function(view:Object){
if (view && !this._viewCreated) {
this._viewCreated = true;
Laya.SceneUtils.createByData(this, view);
} this.onInit();
this.onShow(); Laya.timer.frameLoop(1, this, ()=>{
// console.info(this);
this.onUpdate();
});
} /********************************************************************************
* Node
********************************************************************************/
_proto = Laya.Node.prototype; _proto.onInit = function(){
} _proto.onShow = function(){
} _proto.onUpdate = function(){
} _proto.onDisable=function(){
this.onHide();
} _proto.onHide = function(){
}
})();

  

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