Commit 6a30b259 authored by rockyl's avatar rockyl

修复批量弹窗问题

parent c26351a8
This diff is collapsed.
This diff is collapsed.
{"id":"engine","url":"engine.064186f5e8dcc18d3c38e8e0526e183be57587f2.js"} {"id":"engine","url":"engine.50f2306185a286c24568fc87ef21dd4070b56456.js"}
\ No newline at end of file \ No newline at end of file
...@@ -15,6 +15,9 @@ export class StackContainer extends Node { ...@@ -15,6 +15,9 @@ export class StackContainer extends Node {
private _stack = []; private _stack = [];
private _inserted = 0; private _inserted = 0;
private _playing = false;
private _actionQueue = [];
constructor(mutex = true, inserted = 0) { constructor(mutex = true, inserted = 0) {
super(); super();
...@@ -43,66 +46,20 @@ export class StackContainer extends Node { ...@@ -43,66 +46,20 @@ export class StackContainer extends Node {
* @param view * @param view
* @param options * @param options
* @param playEffect * @param playEffect
* @param callback
*/ */
push(view: DisplayObject, options?, playEffect = true, callback?) { push(view: DisplayObject, options?, playEffect = true) {
const action = 'push'; this._actionQueue.push({action: 'push', args: arguments});
this._playNextAction();
let lastView;
if (this._mutex && this.childNum > 0) {
lastView = this.getChildAt(0);
this._stack.push(lastView);
}
view.visible = false;
this.addChild(view);
let data = {action, view, lastView, options, hasView: true};
this.dispatchEvent(Event.START, data);
playViewEffect(
playEffect ? options ? options.effect : null : null,
options ? options.effectParams : {},
this._mutex, lastView, view, this,
() => {
this.dispatchEvent(Event.COMPLETE, data);
callback && callback();
}
)
} }
/** /**
* 撤出视图 * 撤出视图
* @param options * @param options
* @param playEffect * @param playEffect
* @param callback
*/ */
pop(options?, playEffect = true, callback?) { pop(options?, playEffect = true) {
const action = 'pop'; this._actionQueue.push({action: 'pop', args: arguments});
this._playNextAction();
let len = this.childNum;
if (len <= 0) {
return false;
}
let lastView = this.getChildAt(this.children.length - 1);
let view;
if (this._mutex) {
view = this._stack.pop();
view.visible = false;
this.addChild(view);
}
let data = {action, view, lastView, options, hasView: len > 1};
this.dispatchEvent(Event.START, data);
playViewEffect(
playEffect ? options ? options.effect : null : null,
options ? options.effectParams : {},
this._mutex, lastView, view, this,
() => {
this.dispatchEvent(Event.COMPLETE, data);
callback && callback();
}
);
return true;
} }
/** /**
...@@ -110,31 +67,10 @@ export class StackContainer extends Node { ...@@ -110,31 +67,10 @@ export class StackContainer extends Node {
* @param view * @param view
* @param options * @param options
* @param playEffect * @param playEffect
* @param callback
*/ */
replace(view: DisplayObject, options?, playEffect = true, callback?) { replace(view: DisplayObject, options?, playEffect = true) {
const action = 'replace'; this._actionQueue.push({action: 'replace', args: arguments});
this._playNextAction();
let len = this.childNum;
if (len <= 0) {
return false;
}
let lastView = this.getChildAt(len - 1);
view.visible = false;
this.addChild(view);
let data = {action, view, lastView, options, hasView: len > 1};
this.dispatchEvent(Event.START, data);
playViewEffect(
playEffect ? options ? options.effect : null : null,
options ? options.effectParams : {},
this._mutex, lastView, view, this,
() => {
this.dispatchEvent(Event.COMPLETE, data);
callback && callback();
}
)
} }
/** /**
...@@ -142,35 +78,144 @@ export class StackContainer extends Node { ...@@ -142,35 +78,144 @@ export class StackContainer extends Node {
* @param view * @param view
* @param options * @param options
* @param playEffect * @param playEffect
* @param callback
*/ */
popAll(view?: DisplayObject, options?, playEffect = true, callback?) { popAll(view?: DisplayObject, options?, playEffect = true) {
const action = 'popAll'; this._actionQueue.push({action: 'popAll', args: arguments});
this._playNextAction();
}
let lastView = this.getChildAt(0); private _playNextAction = () => {
let len = this.childNum; if (this._playing || this._actionQueue.length === 0) {
while (this.children.length > 1) { return;
this.removeChildAt(1);
} }
if (this._mutex) {
this._stack.splice(0); let actionItem = this._actionQueue.shift();
let args = [];
for (let i = 0, li = actionItem.args.length; i < li; i++) {
const argument = actionItem.args[i];
args.push(argument);
} }
this._playing = true;
this['_' + actionItem.action].apply(this, args)
.then(()=>{
this._playing = false;
setTimeout(this._playNextAction, 1);
});
};
private _push(view: DisplayObject, options?, playEffect = true) {
return new Promise(resolve => {
const action = 'push';
let lastView;
if (this._mutex && this.childNum > 0) {
lastView = this.getChildAt(0);
this._stack.push(lastView);
}
view.visible = false;
this.addChild(view);
let data = {action, view, lastView, options, hasView: true};
this.dispatchEvent(Event.START, data);
playViewEffect(
playEffect ? options ? options.effect : null : null,
options ? options.effectParams : {},
this._mutex, lastView, view, this,
() => {
this.dispatchEvent(Event.COMPLETE, data);
resolve();
}
)
})
}
private _pop(options?, playEffect = true) {
return new Promise(resolve => {
const action = 'pop';
let len = this.childNum;
if (len <= 0) {
return false;
}
let lastView = this.getChildAt(this.children.length - 1);
let view;
if (this._mutex) {
view = this._stack.pop();
view.visible = false;
this.addChild(view);
}
let data = {action, view, lastView, options, hasView: len > 1};
this.dispatchEvent(Event.START, data);
playViewEffect(
playEffect ? options ? options.effect : null : null,
options ? options.effectParams : {},
this._mutex, lastView, view, this,
() => {
this.dispatchEvent(Event.COMPLETE, data);
resolve();
}
)
})
}
private _replace(view: DisplayObject, options?, playEffect = true) {
return new Promise(resolve => {
const action = 'replace';
let len = this.childNum;
if (len <= 0) {
return false;
}
let lastView = this.getChildAt(len - 1);
if(view){
view.visible = false; view.visible = false;
this.addChild(view); this.addChild(view);
}
let data = {action, view, lastView, options, hasView: len > 1}; let data = {action, view, lastView, options, hasView: len > 1};
this.dispatchEvent(Event.START, data); this.dispatchEvent(Event.START, data);
playViewEffect( playViewEffect(
playEffect ? options ? options.effect : null : null, playEffect ? options ? options.effect : null : null,
options ? options.effectParams : {}, options ? options.effectParams : {},
this._mutex, lastView, view, this, this._mutex, lastView, view, this,
() => { () => {
this.dispatchEvent(Event.COMPLETE, data); this.dispatchEvent(Event.COMPLETE, data);
callback && callback(); resolve();
}
)
})
}
private _popAll(view?: DisplayObject, options?, playEffect = true) {
return new Promise(resolve => {
const action = 'popAll';
let lastView = this.getChildAt(0);
let len = this.childNum;
while (this.children.length > 1) {
this.removeChildAt(1);
}
if (this._mutex) {
this._stack.splice(0);
} }
)
if (view) {
view.visible = false;
this.addChild(view);
}
let data = {action, view, lastView, options, hasView: len > 1};
this.dispatchEvent(Event.START, data);
playViewEffect(
playEffect ? options ? options.effect : null : null,
options ? options.effectParams : {},
this._mutex, lastView, view, this,
() => {
this.dispatchEvent(Event.COMPLETE, data);
resolve();
}
)
})
} }
} }
\ No newline at end of file
...@@ -169,7 +169,7 @@ const effects = { ...@@ -169,7 +169,7 @@ const effects = {
.to(outPos, duration, Ease[outEase]) .to(outPos, duration, Ease[outEase])
.call(() => { .call(() => {
container.removeChild(lastView); container.removeChild(lastView);
injectProp(lastView, outPos); injectProp(lastView, {scaleX: 1, scaleY: 1});
callback(); callback();
}); });
...@@ -185,8 +185,6 @@ const effects = { ...@@ -185,8 +185,6 @@ const effects = {
y: view.y, y: view.y,
scaleX: 1, scaleY: 1 scaleX: 1, scaleY: 1
}; };
view.anchorX = view.width / 2;
view.anchorY = view.height / 2;
outPos.x -= view.width / 2; outPos.x -= view.width / 2;
outPos.y -= view.height / 2; outPos.y -= view.height / 2;
...@@ -195,6 +193,9 @@ const effects = { ...@@ -195,6 +193,9 @@ const effects = {
Tween.get(view, null, null, true) Tween.get(view, null, null, true)
.to(inPos, duration, Ease[inEase]) .to(inPos, duration, Ease[inEase])
.call(() => { .call(() => {
view.anchorX = 0;
view.anchorY = 0;
callback(); callback();
}); });
} else { } else {
...@@ -226,7 +227,7 @@ const effects = { ...@@ -226,7 +227,7 @@ const effects = {
.to({scaleX: 0, scaleY: 0}, duration, Ease[outEase]) .to({scaleX: 0, scaleY: 0}, duration, Ease[outEase])
.call(() => { .call(() => {
container.removeChild(lastView); container.removeChild(lastView);
injectProp(view, {scaleX: 0, scaleY: 0}); injectProp(view, {scaleX: 1, scaleY: 1});
callback(); callback();
}); });
...@@ -244,6 +245,8 @@ const effects = { ...@@ -244,6 +245,8 @@ const effects = {
Tween.get(view, null, null, true) Tween.get(view, null, null, true)
.to({scaleX: 1, scaleY: 1}, duration, Ease[inEase]) .to({scaleX: 1, scaleY: 1}, duration, Ease[inEase])
.call(() => { .call(() => {
view.anchorX = 0;
view.anchorY = 0;
callback(); callback();
}); });
} else { } else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment