<template> <view :class="modal?'show-qrcode':'hide-qrcode'"> <view class="box-qrcode" :style="{'margin-left': marginLeft + 'px'}" @longtap="longtapCode"> <!-- style="width: 550rpx;height: 550rpx;" --> <canvas class="canvas-qrcode" :style="style_w_h" :canvas-id="qrcode_id"> <!-- #ifndef MP --> <view v-if="modal&&is_themeImg" :style="style_w_h" class="box-img-qrcode"> <image :style="style_w_h_img" mode="scaleToFill" :src="themeImg"></image> </view> <!-- #endif --> </canvas> <!-- <image mode="scaleToFill" :src="imagePath"></image> --> </view> </view> </template> <script> var qr_we = require("./qrcode_wx.js"); const qrCode = require('./weapp-qrcode.js') export default { data() { return { isAndroid : false , show: true, imagePath: '', // qrcode_id: 'qrcode_id', marginLeft: 0, //一般的安卓app只需加30就能显示全 //苹果app的不加就能显示全,加了就要弄margin-left //有些安卓app显示不全 add_num : 30 , add_num_key : 'rectify_code_key', } }, props: { modal: { type: Boolean, default: false }, url: { type: String, default: '' }, height: { type: Number, default: 260 }, width: { type: Number, default: 260 }, themeColor: { type: String, default: '#333333', }, qrcode_id: { type: String, default: 'qrcode_id', }, is_themeImg: { type: Boolean, default: false, }, themeImg: { type: String, default: 'https://cdn.pixabay.com/photo/2016/11/29/13/24/balloons-1869816__340.jpg', }, h_w_img: { type: Number, default: 30 }, }, watch:{ }, computed: { style_w_h() { return this.set_style_w_h(); }, style_w_h_img() { let that = this; var height = parseInt(that.h_w_img); var width = parseInt(that.h_w_img); var style = ''; if (height > 0) { style = `height:${height*2}rpx;`; } if (width > 0) { style += `width:${width*2}rpx;z-index: 2;`; } return style; }, }, created: function() { let that = this; try { //app苹果二维码不居中 //#ifndef MP let isAndroid = false ; const res = uni.getSystemInfoSync(); if(res.platform == 'android'){ isAndroid = true ; }else{ isAndroid = false ; } if (!isAndroid) { that.marginLeft = 46; } that.isAndroid = isAndroid ; try { const add_num = uni.getStorageSync(that.add_num_key); if (add_num) { that.add_num = add_num; } } catch (e) { // error } // #endif } catch (e) { // error } //#ifdef MP //that.marginLeft = 40; // #endif }, methods: { set_style_w_h(){ let that = this; var height = parseInt(that.height); var width = parseInt(that.width); var style = ''; var height = height*2 ; var width = width*2 ; //#ifndef MP var add = that.add_num ; height += add; width += add; // #endif if (height > 0) { style = `height:${height}rpx;`; } if (width > 0) { style += `width:${width}rpx;`; } return style; }, hideQrcode() { this.$emit("hideQrcode") }, // 二维码生成工具 crtQrCode() { let that = this; //#ifndef MP new qrCode(that.qrcode_id, { text: this.url, width: that.width, height: that.height, colorDark: that.themeColor,//#333333 colorLight: "#FFFFFF", correctLevel: qrCode.CorrectLevel.H, }) // #endif //#ifdef MP that.createQrCode(this.url, that.qrcode_id, that.width, that.height,that.themeColor,that.is_themeImg,that.themeImg,that.h_w_img); // #endif //that.createQrCode(this.url, that.qrcode_id, that.width, that.height); }, //#ifdef MP createQrCode: function(url, canvasId, cavW, cavH,cavColor,haveImg,imgurl,imgsize) { //调用插件中的draw方法,绘制二维码图片 qr_we.api.draw(url, canvasId, cavW, cavH,cavColor,haveImg,imgurl,imgsize, this, this.canvasToTempImage); // setTimeout(() => { this.canvasToTempImage();},100); }, // #endif //获取临时缓存照片路径,存入data中 canvasToTempImage: function() { var that = this; }, saveImage: function() { var that = this; uni.canvasToTempFilePath({ canvasId: that.qrcode_id, success: function(res) { var tempFilePath = res.tempFilePath; // console.log(tempFilePath); that.imagePath = tempFilePath; //保存到相册 // uni.saveFile({ // tempFilePath: tempFilePath, // success: function (res2) { // var savedFilePath = res2.savedFilePath; // } // }); uni.saveImageToPhotosAlbum({ filePath : tempFilePath , success: function (res3) { uni.showModal({ title: '提示', content: '保存成功', confirmText: '确定', showCancel: false, confirmColor: '#33CCCC', success(res4) { } }) }, }); }, fail: function(res) { // console.log(res); } }, that); }, //微信小程序支持:长按二维码,提示是否保存相册 //安卓APP长按校正二维码 longtapCode(){ var that = this; //#ifndef MP uni.showModal({ title: '校正二维码', content: '二维码是否异常', confirmText: '确定', confirmColor: '#33CCCC', success(res) { if (res.confirm) { that.rectify_code(); } } }) // #endif //#ifdef MP-WEIXIN uni.showModal({ title: '提示', content: '是否保存到相册', confirmText: '确定', confirmColor: '#33CCCC', success(res) { if (res.confirm) { that.saveImage(); } } }) // #endif }, //安卓有些手机不正常,长按可选择矫正 rectify_code(){ var that = this; let add_num = that.add_num ; add_num += 30 ; that.add_num = add_num; that.crtQrCode();//重新生成才会立即覆盖 try { //第一次长按校正设置了就不用在设置 uni.setStorage({ key: that.add_num_key, data: add_num, success: function() { } }); } catch (e) { // error } }, }, mounted() {} } </script> <style scoped lang="scss"> // .qrcode-box { // position: fixed; // left: 0; // top: 0; // right: 0; // bottom: 0; // height: 100vh; // width: 100vw; // background-color: rgba(59, 59, 59, 0.6); // // opacity: 0.8; // text-align: center; // display: flex; // align-items: center; // display: none; // .qrcode-item { // flex: 1; // position: relative; // text-align: center; // .item-box { // width: 90%; // margin: auto; // display: inline-block; // margin-top: 30%; // padding-bottom: 30rpx; // // animation: show 0.7s; // .title { // font-size: 46rpx; // text-align: center; // margin-bottom: 24rpx; // } // .canvas { // margin: auto; // display: inline-block; // margin: auto; // } // background-color: #FFFFFF; // } // } // } .box-qrcode{ text-align: center; position: relative; .box-img-qrcode{ position: absolute; display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 2; } } image{ width: 60upx; height: 60upx; border-radius: 50%; } .canvas-qrcode { margin: auto; display: inline-block; float: left; } .opacity-qrcode { opacity: 0; display: block; } .show-qrcode { display: block; animation: fade 0.7s; // -moz-animation: fade 0.5s; /* Firefox */ // -webkit-animation: fade 0.5s; /* Safari 和 Chrome */ // -o-animation: fade 0.5s; } .hide-qrcode { animation: hide 0.7s; } @keyframes fade { from { opacity: 0.8; } to { opacity: 1; } } @keyframes hide { from { opacity: 1; } to { opacity: 0; } } </style>