123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- import { _decorator, UIOpacity, UITransform, Enum, Widget, Button, BlockInputEvents,Node } from 'cc';
- import { ResKeeper } from '../res/ResKeeper';
- const { ccclass, executeInEditMode, requireComponent, menu, property } = _decorator;
- export enum UIShowType {
- Single, //单独显示
- Overlap, //重叠显示
- FullScreen, //全屏显示
- };
- @ccclass('BaseView')
- @requireComponent([UIOpacity, UITransform])
- @menu('私有组件/BaseView')
- export class BaseView extends ResKeeper {
- @property({ type: Enum(UIShowType), displayName: "UI显示模式" })
- private ui_type: UIShowType = UIShowType.Single;
- @property({ displayName: "是否铺满全屏", visible: true })
- private _base_view_full = false;
- @property({ displayName: "是否拦截层事件", visible() { return this._base_view_full && !this._base_quick_close } })
- private _base_view_block = false;
- @property({
- displayName: "是否快速关闭", visible() {
- let show = this._base_view_full && !this._base_view_block;
- (!show) && (this._base_quick_close_cache = false);
- return show;
- }
- })
- private _base_quick_close = false;
- @property({ type: Node, displayName: "快速关闭排除节点", visible() { return this._base_quick_close && this._base_view_full && !this._base_view_block } })
- private _base_quick_close_exclude_node: Node[] = [];
- @property({ displayName: "快速关闭时是否摧毁UI", visible() { return this._base_quick_close && this._base_view_full && !this._base_view_block } })
- private _base_quick_close_destroy = true;
- private _$timer_uuid = 0;
- private _view_id = -1;
- private _schedule_map = new Map<number, Function>();
- protected _ui_opacity: UIOpacity = null;
- protected _ui_transform: UITransform = null;
- private _opening = true;
- protected onLoad() {
- this._ui_opacity = this.getComponent(UIOpacity) || this.addComponent(UIOpacity);
- this._ui_transform = this.getComponent(UITransform) || this.addComponent(UITransform);
- this._schedule_map.clear();
- if (this._base_view_full) {
- let widget = this.getComponent(Widget) || this.addComponent(Widget);
- widget.isAlignLeft = widget.isAlignRight = widget.isAlignTop = widget.isAlignBottom = true;
- widget.left = widget.right = widget.top = widget.bottom = 0;
- widget.alignMode = Widget.AlignMode.ON_WINDOW_RESIZE;
- widget.enabled = true;
- (this._base_view_block) && (this._base_quick_close = false);
- (this._base_quick_close) && (this._base_view_block = false);
- } else {
- this._base_view_block = false;
- this._base_quick_close = false;
- this._base_quick_close_destroy = true;
- }
- if (this._base_view_block) {
- (!this.getComponent(BlockInputEvents) && !this.getComponent(Button)) && this.addComponent(BlockInputEvents);
- }
- if (this._base_quick_close && this._base_quick_close_exclude_node && this._base_quick_close_exclude_node.length > 0) {
- if (!this.getComponent(BlockInputEvents) && !this.getComponent(Button)) {
- for (let node of this._base_quick_close_exclude_node) {
- node.addComponent(BlockInputEvents);
- }
- }
- // if ((!this.getComponent(BlockInputEvents) && !this.getComponent(Button))) {
- // this.node.on(Node.EventType.TOUCH_END, () => {
- // (!this._opening) && Framework.layer.close(this);
- // }, this);
- // }
- }
- }
- /**
- * 自定义定时器
- * @param callback 回调
- * @param interval 以秒为单位的时间间隔
- * @param repeat 重复次数
- * @param delay 开始延时
- */
- protected _schedule(callback: Function, interval?: number, repeat?: number, delay?: number) {
- if (callback) {
- let uuid = ++this._$timer_uuid;
- this._schedule_map.set(uuid, callback);
- this.schedule(callback, interval, repeat, delay);
- return uuid;
- }
- return -1;
- }
- /**
- * 释放定时器
- * @param uuid 任务标识
- */
- protected _unschedule(uuid: number) {
- if (uuid > 0) {
- let func = this._schedule_map.get(uuid)
- if (func) {
- this._schedule_map.delete(uuid);
- this.unschedule(func);
- }
- }
- }
- /**
- * 全局定时器
- * @param callback 回调
- * @param delay 开始延时
- */
- protected _scheduleOnce(callback: Function, delay: number = 0) {
- if (callback) {
- let uuid = ++this._$timer_uuid;
- this._schedule_map.set(uuid, callback);
- this.scheduleOnce(() => {
- let func = this._schedule_map.get(uuid);
- func && func();
- this.unschedule(uuid);
- }, Math.max(delay, 0));
- return uuid;
- }
- }
- protected _clearAllTimer() {
- this._schedule_map.forEach((func, key) => {
- this.unschedule(func);
- });
- this._schedule_map.clear();
- }
- get show_type() {
- return this.ui_type;
- }
- set view_id(id: number) {
- this._view_id = id;
- }
- get view_id() {
- return this._view_id;
- }
- /**
- * UI打开后会调用该函数
- * @param args 自定义参数
- */
- onOpen(...args: any[]) { }
- /**
- * UI被销毁前会调用该函数
- */
- onClose() { }
- /**
- * 显示UI
- */
- onShow() {
- this.node.active = true;
- // (this._ui_opacity) && (this._ui_opacity.opacity = 255);
- }
- /**
- * 隐藏UI
- */
- onHide() {
- // (this._ui_opacity) && (this._ui_opacity.opacity = 0);
- this.node.active = false;
- }
- }
|