uniApp开发教程之uniApp实现刮刮奖效果
查看视频教程或者获取有关《uniApp开发教程》更多信息

uniApp实现刮刮奖效果代码

<template>
	<view>
		<div style="background-color: red; padding: 40px;">
			<div style="position: relative;">
				<div id="gift" class="gift">恭喜,您获得了华为手机</div>
				<canvas class="canvas" @touchstart="start" @touchend="end" @touchmove="move" canvas-id="firstCanvas"></canvas>
			</div>
		</div>

	</view>
</template>

<script>
	var ctx;
	var sx = 0,
		sy = 0,
		perNum = 0;
	var giftWidth=0,giftHeight=0;	
	var canvasId = "firstCanvas";
	export default {
		data: function() {
			return {
				w: 200,
				h: 100,
				isfinish:false,
				isClear:false
			}
		},
		onReady: function() {
			this.createCtx();
			this.giftWidth();
		},
		methods: {
			giftWidth:function(){
				const query = uni.createSelectorQuery().in(this);
				query.select('#gift').boundingClientRect(data => {
					giftWidth=data.width;
					giftHeight=data.height;
				}).exec();
			},
			finish:function(){
				this.isfinish=true;
			},
			done:function(){
				uni.showToast({
					title:"恭喜你中奖了"
				});
			},
			start: function(e) {
				if(this.isfinish){
					if(!this.isClear){
						this.isClear=true;
						this.done();
						ctx.moveTo(0, 0);
						ctx.clearRect(0,0, 200, 100);
						ctx.stroke()
						ctx.draw(true);
					}
					
					return false;
				} 
				sx = e.touches[0].x;
				sy = e.touches[0].y;
				console.log(e.touches[0].x + "  " + e.touches[0].y)
				this.getFilledPercentage();
				
			},
			end: function(e) {
				if(this.isfinish) return false;

			},
			move: function(e) {
				if(this.isfinish){
					if(!this.isClear){
						this.isClear=true;
						this.done();
						ctx.moveTo(0, 0);
						ctx.clearRect(0,0, 200, 100);
						ctx.stroke()
						ctx.draw(true);
					}
					
					return false;
				} 
				ctx.moveTo(sx, sy);
				ctx.clearRect(sx, sy, 10, 10)
				ctx.stroke()
				ctx.globalAlpha = 0;

				ctx.draw(true);
				this.getFilledPercentage();
				
				sx = e.touches[0].x;
				sy = e.touches[0].y;
			},
			createCtx: function() {
				ctx = uni.createCanvasContext(canvasId);
				this.createRect();

			},
			createRect: function() {
				ctx.setFillStyle('#646464')
				ctx.fillRect(0, 0, 300, 200);
				ctx.draw(true)
			},
			getFilledPercentage: function() {
				var that=this;
				uni.canvasGetImageData({
					canvasId: canvasId,
					x: (that.w-giftWidth)/2-5,
					y: (that.h-giftHeight)/2-5,
					width: giftWidth,
					height: giftHeight,
					success: function(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]);
							}
						}
						perNum = (transPixels.length / (pixels.length / 4) * 100).toFixed(2);
						if(perNum>=60){						
							console.log("finish");
							that.finish();;
						}
						console.log(perNum)
					}
				});

			}

		}
	}
</script>

<style>
	.gift {
		position: absolute;
		left: 50%;
		top: 50%;
		margin-left: -100px;
		margin-top: -16px;
		font-size: 16px;
		border:1px solid #eee;
		padding:10px;
		border-radius:10px;
		box-sizing:border-box;
		text-align:center;
	}
	.canvas{
		width: 200px; 
		height: 100px; 
		margin: 0 auto;
	}
</style>