You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
284 lines
6.6 KiB
284 lines
6.6 KiB
<template>
|
|
<!-- 推广海报 -->
|
|
<view>
|
|
<view class="myextension">
|
|
<canvas class="mycanvas" canvas-id="mycanvas" :style="'width:' + (windowWidth-30) + 'px;height:560px'"></canvas>
|
|
<!-- #ifdef H5 -->
|
|
<block>
|
|
<image class="imgs" :style="'width:' + (windowWidth-30) + 'px;height:560px'" :src="imgUrl" mode=""></image>
|
|
</block>
|
|
<!-- #endif -->
|
|
<!-- #ifndef H5 -->
|
|
<view class="saveImg" @longtap="saveImg" :style="'background:' + colors">保存海报</view>
|
|
<!-- #endif -->
|
|
<!-- #ifdef H5 -->
|
|
<p class="tips">长按图片进行保存</p>
|
|
<!-- #endif -->
|
|
</view>
|
|
<loading v-if="isShow == true"></loading>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
var app = getApp();
|
|
import loading from "../../commponent/public/loading";
|
|
export default {
|
|
data() {
|
|
return {
|
|
isShow: true,
|
|
colors: '',
|
|
windowHeight: '',
|
|
windowWidth: '',
|
|
imgUrl: ''
|
|
};
|
|
},
|
|
|
|
components: {
|
|
loading
|
|
},
|
|
props: {},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面加载
|
|
*/
|
|
onLoad: function(options) {
|
|
this.setData({
|
|
colors: app.globalData.newColor
|
|
});
|
|
this.getSystem()
|
|
setTimeout(() => {
|
|
this.setData({
|
|
isShow: false
|
|
});
|
|
}, 600);
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面初次渲染完成
|
|
*/
|
|
onReady: function() {},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面显示
|
|
*/
|
|
onShow: function() {},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面隐藏
|
|
*/
|
|
onHide: function() {},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面卸载
|
|
*/
|
|
onUnload: function() {},
|
|
|
|
/**
|
|
* 页面相关事件处理函数--监听用户下拉动作
|
|
*/
|
|
onPullDownRefresh: function() {},
|
|
|
|
/**
|
|
* 页面上拉触底事件的处理函数
|
|
*/
|
|
onReachBottom: function() {},
|
|
|
|
/**
|
|
* 用户点击右上角分享
|
|
*/
|
|
onShareAppMessage: function() {},
|
|
methods: {
|
|
getSystem() {
|
|
let that = this;
|
|
uni.getSystemInfo({
|
|
success: function(res) {
|
|
that.setData({
|
|
windowHeight: res.windowHeight,
|
|
windowWidth: res.windowWidth
|
|
});
|
|
that.createPoster()
|
|
}
|
|
});
|
|
},
|
|
createPoster() { //生成海报
|
|
// 0.76
|
|
var ctx = uni.createCanvasContext('mycanvas', this)
|
|
ctx.fillStyle = '#FFFFFF'
|
|
ctx.fillRect(0, 0, this.windowWidth - 30, 500)
|
|
//绘制背景图片
|
|
ctx.drawImage('/static/images/user/shop.png', 0, 0, this.windowWidth - 30, 500)
|
|
ctx.save()
|
|
// 绘制圆角二维码
|
|
// let avatar_width = 60; //头像宽度
|
|
// let avatar_height = 60; //头像高度
|
|
// let avatar_x = 15; //头像的x坐标
|
|
// let avatar_y = 15; //头像的y坐标
|
|
// let radius = 8 //头像的圆角弧度
|
|
// this.setRadius(ctx, avatar_width, avatar_height, avatar_x, avatar_y, radius)
|
|
// #ifndef H5
|
|
setTimeout(() => { //必须延时执行 不然h5不显示
|
|
ctx.save();
|
|
ctx.draw()
|
|
}, 200)
|
|
// #endif
|
|
// #ifdef H5
|
|
setTimeout(() => { //必须延时执行 不然h5不显示
|
|
ctx.save();
|
|
ctx.draw(true, () => {
|
|
uni.canvasToTempFilePath({
|
|
canvasId: 'mycanvas',
|
|
success: (res) => {
|
|
this.imgUrl = res.tempFilePath
|
|
}
|
|
})
|
|
})
|
|
}, 500)
|
|
// #endif
|
|
},
|
|
setRadius(ctx, avatar_width, avatar_height, avatar_x, avatar_y, radius) {
|
|
/**
|
|
* 绘制圆角
|
|
*/
|
|
ctx.arc(avatar_x + radius, avatar_y + radius, radius, Math.PI, Math.PI * 3 / 2);
|
|
ctx.lineTo(avatar_width - radius + avatar_x, avatar_y);
|
|
ctx.arc(avatar_width - radius + avatar_x, radius + avatar_y, radius, Math.PI * 3 / 2, Math.PI * 2);
|
|
ctx.lineTo(avatar_width + avatar_x, avatar_height + avatar_y - radius);
|
|
ctx.arc(avatar_width - radius + avatar_x, avatar_height - radius + avatar_y, radius, 0, Math.PI * 1 / 2);
|
|
ctx.lineTo(radius + avatar_x, avatar_height + avatar_y);
|
|
ctx.arc(radius + avatar_x, avatar_height - radius + avatar_y, radius, Math.PI * 1 / 2, Math.PI);
|
|
// 开始填充
|
|
ctx.strokeStyle = "#fff";
|
|
ctx.fill() //保证图片无bug填充
|
|
ctx.clip(); //画了圆 再剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内
|
|
|
|
ctx.drawImage('/static/images/ewm.png', avatar_x, avatar_y, avatar_width, avatar_height);
|
|
ctx.closePath()
|
|
ctx.restore();
|
|
},
|
|
saveImg() {
|
|
console.log(123)
|
|
//保存图片
|
|
uni.showLoading({
|
|
title: '保存中...'
|
|
});
|
|
let that = this;
|
|
// #ifdef MP
|
|
uni.getSetting({
|
|
success(res) {
|
|
if (!res.authSetting['scope.writePhotosAlbum']) {
|
|
uni.hideLoading();
|
|
uni.openSetting({
|
|
success(res) { //拒绝授权后重新提示授权,并授权成功
|
|
}
|
|
});
|
|
} else {
|
|
setTimeout(() => {
|
|
uni.canvasToTempFilePath({
|
|
canvasId: 'mycanvas',
|
|
success: function(res) {
|
|
console.log(res);
|
|
uni.saveImageToPhotosAlbum({
|
|
filePath: res.tempFilePath,
|
|
success(re) {
|
|
uni.hideLoading();
|
|
uni.showToast({
|
|
title: '保存成功',
|
|
icon: 'success'
|
|
});
|
|
},
|
|
fail(err) {
|
|
uni.showToast({
|
|
title: '保存失败',
|
|
icon: 'none'
|
|
});
|
|
}
|
|
|
|
});
|
|
}
|
|
});
|
|
}, 1000);
|
|
}
|
|
}
|
|
|
|
});
|
|
// #endif
|
|
// #ifdef APP-PLUS
|
|
setTimeout(() => {
|
|
uni.canvasToTempFilePath({
|
|
canvasId: 'mycanvas',
|
|
success: function(res) {
|
|
console.log(res);
|
|
uni.saveImageToPhotosAlbum({
|
|
filePath: res.tempFilePath,
|
|
success(re) {
|
|
uni.hideLoading();
|
|
uni.showToast({
|
|
title: '保存成功',
|
|
icon: 'success'
|
|
});
|
|
},
|
|
fail(err) {
|
|
uni.showToast({
|
|
title: '保存失败',
|
|
icon: 'none'
|
|
});
|
|
}
|
|
|
|
});
|
|
}
|
|
});
|
|
}, 1000);
|
|
// #endif
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.myextension {
|
|
background-color: #FFFFFF;
|
|
overflow: hidden;
|
|
padding-bottom: 100upx;
|
|
}
|
|
|
|
.myextension image {
|
|
width: 100%;
|
|
height: 100%;
|
|
display: block;
|
|
}
|
|
|
|
.saveImg {
|
|
width: 300upx;
|
|
height: 80upx;
|
|
border-radius: 40upx;
|
|
box-shadow: 0 10upx 10upx #ddd;
|
|
background-color: pink;
|
|
line-height: 80upx;
|
|
text-align: center;
|
|
color: #fff;
|
|
margin: 0 auto;
|
|
margin-top: 60upx;
|
|
}
|
|
|
|
.mycanvas {
|
|
margin: 0 auto;
|
|
transform: translateY(30upx);
|
|
border-radius: 10upx;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.imgs {
|
|
position: absolute;
|
|
top: 30upx;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
border-radius: 10upx;
|
|
overflow: hidden;
|
|
}
|
|
.tips{
|
|
text-align: center;
|
|
color: #999;
|
|
font-size: 24upx;
|
|
margin-top: 50upx;
|
|
}
|
|
</style>
|