123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- const VIEW_ID = '1.23452384164.123412415';
- let watermarkView;
- export default {
- data() {
- return {
- showCanvas: true,
- canvasText: '',
- canvasSize: uni.upx2px(250),
- canvasFontSize: uni.upx2px(30),
- canvasTextColor: 'rgba(200, 200, 200, 0.50)',
- canvasRotate: -30 * Math.PI / 180,
- canvasTextAlign: 'left',
- canvasTextBaseline: 'middle',
- canvasTextFillX: uni.upx2px(-50),
- canvasTextFillY: uni.upx2px(170)
- }
- },
-
- watch: {
- canvasText(newVal) {
- this.updateWatermark()
- }
- },
-
- methods: {
- show() {
- // #ifdef APP-PLUS
- plus.nativeObj.View.getViewById(VIEW_ID) !== null && plus.nativeObj.View.getViewById(VIEW_ID).show();
- // #endif
- // #ifdef H5
- if (document.getElementById(VIEW_ID)) {
- document.getElementById(VIEW_ID).style.visibility = "visible";
- }
- // #endif
- },
-
- hide() {
- // #ifdef APP-PLUS
- plus.nativeObj.View.getViewById(VIEW_ID) !== null && plus.nativeObj.View.getViewById(VIEW_ID).hide();
- // #endif
- // #ifdef H5
- if (document.getElementById(VIEW_ID)) {
- document.getElementById(VIEW_ID).style.visibility = "hidden";
- }
- // #endif
- },
-
- updateWatermark() {
- if (!this.canvasText) throw new Error('canvasText is Requied!');
-
- // #ifdef APP-PLUS
- watermarkView && watermarkView.reset();
- this.drawAppWaterMark(VIEW_ID);
- // #endif
-
- // #ifdef H5
- this.drawH5WaterMark(VIEW_ID);
- // #endif
- },
-
- initWatermark() {
- if (!this.canvasText) throw new Error('canvasText is Requied!');
-
- // #ifdef APP-PLUS
- this.drawAppWaterMark(VIEW_ID);
- // #endif
-
- // #ifdef H5
- this.drawH5WaterMark(VIEW_ID);
- // #endif
-
- uni.$off('ly-show-watermar');
- uni.$off('ly-hide-watermark');
-
- // 全局监听事件,触发水印显示
- uni.$on('ly-show-watermark', () => {
- this.show();
- });
-
- // 全局监听事件,触发水印隐藏
- uni.$on('ly-hide-watermark', () => {
- this.hide();
- });
- },
-
- // #ifdef APP-PLUS
- drawAppWaterMark(id) {
- plus.nativeObj.View.getViewById(id) && plus.nativeObj.View.getViewById(id).close();
- let cans = uni.createCanvasContext('watermarkCanvas');
-
- cans.rotate(this.canvasRotate);
- cans.setFontSize(this.canvasFontSize);
- cans.setFillStyle(this.canvasTextColor);
- cans.setTextAlign(this.canvasTextAlign);
- cans.setTextBaseline(this.canvasTextBaseline);
- cans.fillText(this.canvasText, this.canvasTextFillX, this.canvasTextFillY);
- cans.draw(false);
- this.canvasDrawCallFn(id);
- },
-
- // 利用canvas生成水印图片
- canvasDrawCallFn(id) {
- // 适当的延时确保绘制完毕
- setTimeout(() => {
- uni.canvasToTempFilePath({
- canvasId: "watermarkCanvas",
- success: res => {
- let viewList = this.getWaterMarkWebview(res);
- watermarkView = new plus.nativeObj.View(id, {
- top: '0',
- left: '0',
- right: '0',
- bottom: '0'
- }, viewList);
-
- // 拦截View控件的触屏事件,将事件穿透给下一层view
- watermarkView.interceptTouchEvent(false);
- watermarkView.show();
- // this.showCanvas = false;
- }
- });
- }, 100);
- },
-
- // 创建webview页面水印样式
- getWaterMarkWebview(res) {
- let sysInfo = uni.getSystemInfoSync(),
- row = Math.ceil(sysInfo.windowHeight / this.canvasSize), // 水印排列行数
- imgList = [];
- for (let i = 0; i < row; i++) {
- for (let j = 0; j < 3; j++) {
- imgList.push({
- tag: 'img',
- src: res.tempFilePath,
- position: {
- top: (this.canvasSize * i) + 'px',
- left: (this.canvasSize * j) + 'px',
- width: this.canvasSize + 'px',
- height: this.canvasSize + 'px'
- }
- });
- }
- }
- return imgList;
- },
- // #endif
-
- // #ifdef H5
- drawH5WaterMark(id) {
- document.getElementById(id) && document.body.removeChild(document.getElementById(id));
- let can = document.createElement('canvas');
- let cans = can.getContext('2d');
- let div = document.createElement('div');
- can.width = this.canvasSize;
- can.height = this.canvasSize;
- cans.rotate(this.canvasRotate);
- cans.font = this.canvasFontSize + 'px sans-serif';
- cans.fillStyle = this.canvasTextColor;
- cans.textAlign = this.canvasTextAlign;
- cans.textBaseline = this.canvasTextBaseline;
- cans.fillText(this.canvasText, this.canvasTextFillX, this.canvasTextFillY);
- div.id = id;
- div.style.pointerEvents = 'none';
- div.style.top = '0';
- div.style.left = '0';
- div.style.bottom = '0';
- div.style.right = '0';
- div.style.position = 'fixed';
- div.style.zIndex = '100000';
- div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat';
- document.body.appendChild(div);
- }
- // #endif
- }
- }
|