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

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. iOS中使用RNCryptor对资源文件加密

    原文:http://blog.csdn.net/chenpolu/article/details/46277587 RNCryptor源码https://github.com/RNCryptor/RN ...

  2. Cloud

    Cloud = Data + Routing + Computing + Storage

  3. RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载

    前段时间项目里面使用了RecycleView 但是里面的刷新和加载都是框架里面封装好的,直接使用 这几天比较闲就自己来实现以下. 因为SwipeRefreshLayout是一个下拉刷新控件所有直接和R ...

  4. 《ArcGIS Runtime SDK for Android开发笔记》——数据制作篇:紧凑型切片制作(Server缓存切片)

    1.前言 在ArcGIS 10中出现了一种新的切片缓存文件格式:紧凑型存储(Compact).与之前的松散型存储(Exploded)相比,它有迁移方便.创建更快.减少存储空间等诸多优点,已经成为了现在 ...

  5. file中mkdirs和mkdir的区别-文件上传

    mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下: new File("/tmp/one/two/three").mkdirs(); 执行后, 会建 ...

  6. solidity语言8

    输入参数 pragma solidity ^0.4.16; contract Simple { function taker(uint _a, uint _b) public pure { // do ...

  7. June 12th 2017 Week 24th Monday

    All the splendor in the world is not worth a good friend. 人世间所有的荣华富贵都比不上有一个好朋友. It's great to have a ...

  8. python接口测试-项目实践(二)获取接口响应,取值(re、json)

    一 分别请求3个接口,获取响应. 第三方接口返回有两种:1 纯字符串  2 带bom头的json字串 import requests api1 = 'url1' response1 = request ...

  9. python入门9 条件语句

    条件语句: if 条件为真: 执行语句块 (执行完结束不执行elif,else) elif 条件为真: 执行语句块 (执行完结束不执行else) else: 执行语句块 #coding:utf-8 # ...

  10. 百度提供的LBS服务

    并不是所有 LBS 云服务 都可以使用 js Ajax 访问,涉及跨域问题 (Jsonp 方式解决)Jsonp 解决跨域问题原理,在页面生成<script> 加载远程 js 代码片段.在L ...