• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >html5 > 移动端Touch事件与H5-Canvas像素点检测实现刮刮乐

移动端Touch事件与H5-Canvas像素点检测实现刮刮乐

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-03

本文主要包含Touch,Canvas,刮刮乐等相关知识,匿名希望在学习及工作中可以帮助到您


最近又被支付宝的集福字刷屏了
我到底还是没看到敬业福?(T?T) 心塞
今天给大家带来移动端的刮刮乐实现
效果就是这样的

手滑动触发刮卡

当刮卡面积达到70%以上,自动刮开全部灰色图层


代码不是很多
全部代码就这些

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <meta content="width=device-width,maximum-scale=1.0,minimum-scale=1.0,initial-scale=1.0,user-scalable=no" name="viewport">
    <title>Scrape</title>
    <style>
        #myCanvas {            
        background-repeat: no-repeat;            
        background-position: center;            
        background-size: 200px 200px;        
        }
    </style></head><body>
    <canvas id="myCanvas" width=300 height=300></canvas>
    <script>
        var canvas = document.getElementById('myCanvas'),
            ctx = canvas.getContext('2d'),
            w = canvas.width;
            h = canvas.height;
            area = w * h;
            l = canvas.offsetLeft;
            t = canvas.offsetTop,
            img = new Image();        
            var randomImg = function(){
            var random = Math.random();            
            if(random < 0.4){
                img.src = './1.png';
            }else if(random > 0.6){
                img.src = './2.png';
            }else{
                img.src = './award.jpg';
            }
        };        var bindEvent = function(){
            canvas.addEventListener('touchmove', moveFunc, false);
            canvas.addEventListener('touchend', endFunc, false);
        };        var moveFunc = function(e){
            var touch = e.touches[0],
                posX = touch.clientX - l,
                posY = touch.clientY - t;
            ctx.beginPath();
            ctx.arc(posX, posY, 15, 0, Math.PI * 2, 0);
            ctx.fill();
        };        var endFunc = function(e){
            var data = ctx.getImageData(0, 0, w, h).data,
                scrapeNum = 0;            
                for(var i = 3, len = data.length; i < len; i += 4){                
                if(data[i] === 0){
                    scrapeNum++;
                }
            }            if(scrapeNum > area * 0.7){
                ctx.clearRect(0, 0, w, h);
                canvas.removeEventListener('touchmove', moveFunc, false);
                canvas.removeEventListener('touchend', endFunc, false);
            }
        }        var init = (function(){
            ctx.fillStyle = "#ccc";
            ctx.fillRect(0, 0, w, h);
            randomImg();            
            img.addEventListener('load', function(){
                canvas.style.backgroundImage = 'url(' + img.src +')';
                ctx.globalCompositeOperation = 'destination-out';
                bindEvent();
            });
        })();    </script></body></html>

下面我就简单说明一下
首先在页面中我们只需要一个canvas元素

<canvas id="myCanvas" width=300 height=300></canvas>

CSS中的我们需要对canvas的背景图片事先设置好样式

#myCanvas {    
background-repeat: no-repeat;    
background-position: center;    
background-size: 200px 200px;}

脚本中我们首先要声明所需变量

var canvas = document.getElementById('myCanvas'),
    ctx = canvas.getContext('2d'),
    w = canvas.width;
    h = canvas.height;
    area = w * h;
    l = canvas.offsetLeft;
    t = canvas.offsetTop,
    img = new Image();

获取canvas对象以及它的上下文对象
area变量是为下面的像素点检测所准备
img用来进行图片预加载


最关键的函数在于init初始化函数

var init = (function(){
    ctx.fillStyle = "#ccc";
    ctx.fillRect(0, 0, w, h);
    randomImg();            
    img.addEventListener('load', function(){
        canvas.style.backgroundImage = 'url(' + img.src +')';
        ctx.globalCompositeOperation = 'destination-out';
        bindEvent();
    });
})();

流程如下:

  • 将整个canvas覆盖灰色图层

  • 随机图片

  • 图片预加载

  • 加载完毕后,设置图片为canvas背景

  • 刮卡前,设置ctx.globalCompositeOperation = 'destination-out';

  • 为canvas绑定监听事件,涂卡

这个globalCompositeOperation才是刮刮乐的关键
关于这个属性的用法可以戳这里


var randomImg = function(){
    var random = Math.random();    if(random < 0.4){
        img.src = './1.png';
    }else if(random > 0.6){
        img.src = './2.png';
    }else{
        img.src = './award.jpg';
    }
};

randomImg函数的功能就是随机图片
随机图片就需要利用Math.random()随机数


canvas我们需要绑定两个函数
touchmove和touchend

var moveFunc = function(e){
    var touch = e.touches[0],
        posX = touch.clientX - l,
        posY = touch.clientY - t;
    ctx.beginPath();
    ctx.arc(posX, posY, 15, 0, Math.PI * 2, 0);
    ctx.fill();};

滑动屏幕就要画一个圆
由于设置了destination-out ,所以产生了刮卡的效果
还要注意,每次触发都要ctx.beginPath();
否则ctx.fill();会连接之前划过的圆,大面积刮涂

var endFunc = function(e){
    var data = ctx.getImageData(0, 0, w, h).data,
        scrapeNum = 0;    
        for(var i = 3, len = data.length; i < len; i += 4){        
        if(data[i] === 0){
            scrapeNum++;
        }
    }    if(scrapeNum > area * 0.7){
        ctx.clearRect(0, 0, w, h);
        canvas.removeEventListener('touchmove', moveFunc, false);
        canvas.removeEventListener('touchend', endFunc, false);
    }
}

手抬起时,就会触发touchend
在这个函数中,我们利用了ctx.getImageData()获取了canvas的像素信息
关于这个函数的用法可以戳这里
当灰色图层被刮开后,后面就是canvas的背景
所以我们可以通过判断像素信息RGBA中的A是否为0来判断图层是否被刮开
scrapeNum就代表被刮开的像素点
所以通过scrapeNum > area * 0.7的判断
当刮开的范围大于总范围的70%时
清除整个灰色图层

以上就是移动端Touch事件与H5-Canvas像素点检测实现刮刮乐的内容,更多相关内容请关注微课江湖()!

您可能想查找下面的文章:

  • 整理HTML5移动端开发的常用触摸事件
  • html5构建触屏网站之touch事件介绍
  • html5 touch事件实现触屏页面上下滑动(一)
  • html5 touch事件实现触屏页面上下滑动(二)
  • html5 touch事件实现页面上下滑动效果【附代码】
  • html5 touch事件实现触屏页面上下滑动
  • HTML5的触摸事件
  • html5 touch事件实现触屏页面上下滑动(一)
  • 移动端WEB开发中click,touch,tap事件使用详解
  • html5手机触屏touch事件的详细介绍

相关文章

  • 2018-12-03HTML5中div和section以及article的区别分析
  • 2018-12-03html5停止(暂停)当前播放的音频或视频的方法pause()
  • 2017-08-06HTML5拖放API实现拖放排序的实例代码
  • 2018-12-03HTML5 多快会成为主流?
  • 2017-08-06基于HTML5代码实现折叠菜单附源码下载
  • 2018-12-03详解html5 canvas常用api总结(二)--绘图API
  • 2017-08-06Web时代变迁及html5与html4的区别
  • 2017-08-06html5 Canvas画图教程(5)—canvas里画曲线之arc方法
  • 2018-12-03移动webapp前端ui用哪个框架好?
  • 2018-12-03H5设置或返回音频/视频播放的当前位置(以秒计)的属性currentTime

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • 详细介绍HTML5的article和section的区别
    • HTML5+CSS3实现拖放(Drag and Drop)示例
    • 2017年前端领域可能迎来的6个发展趋势
    • html5中float属性造成的换行如何处理
    • 实例讲解HTML5的meta标签的一些应用 _html5教程技巧
    • canvas的绘图api使用详解
    • html5各种页面切换效果和模态对话框用法总结_html5教程技巧
    • HTML5 Canvas处理头像上传的图文代码详细介绍
    • 基于html5绘制圆形多角图案
    • 安全攻防入门教程:10个安全攻防零基础入门教程推荐

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有