用Canvas画一个刮刮乐

简介: 用Canvas画一个刮刮乐

Canvas 通过 JavaScript 来绘制 2D图形。Canvas 是逐像素进行渲染的。开发者可以通过javascript脚本实现任意绘图。Canvas元素是HTML5的一部分,允许脚本语言动态渲染位图像。canvas是HTML5中的新元素,使用javascript用它来绘制图形、图标、以及其它任何视觉性图像。


在国外问答网站Quora上,许多开发者对于HTML5 Canvas元素的实用性进行了一系列探讨。Canvas非常灵活,能够很好地融合JavaScript代码并在浏览器内绘制华丽的图形。


用Canvas画一个刮刮乐步骤:

一:创建一个画布(Canvas)

注意: 标签通常需要指定一个id属性 (脚本中经常引用), width 和 height 属性定义的画布的大小.

<canvas>简单实例如下:
<canvas id="myCanvas" width="200" height="100"></canvas> 
二:使用 JavaScript 来绘制图像

canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成:

var isdown = false,
cover = document.getElementById("cover"),//首先,找到 <canvas> 元素:
covercanvas = cover.getContext("2d");//然后,创建 context 对象:

三:绘制矩形

//设置fillStyle属性可以是CSS颜色,渐变,或图案。fillStyle 默认设置是#000000(黑色)。

//canvas 是一个二维网格。canvas 的左上角坐标为 (0,0),上面的 fillRect 方法拥有参数 (0,0,400,200)。意思是:在画布上绘制 400x200 的矩形,从左上角开始 (0,0)。

covercanvas.fillStyle="transparent";
covercanvas.fillRect(0,0,400,200);
四:移动端阻止浏览器默认功能

由于是长按事件,要在移动端阻止浏览器默认功能。

function isDown(e){
e.preventDefault();
isdown=true; 
}
function isUp(e){
isdown=false; 
}
..........
五:鼠标事件

需要改变的内容为_width,_height,touchTop,touchLeft这几个参数,根据自身画布的位置自行计算即可。

function draw(e) {
           e.preventDefault();
           if(isdown) {
               if(e.changedTouches) {
                   e = e.changedTouches[e.changedTouches.length - 1];
               }
               var _height = parseInt((window.innerHeight - 400) / 2),
                   _width = parseInt((window.innerWidth - 400) / 2),
                   touchTop = e.clientY - _height,
                   touchLeft = e.clientX - _width;
               with(covercanvas) {
                   beginPath();
                   arc(touchLeft, touchTop, 10, 0, Math.PI * 2);
                   fill();
               }
           }
           //alert(touchTop);
       }
实际例子(完整代码)
<!doctype html>
<html>
   <head>
       <meta charset="utf-8">
       <title>用Canvas画一个刮刮乐</title>
       <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" />
       <style>
           .content,
           .cover {
               width: 400px;
               height: 400px;
               position: absolute;
               left: 50%;
               top: 50%;
               margin: -200px 0 0 -200px;
           }
           .content {
               font-size: 48px;
               line-height: 200px;
               text-align: center;
               color: red;
           }
           h3 {
               text-align: center;
               line-height: 200px;
               color: deepskyblue;
           }
       </style>
   </head>
   <body>
       <h3>刮刮乐</h3>
       <div class="content">蚂蚁会员vip</div>
       <!-- 创建一个画布(Canvas)-->
       <canvas id="cover" class="cover" width="400" height="400"></canvas>
   </body>
   <script>
       /*使用 JavaScript 来绘制图像*/
       var isdown = false,
           cover = document.getElementById("cover"), //首先,找到 <canvas> 元素:
           covercanvas = cover.getContext("2d"); //然后,创建 context 对象:
       //下面的两行代码绘制一个灰色的矩形:
       //设置fillStyle属性可以是CSS颜色,渐变,或图案。fillStyle 默认设置是#000000(黑色)。
       covercanvas.fillStyle = "transparent";
       covercanvas.fillRect(0, 0, 400, 200);
       //canvas 是一个二维网格。
       //canvas 的左上角坐标为 (0,0)
       //上面的 fillRect 方法拥有参数 (0,0,400,200)。
       //意思是:在画布上绘制 400x200 的矩形,从左上角开始 (0,0)。
       function fillter(canvas) {
           canvas.fillStyle = "#ccc";
           canvas.fillRect(0, 0, 400, 200);
       }
       function isDown(e) {
           e.preventDefault();
           isdown = true;
       }
       function isUp(e) {
           isdown = false;
       }
       function draw(e) {
           e.preventDefault();
           if(isdown) {
               if(e.changedTouches) {
                   e = e.changedTouches[e.changedTouches.length - 1];
               }
               var _height = parseInt((window.innerHeight - 400) / 2),
                   _width = parseInt((window.innerWidth - 400) / 2),
                   touchTop = e.clientY - _height,
                   touchLeft = e.clientX - _width;
               with(covercanvas) {
                   beginPath();
                   arc(touchLeft, touchTop, 10, 0, Math.PI * 2);
                   fill();
               }
           }
       }
       fillter(covercanvas);
       covercanvas.globalCompositeOperation = 'destination-out';
       cover.addEventListener('touchstart', isDown);
       cover.addEventListener('touchmove', draw);
       cover.addEventListener('touchend', isUp);
       cover.addEventListener('mousemove', draw);
       cover.addEventListener('mousedown', isDown);
       cover.addEventListener('mouseup', isUp);
   </script>
</html>

Canvas由一个可绘制地区HTML代码中的属性定义决定高度和宽度。JavaScript代码可以访问该地区,通过一套完整的绘图功能类似于其他通用二维的API,从而生成动态的图形。

相关文章
|
11月前
|
XML JavaScript 前端开发
如何解析一个 HTML 文本
【10月更文挑战第23天】在实际应用中,根据具体的需求和场景,我们可以灵活选择解析方法,并结合其他相关技术来实现高效、准确的 HTML 解析。随着网页技术的不断发展,解析 HTML 文本的方法也在不断更新和完善,
|
Web App开发 编解码 JavaScript
【Android App】在线直播之搭建WebRTC的服务端(图文解释 简单易懂)
【Android App】在线直播之搭建WebRTC的服务端(图文解释 简单易懂)
668 0
|
JSON 测试技术 API
Postman Test 校验入门指南:轻松进行接口测试并验证响应
Postman 是一个广泛使用的 API 开发工具,它允许开发人员测试 API 的各个方面,包括请求、响应、身份验证等等,其中最常用的功能之一就是 Test 校验。那今天就一起来看看 Postman 的 Test 校验该如何使用。
Postman Test 校验入门指南:轻松进行接口测试并验证响应
|
SQL 存储 关系型数据库
如何定位慢查询SQL以及优化
如何定位慢查询SQL以及优化
624 0
如何定位慢查询SQL以及优化
|
弹性计算 固态存储
阿里云服务器的vCPU是什么意思?虚拟CPU?
阿里云服务器的vCPU是什么意思?虚拟CPU?阿里云服务器vCPU和CPU是什么意思?CPU和vCPU有什么区别?一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定,CPU是中央处理器,一个CPU可以包含若干个物理核,通过超线程HT(Hyper-Threading)技术可以将一个物理核变成两个逻辑处理核。vCPU(virtual CPU)是ECS实例的虚拟处理核。云服务器吧来详细说下阿里云服务器CPU和vCPU的区别:
3277 0
|
安全 Linux 网络安全
|
Java Linux Docker
阿里云的使用初体验
学生党在面对虚拟机的时候首先还是推荐使用阿里云的虚拟机,原因让我娓娓道来;
|
设计模式 JavaScript 前端开发
Android开发者值得深入思考的几个问题,薪资翻倍
Android开发者值得深入思考的几个问题,薪资翻倍
Android开发者值得深入思考的几个问题,薪资翻倍
|
前端开发
Markdown上手指南
markdown 是一门很实用的标记语言,若是有HTML 基础学起来会非常快。 演示效果均是从typora 展示的,为什么用它,因为它是一个成熟的 md 编辑器! • markdown 所见即所得, 部分还增加了人性化的交互(比如代码高亮) • 支持公式 • 支持大部分的拓展语法 • 支持主流的流程图渲染
212 0
|
存储 安全 前端开发
SpringCloud 源码剖析(五)Eureka源码之服务端接收注册信息
SpringCloud 源码剖析(五)Eureka源码之服务端接收注册信息
217 0
SpringCloud 源码剖析(五)Eureka源码之服务端接收注册信息