当前位置: 首页 > news >正文

uniapp canvas做的刮刮乐解决蒙层能自定义图片

在这里插入图片描述

最近给湖南中烟做元春活动,一个月要开发4个小活动,这个是其中一个难度一般,最难的是一个类似鲤鱼跃龙门的小游戏,哎,真实为难我这个“拍黄片”的。下面是主要代码。

			<canvas :style="{'width':width+'px','height':height+'px'}" canvas-id="myCanvas" id="myCanvas"@touchstart="touchstart" @touchend="touchend" @touchmove="touchmove"></canvas>
<script>import {setShareConfig} from './share'export default {data() {return {rewardList:{},textBoxFont: '',textBoxBt: '',textBoxState: false,touchStartState:true,tishiState:false,clickState:false,activity: {},reward:{"reward_icon": "","reward_img": ""},seckillContent: '',prizeBoxState: false,count: 0, // 初始值为10秒readState: false,myPrizeState: false,ctx: null,width: 0,height: 0,chance_count: 0, //剩余次数validTime: '', //有效时间disabled: true, // 是否禁止刮卡readyState: false, // 是否开始绘制endState: false, // 结束刮卡状态watermark: '', // 水印文字watermarkColor: '#c5c5c5', // 水印文字颜色watermarkSize: 14, // 水印文字大小title: '', // 提示文字titleColor: '#888', // 提示文字颜色titleSize: 24, // 提示文字大小startX: 0, // 触摸x轴位置startY: 0, // 触摸y轴位置touchSize: 40, // 触摸画笔大小percentage: 70, // 刮开百分之多少的时候开奖}},onShow() {this.$nextTick(() => {let content = uni.createSelectorQuery().select(".content");content.boundingClientRect((data) => {this.width = data.width;this.height = data.height;this.ctx = uni.createCanvasContext('myCanvas', this);setTimeout(e => {this.init();}, 20);}).exec()})},onLoad: function(options) {},methods: {convertSecToDHMS(seconds) {var days = Math.floor(seconds / (24 * 60 * 60));seconds %= (24 * 60 * 60);var hours = Math.floor(seconds / (60 * 60));seconds %= (60 * 60);var minutes = Math.floor(seconds / 60);var seconds = seconds % 60;if (this.res.is_end) {return {days: 0,hours: 0,minutes: 0,seconds: 0};}return {days: days,hours: hours,minutes: minutes,seconds: seconds};},readHide() {if (this.count == 0) {this.readState = false;}},convertSecToDHMS(seconds) {var days = Math.floor(seconds / (24 * 60 * 60));seconds %= (24 * 60 * 60);var hours = Math.floor(seconds / (60 * 60));seconds %= (60 * 60);var minutes = Math.floor(seconds / 60);var seconds = seconds % 60;if (this.res.activity.difference_time <= 0) {return {days: 0,hours: 0,minutes: 0,seconds: 0};}return {days: days,hours: hours,minutes: minutes,seconds: seconds};},init() {this.endState = false;this.readyState = false;this.ctx.clearRect(0, 0, this.width, this.height); // 清除画布上在该矩形区域内的内容(x,y,宽,高)。this.ctx.setFillStyle('rgba(255, 255, 255, 0.5)'); // 填充颜色this.ctx.fillRect(0, 0, this.width, this.height); // 填充区域(x,y,宽,高)/*** 绘制文字水印*/var width = this.watermark.length * this.watermarkSize;this.ctx.save(); // 保存当前的绘图上下文。//this.ctx.rotate(-10 * Math.PI / 180); // 以原点为中心,原点可以用 translate方法修改。顺时针旋转当前坐标轴。多次调用rotate,旋转的角度会叠加。let x = 0;let y = 0;let i = 0;//自定义蒙层图片this.ctx.drawImage('../../static/jhy/ycsm/guazhi.png', 0, 0, this.width, this.height);this.ctx.restore(); // 恢复之前保存的绘图上下文。/*** 绘制标题*/this.ctx.setTextAlign("center"); // 用于设置文字的对齐this.ctx.setTextBaseline("middle"); // 用于设置文字的水平对齐this.ctx.setFillStyle(this.titleColor); // 填充颜色this.ctx.setFontSize(this.titleSize); // 设置字体的字号this.ctx.fillText(this.title, this.width / 2, this.height / 2); // 填充的文本(文字,x,y)this.ctx.draw(); // 将之前在绘图上下文中的描述(路径、变形、样式)画到 canvas 中。this.readyState = true; // 完成绘制},// 手指触摸动作开始touchstart(e) {if (this.disabled || this.endState) {return;}this.startX = e.touches[0].x;this.startY = e.touches[0].y;},// 手指触摸后移动touchmove(e) {// if (this.chance_count <= 0) {// 	return;// }if (this.disabled || this.endState) {return;}this.ctx.clearRect(this.startX, this.startY, this.touchSize, this.touchSize); // 清除画布上在该矩形区域内的内容(x,y,宽,高)。this.ctx.draw(true); // false:本次绘制是否接着上一次绘制,true:保留当前画布上的内容//记录移动点位this.startX = e.touches[0].x;this.startY = e.touches[0].y;},// 手指触摸动作结束touchend(e) {if (this.disabled || this.endState) {return;}// 返回一个数组,用来描述 canvas 区域隐含的像素数据,在自定义组件下,第二个参数传入自定义组件实例 this,以操作组件内 <canvas> 组件。uni.canvasGetImageData({canvasId: 'myCanvas',x: 0,y: 0,width: this.width,height: this.height,success: (res) => {console.log(res);let pixels = res.data;let transPixels = [];for (let i = 0; i < pixels.length; i += 4) {if (pixels[i + 3] < 128) {transPixels.push(pixels[i + 3]);}}var percent = (transPixels.length / (pixels.length / 4) * 100).toFixed(2);if (percent >= this.percentage) {this.success();}},fail: (e) => {console.log(e);},}, this);},// 成功,清除所有图层success: function(e) {if (this.endState) {return;}this.endState = true;this.ctx.moveTo(0, 0); // 把路径移动到画布中的指定点,不创建线条。用 stroke() 方法来画线条。this.ctx.clearRect(0, 0, this.width, this.height); // 清除画布上在该矩形区域内的内容(x,y,宽,高)。this.ctx.stroke(); // 画出当前路径的边框。默认颜色色为黑色。this.ctx.draw(true);this.prizeBoxState = true;},// 重置reset() {this.init();},}}
</script>
http://www.lryc.cn/news/288532.html

相关文章:

  • 利用SPI,结合数据库连接池durid进行数据服务架构灵活设计
  • 自动驾驶的决策层逻辑
  • 排序算法——希尔排序算法详解
  • Docker 容器内运行 mysqldump 命令来导出 MySQL 数据库,自动化备份
  • 【Java万花筒】数字信号魔法:Java库的魅力解析
  • 面试高频知识点:2线程 2.1 线程池 2.1.2 JDK中常见的线程池实现有哪些?
  • Azure Private endpoint DNS 记录是如何解析的
  • windows 安装sql server 华为云文档
  • 相同主题文章竟同时发表在同一个2区期刊 | 孟德尔随机化周报(1.10-1.16)
  • 网络安全的使命:守护数字世界的稳定和信任
  • 【七、centos要停止维护了,我选择Almalinux】
  • 架构师之路(十六)计算机网络(传输层)
  • python 调用SumatraPDF 静默打印PDF
  • nginx部署https域名ssl证书
  • Python学习之路-Django基础:HelloDjango
  • 完成NAT实验
  • uniapp 用web-view嵌套网页地址并传参
  • 时序数据库Tdengine 批量插入避免因为主键ts时间重复导致数据被覆盖掉
  • 【小白教程】幻兽帕鲁服务器一键搭建 | 支持更新 | 自定义配置
  • Chatgpt的崛起之路
  • java截取视频最后一帧照片作为封面
  • ARM Cortex-A 内核的运行模式切换
  • 分布式因果推断在美团履约平台的探索与实践
  • 254.【2023华为OD机试真题】-任务处理(贪心算法-JavaPythonC++JS实现)
  • 《WebKit 技术内幕》学习之十五(5):Web前端的未来
  • MySQL十部曲之四:MySQL中的数据类型
  • flyway使用配置参数和注意事项介绍
  • ubuntu_qtcreator安装
  • uniapp map自定义气泡窗
  • 数据分析的理念、流程、方法、工具(上)