(#36) Optimization popup layer modular. #64

Merged
MrKBear merged 1 commits from dev-mrkbear into master 2022-01-24 16:57:00 +08:00
3 changed files with 90 additions and 22 deletions
Showing only changes of commit 1dcc09980c - Show all commits

View File

@ -2,11 +2,56 @@ import { IAnyData } from "core/Api";
import { Emitter } from "core/Emitter";
import { Modular, Manager } from "../core/Module";
/**
*
*/
enum AnimateType {
fade = 1,
scale = 2,
none = 3,
}
/**
*
*/
class DisplayLayer {
/**
*
*/
public get className(): string {
let res = this.isDisplay ? "block" : "none";
switch (this.animateType) {
case AnimateType.fade:
res += " mask";
break;
case AnimateType.scale:
res += " layer";
break;
case AnimateType.none:
res += " occlude";
break;
}
switch (this.animateType) {
case AnimateType.fade:
res += this.isShow ? " show-fade" : " hide-fade";
break;
case AnimateType.scale:
res += this.isShow ? " show-scale" : " hide-scale";
break;
case AnimateType.none:
break;
}
return res;
}
/**
* Layer 使 key
*/
@ -15,7 +60,21 @@ class DisplayLayer {
/**
* 使
*/
public animateTime: number = 300;
public animateType: AnimateType = AnimateType.scale;
/**
*
*/
public get animateTime(): number {
switch (this.animateType) {
case AnimateType.fade:
return 100;
case AnimateType.scale:
return 300;
case AnimateType.none:
return -1;
}
};
/**
*
@ -89,6 +148,16 @@ class PopupLayer<
*/
private layers: Map<L | commonLayerType, DisplayLayer> = new Map();
/**
*
* @param key
*/
public initLayers(key: L[]) {
for (let i = 0; i < key.length; i++) {
this.render(this.getDisplayLayer(key[i]));
}
}
public onLoad(): void {
this.on("show", this.handleShowLayer);
this.on("hide", this.handleHideLayer);
@ -96,13 +165,22 @@ class PopupLayer<
// 添加蒙版层
const maskLayer = this.getDisplayLayer("mask");
maskLayer.animateTime = 100;
maskLayer.animateType = AnimateType.fade;
this.render(maskLayer);
// 添加遮蔽层
const occludeLayer = this.getDisplayLayer("occlude");
occludeLayer.animateTime = -1;
occludeLayer.animateType = AnimateType.none;
this.render(occludeLayer);
}
/**
* Layers
*/
private render(layer: DisplayLayer) {
this.setData({ [`${ layer.key }$className`]: layer.className });
}
/**
*
*/
@ -161,10 +239,7 @@ class PopupLayer<
displayLayer.isShow = true;
displayLayer.isDisplay = true;
this.setData({
[`${ e }$isShow`]: true,
[`${ e }$isDisplay`]: true
});
this.render(displayLayer);
this.emit("change", displayLayer);
};
@ -182,16 +257,11 @@ class PopupLayer<
displayLayer.isShow = false;
displayLayer.isDisplay = false;
this.setData({
[`${ e }$isShow`]: false,
[`${ e }$isDisplay`]: false
});
this.render(displayLayer);
} else {
displayLayer.isShow = false;
this.setData({
[`${ e }$isShow`]: false
});
this.render(displayLayer);
// 开启遮蔽
if (this.showOccludeWhenHide) {
@ -200,9 +270,7 @@ class PopupLayer<
displayLayer.disappearTimer = setTimeout(() => {
displayLayer.isDisplay = false;
this.setData({
[`${ e }$isDisplay`]: false
});
this.render(displayLayer);
// 取消 timer
displayLayer.disappearTimer = undefined;

View File

@ -17,7 +17,7 @@ import { TestLayerA } from "./TestLayerA";
const userCard = manager.addModule(UserCard, "userCard");
//#region test layer
// popupLayer.hideOtherWhenShow = false;
popupLayer.initLayers(["layerA", "layerB"]);
const testLayerA = manager.addModule(TestLayerA, "testLayerA");
userCard.on("clickChangeTheme", () => {
popupLayer.emit("show", "layerA");

View File

@ -1,16 +1,16 @@
<!-- 层遮蔽层 -->
<view class="occlude {{ mask$occlude$isShow ? 'show-fade' : 'hide-fade' }} {{ mask$occlude$isDisplay ? 'block' : 'none' }}" bindtap="mask$clickMask"></view>
<view class="{{ mask$occlude$className }}" bindtap="mask$clickMask"></view>
<!-- 蒙版 -->
<view class="mask {{ mask$mask$isShow ? 'show-fade' : 'hide-fade' }} {{ mask$mask$isDisplay ? 'block' : 'none' }}" bindtap="mask$clickMask"></view>
<view class="{{ mask$mask$className }}" bindtap="mask$clickMask"></view>
<!-- 层A -->
<view class="layer {{ mask$layerA$isShow ? 'show-scale' : 'hide-scale' }} {{ mask$layerA$isDisplay ? 'block' : 'none' }}" bindtap="mask$clickMask">
<view class="{{ mask$layerA$className }}" bindtap="mask$clickMask">
<view class="card" style="height: 300px; line-height: 300px; text-align:center" catchtap="testLayerA$click">layerA(点击显示layerB)</view>
</view>
<!-- 层B -->
<view class="layer {{ mask$layerB$isShow ? 'show-scale' : 'hide-scale' }} {{ mask$layerB$isDisplay ? 'block' : 'none' }}" bindtap="mask$clickMask">
<view class="{{ mask$layerB$className }}" bindtap="mask$clickMask">
<view class="card" style="height: 200px; line-height: 200px; text-align:center" catchtap>layerB</view>
</view>