LayaBox进阶之UI管理器

Stella981
• 阅读 315

自己动手写框架的话,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 () {}   界面被加载完成后, 会自动调用这个方法、。

搞定。

点赞
收藏
评论区
推荐文章
Karen110 Karen110
2年前
手把手教你用Python高仿一个任务管理器
大家好,我是Python进阶者。前言相信大家对任务管理器都不是很陌生了,CtrlAltDel即可打开,然后点击启动任务管理器,或者右击任务栏启动任务管理器即可启动任务管理器,启动之后界面如下:可以看出它列举出了一些重要的参数,比如进程数量,CPU使用率,物理内存,接下来我们就来一一列举出来。一、项目准备编辑器:sublimetext3模块:p
可莉 可莉
2年前
2018前端最火的web UI框架
1.AliceuiAliceui是支付宝的样式解决方案,是一套精选的基于spm生态圈的样式模块集合,是Arale的子集,也是一套模块化的样式命名和组织规范,是写CSS的更好方式。gitHub地址:https://github.com/aliceui/aliceui.github.io(https://www.osc
Stella981 Stella981
2年前
2018前端最火的web UI框架
1.AliceuiAliceui是支付宝的样式解决方案,是一套精选的基于spm生态圈的样式模块集合,是Arale的子集,也是一套模块化的样式命名和组织规范,是写CSS的更好方式。gitHub地址:https://github.com/aliceui/aliceui.github.io(https://www.osc
Stella981 Stella981
2年前
Autojs的intent使用
以打开淘宝app的搜索页面为例,先准备工具:Activity管理器下载地址:https://www.cr173.com/soft/824332.html备用地址:https://pan.baidu.com/s/1l2266vDbzp0hYcchkUC5jg提取码:qeve打开管理器!(https://oscimg.oschina
Wesley13 Wesley13
2年前
oracle数据库完全卸载步骤
1.关闭oracle所有的服务。可以在windows的服务管理器中关闭;2.打开注册表:regedit打开路径:HKEY\_LOCAL\_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\删除该路径下的所有以oracle开始的服务名称,这个键是标识Oracle(https://www.oschina.
Stella981 Stella981
2年前
React Hooks的999999个好处
最近前几个月开始,新项目都开始完全使用typescripthooks,先不说typescript吧,hooks是真的香🤣1.更好的分离页面和逻辑,重用逻辑的方法现在前端项目的组件化,一般都是基于最基础的UI组件库(里面也有组件的功能逻辑),加上业务逻辑,封装一个个component,container。组件是UI逻辑的复用,
Wesley13 Wesley13
2年前
LAE软件开发工具界面介绍
lae工具基本简介!(http://static.oschina.net/uploads/space/2016/0727/141728_vOby_2859408.png) 一、 菜单1、 文件:主要有新建、打开、保存、另存为、退出功能,lae所新建的项目实际上是一个目录和一些模板文件,所编辑的UI文件都将保存到该目录下。2、 编辑:主要有
京东云开发者 京东云开发者
11个月前
Flutter状态管理新的实践 | 京东云技术团队
声明式UI其实并不是近几年的新技术,但是近几年声明式UI框架非常的火热。单说移动端,跨平台方案有:RN、Flutter。iOS原生有:SwiftUI。android原生有:compose。可以看到声明式UI是以后的前端发展趋势。而状态管理是声明式UI框架的重要组成部分。
小尉迟 小尉迟
7个月前
英文版Premiere Pro怎么切换成中文?PR汉化包怎么安装
安装了PremierePro突然发现界面语言是英文版的,首选项里也没有UI语言切换选项,怎么在不重装的情况下,将英文版PremierePro怎么切换成中文?1、打开安装好的Premierepro,可以看到界面语言是英文版的;2、进入pr后,新建一个合成,然
笑面虎 笑面虎
5个月前
【15章】前端高手特训 从0到1带你手写一个微信小程序底层框架
【15章】前端高手特训从0到1带你手写一个微信小程序底层框架视频课程分享——前端高手特训从0到1带你手写一个微信小程序底层框架,课程包更新,附源码。大家下载学习。微信小程序实质上是一款基于web技术的应用程序,他和我们平常所接触到的前端网页是大同小异的。相