然后我们看下打开窗口逻辑处理,有助于后面示例理解

/*
@func: 同步打开一个窗口
@param: uiId 窗口唯一标识符ID
@param: uiArgs 页面参数可以通过回调对象onAddedonRemoved回调获取
@param: callbacks 回调对象
*/
open(uiId: number, uiArgs: any = null, callbacks?: UICallbacks): void {
  var config = this.configs[uiId];
  if (config == null) {
    warn(`打开编号为【${uiId}】的界面失败配置信息存在`);
    return;
  }

  switch (config.layer) {
    case LayerType.UI:
      this.ui.add(config, uiArgs, callbacks);
      break;
    case LayerType.PopUp:
      this.popup.add(config, uiArgs, callbacks);
      break;
    case LayerType.Dialog:
      this.dialog.add(config, uiArgs, callbacks);
      break;
    case LayerType.System:
      this.system.add(config, uiArgs, callbacks);
      break;
  }
}

打开逻辑处理其实简单,从UI配置获取配置数据然后通过add设置不同窗口显示逻辑。

示例

简单示例,在上面有说过。在项目开发中,如果切换页面可以这样:

// 关闭当前页面
oops.gui.remove(UIID.Loading);
// 显示新的页面
oops.gui.open(UIID.UI_MAIN);

这样的处理方式主要是为了避免: 页面资源较多,切换页面时导致黑屏情况的出现

框架针对于这种情况,通过页面回调方式做了处理,主要定义是: UICallbacks

// ../oops-plugin-framework/assets/core/gui/layer/Defines.ts
export interface UICallbacks {
  // 节点添加到层级以后的回调参数为当前页面节点传递参数
  onAdded?: (node: Node, params: any) => void,
  // 窗口节点destroy之后回调,参数为当前页面节点,传递参数
  onRemoved?: (node: Node | null, params: any) => void,
  // 页面在移除时候,进行的调用,可用于隐藏动画的显示,参数为当前页面节点,回调
  // 注意:如果调用`this.node.destroy()`,该回调将直接忽略
  onBeforeRemove?: (node: Node, next: Function) => void
}

注:这个接口定义在页面参数传递动画播放使用很频繁。

弹窗示例

框架弹窗中, 虽有PopUp,Dialog,System的几种类型,但他们是类似的

增加一个窗口的UI预制体,如下图所示
请添加图片描述

GameUIConfig.ts中增加配置后, 添加示例

public openWindow(event, customData: string) {
  let params = {
    title: "窗口标题",
    content: "这是一段描述",
  }
  let callBack: UICallbacks = {
    onAdded: (node: Node, params: any) => {
      console.log("onAdded获取传递参数:", params)
    },
    onRemoved:(node: Node | null, params: any) => {
      console.log("onRemoved获取传递参数:", params)     
    }
  }
  oops.gui.open(UIID.UI_POPUP, params, callBack);
}

如果想在指定的页面中获取传入的参数可以这样:

@ccclass('UIPop')
export class UIPop extends Component {
  @property(Label) titleLabel: Label = null;
  @property(Label) descLabel: Label = null; 
  private _okFunc = null;

  // 增加onAdded的回调,获取参数
  onAdded(args: any) {
    if (args) {
      this._okFunc = args.okFunc || null;
      this.titleLabel.string = args.title || "";
      this.descLabel.string = args.content || "未知错误";
    }
  }

  onClose() {
    if (this._okFunc) {
      this._okFunc();
    }
    oops.gui.removeByNode(this.node);
  }
}

一般弹窗的出现需要有显示或隐藏动画的,我们可以通过回调方法

动画的显示可以通过tween动系统或CocosCreator的Animation组件进行添加

public clickSystem(event, customData: string) {
    console.log(customData);
    let params = {
      title: `系统窗口`,
      content: "数据异常",
    }
    oops.gui.open(UIID.UI_SYSTEM, params, this.getPopCommonEffect());
}

// 弹窗动画
private getPopCommonEffect(callbacks?: PopViewParams) {
	let newCallbacks: PopViewParams = {
		// 节点添加动画
    onAdded: (node, params) => {
      node.setScale(0.1, 0.1, 0.1);
      tween(node)
        .to(0.2, { scale: new Vec3(1, 1, 1) })
        .start();
    },
    // 节点删除动画
    onBeforeRemove: (node, next) => {
      tween(node)
        .to(0.2, { scale: new Vec3(0.1, 0.1, 0.1) })
        .call(next)
        .start();
    },
	}

	if (callbacks) {
    if (callbacks && callbacks.onAdded) {
      let onAdded = callbacks.onAdded;
      callbacks.onAdded = (node: Node, params: any) => {
        onAdded(node, params);
        newCallbacks.onAdded(node, params);
      };
    }

    if (callbacks && callbacks.onBeforeRemove) {
      let onBeforeRemove = callbacks.onBeforeRemove;
      callbacks.onBeforeRemove = (node, params) => {
        onBeforeRemove(node, params);
        newCallbacks.onBeforeRemove(node, params);
      };
    }
    return callbacks;
  }
  return newCallbacks;
}

注:作者在oops-frameworkTipsManager.ts中增加了更多的窗口示例推荐查看学习

Toast示例

提示内容的显示就相对简单了,主要代码如下

private _tipIndex: number = 0;

public clickTip(event, customData: string) {
  this._tipIndex++;
  // 参数:内容是否使用语言默认false
  oops.gui.toast(`这是第${this._tipIndex}提示`);
}

总结

框架中对界面的显示和隐藏主要逻辑如下

  1. 页面的构建继承Component即可,如果需要获取参数,就增加 onAdded 方法
  2. GameUIConfig.ts设置 UIID唯一标识符ID 和 UIConfig 配置
  3. 页面的调用使用openopenAsync;提示的显示使用Toast

最后注意:

  1. 任何页面的显示,不建议重复调用
oops.gui.open(UIID.UI_LAYER, {param: "参数"});
oops.gui.open(UIID.UI_LAYER, {param: "参数"});

注:框架会告知路径为【game/prefab/uiLayer】的预制重复加载

  1. PopUp的弹窗支持显示多个,指的是不同配置的Pop弹窗,原因1

感谢作者dgflash分享,作者CSDN博客dgflash CSDN

最后,祝大家学习和生活愉快!

原文地址:https://blog.csdn.net/qq_24726043/article/details/134760382

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_36026.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注