|
|
const { statusBarHeight } = uni.getSystemInfoSync();
|
|
|
class NativeMsg {
|
|
|
// 整个区域的宽高
|
|
|
viewStyle = {
|
|
|
backgroundColor: "rgba(255,255,255,0)",
|
|
|
top: "0px",
|
|
|
left: "0px",
|
|
|
width: "100%",
|
|
|
// 取图片的高度(带阴影的尺寸)
|
|
|
height: `${uni.upx2px(239)}px`
|
|
|
};
|
|
|
constructor(item, cb) {
|
|
|
// 记录内容信息,以供回调使用
|
|
|
this.item = item;
|
|
|
// 弹出、消失动画要用
|
|
|
this.offsetTop = -statusBarHeight - uni.upx2px(159);
|
|
|
// 上边界
|
|
|
this.startTop = -statusBarHeight - uni.upx2px(159);
|
|
|
// 下边界
|
|
|
this.endTop = statusBarHeight;
|
|
|
// 上滑关闭要用
|
|
|
this.clientY = 0;
|
|
|
// nativeObj.View 实例
|
|
|
this.view = null;
|
|
|
// 背景图片
|
|
|
this.bgBitmap = null;
|
|
|
// 回调函数
|
|
|
this.cb = cb || null;
|
|
|
// 隐藏过程flag,防止重复执行
|
|
|
this.hiding = false;
|
|
|
// 标记当前弹窗状态
|
|
|
this.status = "active";
|
|
|
this.create();
|
|
|
}
|
|
|
// 创建区域以及背景
|
|
|
create() {
|
|
|
this.loadBg().then(() => {
|
|
|
let _view = null;
|
|
|
// 创建 View区域
|
|
|
_view = new plus.nativeObj.View(`alarmMsg-${this.item.alarmId || "ins"}`, this.viewStyle);
|
|
|
// 画背景
|
|
|
_view.drawBitmap(
|
|
|
this.bitmap, {}, { width: this.viewStyle.width, height: this.viewStyle.height, left: 0,
|
|
|
top: 0 },
|
|
|
"alarm-bg"
|
|
|
);
|
|
|
// 拦截触摸事件: 开启后 区域内的触摸事件不会透传到下面
|
|
|
_view.interceptTouchEvent(true);
|
|
|
// 增加点击事件监听
|
|
|
_view.addEventListener("click", () => {
|
|
|
if (this.hiding) return;
|
|
|
this.hiding = true;
|
|
|
this.cb && this.cb({ type: "click", result: this.item });
|
|
|
this.animationHide();
|
|
|
});
|
|
|
// 触摸事件监听
|
|
|
_view.addEventListener("touchstart", res => {
|
|
|
this.clientY = res.clientY;
|
|
|
});
|
|
|
// 触摸事件监听
|
|
|
_view.addEventListener("touchmove", res => {
|
|
|
const { clientY } = res;
|
|
|
let offsetY = this.clientY - clientY;
|
|
|
if (offsetY > 25 && !this.hiding) {
|
|
|
this.hiding = true;
|
|
|
this.cb && this.cb({ type: "move", result: this.item });
|
|
|
this.animationHide();
|
|
|
}
|
|
|
});
|
|
|
// 保存
|
|
|
this.view = _view;
|
|
|
// 画内容
|
|
|
this.drawInfo();
|
|
|
// 显示
|
|
|
this.animationShow();
|
|
|
});
|
|
|
}
|
|
|
// 加载背景图片
|
|
|
loadBg() {
|
|
|
// 创建Bitmap图片
|
|
|
this.bitmap = new plus.nativeObj.Bitmap("nativeMsg-bg");
|
|
|
// 以Promise方式封装 图片加载过程
|
|
|
return new Promise((resolve, reject) => {
|
|
|
// 加载图片, 路径需要注意
|
|
|
this.bitmap.load(
|
|
|
"_www/static/alarm-bg.png",
|
|
|
() => {
|
|
|
resolve();
|
|
|
},
|
|
|
error => {
|
|
|
console.log(" ====> error", error);
|
|
|
reject();
|
|
|
}
|
|
|
);
|
|
|
});
|
|
|
}
|
|
|
// 画内容
|
|
|
drawInfo() {
|
|
|
const { warningTypeStr, projectName, description } = this.item;
|
|
|
this.view.draw([{
|
|
|
tag: "font",
|
|
|
id: "mainFont",
|
|
|
text: warningTypeStr,
|
|
|
textStyles: { size: `${uni.upx2px(36)}px`, color: "#262626", weight: "bold",
|
|
|
align: "left" },
|
|
|
position: { top: `${uni.upx2px(60)}px`, left: `${uni.upx2px(80)}px`,
|
|
|
height: "wrap_content" }
|
|
|
},
|
|
|
{
|
|
|
tag: "font",
|
|
|
id: "projectFont",
|
|
|
text: projectName,
|
|
|
textStyles: { size: `${uni.upx2px(24)}px`, color: "#7B7B7B", align: "right",
|
|
|
overflow: "ellipsis" },
|
|
|
position: {
|
|
|
top: `${uni.upx2px(60)}px`,
|
|
|
left: `50%`,
|
|
|
width: `${uni.upx2px(750 / 2 - 40 - 20)}px`,
|
|
|
height: "wrap_content"
|
|
|
}
|
|
|
},
|
|
|
{
|
|
|
tag: "font",
|
|
|
id: "infoFont",
|
|
|
text: description,
|
|
|
textStyles: { size: `${uni.upx2px(28)}px`, color: "#7B7B7B", align: "left",
|
|
|
overflow: "ellipsis" },
|
|
|
position: {
|
|
|
top: `${uni.upx2px(117)}px`,
|
|
|
left: `${uni.upx2px(80)}px`,
|
|
|
width: `${uni.upx2px(670 - 40 - 10)}px`,
|
|
|
height: "wrap_content"
|
|
|
}
|
|
|
}
|
|
|
]);
|
|
|
}
|
|
|
// 简易向下出现动画
|
|
|
animationShow() {
|
|
|
this.view.show();
|
|
|
this.view.setStyle({
|
|
|
...this.viewStyle,
|
|
|
top: `${this.offsetTop++}px`
|
|
|
});
|
|
|
if (this.offsetTop >= this.endTop) {
|
|
|
this.status = "active";
|
|
|
return;
|
|
|
}
|
|
|
setTimeout(() => {
|
|
|
this.animationShow();
|
|
|
}, 0);
|
|
|
}
|
|
|
// 简易向上消失动画
|
|
|
animationHide() {
|
|
|
this.view.setStyle({
|
|
|
...this.viewStyle,
|
|
|
top: `${this.offsetTop--}px`
|
|
|
});
|
|
|
if (this.offsetTop <= this.startTop) {
|
|
|
this.view.close();
|
|
|
this.hiding = false;
|
|
|
this.status = "close";
|
|
|
return;
|
|
|
}
|
|
|
setTimeout(() => {
|
|
|
this.animationHide();
|
|
|
}, 0);
|
|
|
}
|
|
|
// 获取当前状态
|
|
|
getStatus() {
|
|
|
return this.status;
|
|
|
}
|
|
|
// 不用动画,直接消失
|
|
|
hide() {
|
|
|
this.view.hide();
|
|
|
this.view.close();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 对外暴露一个创建实例的方法
|
|
|
export function createAlarm(item, cb) {
|
|
|
return new NativeMsg(item, cb);
|
|
|
} |