加载图片

获取图像有三种方式:

a : createImageData(),没有效率,一个像素一个像素的绘制;

b :

var img= document.getElementById("imageId");

c : 加载外部图片,这种方式需要等待外部图片加载完毕:

var img = new Image();

img.src = "some/location/imgname.jpg";

canvasのlengthとwidth

不要在css样式中这顶canvas的长和宽,它极有可能会导致canvas的显示不正常。

<canvas width="100px" height="200px"></canvas>

以上代码会正常显示canvas,canvas里面的内容也可以正常显示。

如果加上

canvas {
width: 200px;
height: 400px;
}

以上样式的话,那么canvas会被拉伸到200px*400px。换句话说,canvas确实是css指定的那么大,但是已经经过缩放或者拉伸了。

绘图

在指定的location(x, y)处画image图片。图片大小为图片的实际大小。

context.drawImage(image, x, y);

在指定的location(x, y)处画image图片。图片会被进行拉伸或压缩,大小为width*height,

context.drawImage(image, x, y, width, height);

在指定的location(x, y)处画image图片。图片已经被剪裁了,剪裁的位置为原始图片的(x_location, y_location)处,剪裁大小为x_width*y_width。图片会压缩为width*height大小。

context.drawImage(image, x_location, y_location, x_width, y_width, x, y, width, height);

写文本: 挺有用的

首先设置字体相关的信息:

context.font,用来设定文本的字体,如: "italic bold 20px Arial, Consolas"

context.textBaseline, 用来设定文本的位置。 "alphabetic|top|hanging|middle|ideographic|bottom",这些值是可以选择的。

如下用来填充文本,

context.fillStyle = "#112233";
context.fillText("something want to wirte", x, y);

如下用来描文本的边,

context.strokeStyle = "blue";
context.strokeText("something want to wirte", x, y);

阴影

context.shadowColor = "#aabbcc";  // 设置阴影的颜色

context.shadowBlur = 10;  // 设置阴影的锐利(官方的说话)程度,取值在1~20之间就可以,一般大于3

context.shadowOffsetX = 10;  // X轴方向上阴影的距离

context.shadowOffsetY = 10;  // Y轴方向上阴影的距离

阴影的想象返回包括,文本,图形,图片等。

填充图案

可能就是所谓的背景图片了

var pattern;
var bgimg = new Image(); bgimg.onload = function(){
  pattern = context.createPattern(bgimg, "repeat|repeat-x|repeat-y");
} context.fillStyle = pattern;
// context.fillRect(0, 0, canvas.width, canvas.height);
context.rect(0, 0, canvas.width, canvas.height);
context.fill();

渐变色背景

线性渐变

var linear = context.createLinearGradient(x_start, y_start, x_end, y_end);

(x_start, y_start)和(x_end, y_end)指定了渐变色的起点和终点,两点之间连成一条线。

linear.addColorStop(0, "color1");

linear.addColorStop(0.5, "color2");

linear.addColorStop(1, "color3");

context.fillStyle = linear;

起点之前的颜色为color1指定的颜色,终点之后的颜色为color3指定的颜色。

context.drawSomthing();

画完图之后,调用:context.fill();渐变背景色就显示出来了。。。

放射性渐变

var radial = context.createRadialGradient(x_start, y_start, radius_start, x_end, y_end, radius_end);

其它的基本一样。

canvas交互

canvas并不记录其上有什么图形,什么线条。它什么也不知道,仅仅是一个图片,甚至连一个容器都算不上。

那么如何使canvas具有交互能力呢?利用javascript!

首先javascript的构造函数:

function Circle(x, y, radius){
this.x = x;
this.y = y;
this.radius = radius;
this.color = "pink";
}

真心不了解javascript!以上代码中的this.x中的x到底是个什么东西?什么时候出现的,什么时候赋的值?

按照小猿的理解,这个函数创建的时候,给它分配了空间,而其内部写的所有的this.something中的something都是它的成员变量。

为什么要写这个东西呢?他能干吗?

我们用它来保留canvas中所谓对象的状态!

怎么保存,要是有很多个呢?

在javascript中设定全部变量,这个变量是一个数组,声明如: var circles = [];

如此一来,circles就成了真正的容器了。

你说这些东西有毛用啊?

canvas的碰撞会有很大的用途!

假如,我们鼠标点击了canvas中的一个点,需要判断这个点是否碰撞上了一个圆。

var circle = new Circle(100, 100, 30);

function clickCheck(event){
var p_x = event.pageX - canvas.offsetLeft;
var p_y = event.pageY - canvas.offsetTop; // 检测(p_x, p_y)是否在circle范围内
var distance = Math.sqrt(Math.pow(p_x - circle.x, 2) + Math.pow(p_y - circle.y, 2));
if (distance > circle)
// 在圈里
else
// 不在圈里

拖动一个圆圈跑

如果一个像素一个像素的移动,那么看上去就是在拽着图片跑。

var mouseDown;
window.onload = function(){
// some other things canvas.onmousedown = mousecheck;
canvas.onmousemove = circlemove;
canvas.onmouseup = mousecheck;
} function circlemove(e){
if (mousedown){
var x = e.pageX - canvas.offsetLeft;
var y = e.pageY - canvas.offsetTop; circle.x = x;
circle.y = y; drawCanvas();
}
} function drawCanvas(){
// start
context.beginPath();
context.arc(circle.x, circle.y, circle.radius);
context.fillStyle = "#121212";
context.fill();
context.stroke();
}

动画

动画的关键是如何让它动,在任何一个固定的时间点,所有的东西都是静止的!只不过随着时间的推移,这些东西的位置发生了变化而已。

整的像那么回事儿似的。好吧,我错了。

所以我们要做的就是在任意一个时间点都画canvas。需要用到的就是javascript的setTimeout()或者setInterval()。

setTimeout(functionName, millseconds);在指定的millseconds之后,执行functionName指定的函数。

通常functionName中也包含setTimeout,以保证动画执行下去。

setInterval(functionName, millseconds);每隔millseconds之后,执行functionName指定的函数。

这个方法有一个缺陷,就是不能保证functionName指定的function能够在millseconds指定的时间内完成,如果不能完成的话就会出现所谓的卡顿现象。

这个方法有一个有点,就是只需要调用一次即可,当不想再执行的时候,clearInterval()方法可以让它停止。

示例:

var x_position = 10;
var y_postition = 0; window.onload = function(){
// get canvas, context setTimeout(drawFrame, 200);
} function dramFrame(){
context.clearRect(0, 0, canvas.width, canvas.height); context.beginPath(); context.fillStyle = "#343434";
context.fillRect(x_position, y_position, 10, 20);
context.strokeStyle = "#999999";
context.strokeRect(x_position, y_position, 10, 20); y_position += 1; if ( y_position < canvas.height ) setTimeout(dramFrame, 200); }

稍稍总结一下:

动画中肯定要有一个被重复调用的function,而这个function基本上都是在window.onload或者image.onload中调用的。

而这个function所做的无外乎,清除画布,把画布中所有的对象重新绘制。

按键响应

var dx = 0;
var dy = 0;
function keyPress(event) {
// 先让图片停止下来
dx = 0;
dy = 0; if (event.keyCode == 37)
dx = -1;
if (event.keyCode == 38)
dy = -1; ...
}

颜色碰撞:它相对于距离计算来说稍微复杂一点,但是仍然也是十分有效的方式。

先说说颜色,我们知道rgb(254,100,80),也应该知道rgba(254, 100, 80, 0.5)。这是数值都是准确的,也就是说改变其中任何一个值都会造成所表示的颜色不一致。

canvas就利用这一点来实现的颜色碰撞。其实也有些弊端,一会儿再说。

var imgData = context.getImagedata(0, 0, 100, 50);

以上代码获得(0,0)这个位置开始,沿X方向走100,沿Y方向走50这一块儿canvas图片对应的图片数据。

imgData的data属性是一个数组,其个数是其中像素点个数*4。因为每一个像素点都由4个值组成。

这里需要注意的是最后一个值也是[0, 255)里的,而不是[0, 1]。

关键就是r = xxx; g = yyy; b = xxx;

而如果rgb正好是某一个值,那么就算碰上了。。。

  弊端: 如果图片中有相同的颜色,但是可以走的话就没治了!

HTML5 CANVAS 高级的更多相关文章

  1. html5 canvas高级贝塞尔曲线运动动画(好吧这一篇被批的体无完肤!都说看不懂了!没办法加注释了!当然数学不好的我也没办法了,当然这还涉及到一门叫做计算机图形学的学科)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. HTML5 程序设计 - 使用HTML5 Canvas API

    请你跟着本篇示例代码实现每个示例,30分钟后,你会高喊:“HTML5 Canvas?!在哥面前,那都不是事儿!” 呵呵.不要被滚动条吓到,很多都是代码和图片.我没有分开写,不过上面给大家提供了目录,方 ...

  3. HTML5 Canvas绘制转盘抽奖

    新项目:完整的Canvas转盘抽奖代码 https://github.com/givebest/GB-canvas-turntable 演示 http://blog.givebest.cn/GB-ca ...

  4. 使用 HTML5 canvas 绘制精美的图形

    HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4.HTML5 是一个 W3C “工作草案” — 意味着它仍然处于开发阶段 — 它包含丰富的元素和属性,它们都支持现行的 HT ...

  5. 《HTML5 CANVAS基础教程》读书笔记

    一.HTML5简介 1.HTML5新特性 1)结构元素:section,header,hgroup,footer,nav,article,aside, 2)内容元素:figure,figcaption ...

  6. HTML5 Canvas 概述

    本文中,我们将探索如何使用HTML5的Canvas API.Canvas API很酷,我们可以通过它来动态创建生成和展示图形,图表,图像以及动画.本文将使用渲染API(rendering API)的基 ...

  7. HTML5 canvas 绘制精美的图形

    HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4.HTML5 是一个 W3C “工作草案” — 意味着它仍然处于开发阶段 — 它包含丰富的元素和属性,它们都支持现行的 HT ...

  8. html5 canvas时钟

    基础知识点:                canvas标签只是图形容器,您必须使用脚本来绘制图形. getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性.——获取上 ...

  9. HTML5 Canvas游戏开发实战 PDF扫描版

    HTML5 Canvas游戏开发实战主要讲解使用HTML5 Canvas来开发和设计各类常见游戏的思路和技巧,在介绍HTML5 Canvas相关特性的同时,还通过游戏开发实例深入剖析了其内在原理,让读 ...

随机推荐

  1. I.MX6 ubuntu-core-14.04 Apache php mysql Qt5

    /*************************************************************************** * I.MX6 ubuntu-core-14. ...

  2. Activity Lifecycle

    Activity Lifecycle Activities in the system are managed as an activity stack(activity栈?). When a new ...

  3. Android内存管理机制之一:low memory killer

    转载自http://www.miui.com/thread-29268-1-1.html 准备写这个专题之前,心里是有点忐忑的.首先Android内存管理机制相当复杂,想要讲清楚比较困难:其次对于绝大 ...

  4. hdu 5902 Seam Carving

    水题,直接上代码了 #include<cstdio> #include<cstring> #include<iostream> #include<cmath& ...

  5. 关于环境变量PATH的几点注意事项

    查看执行文件路径变量PATH的内容可用echo $PATH.echo表示显示打印之意,$表示后接的是变量. 如下图所示,其中每个目录中间用冒号(:)来隔开,每个目录是有顺序之分的: 如果预修改PATH ...

  6. Sprint第二个冲刺(第一天)

    因为人员变动关系,我们的博客推迟了两天发布,希望老师能够谅解. 现在“广商百货”团队项目的新的团队成员组成为:董婷婷(组长).容杰龙.卓炜杰.袁文洪和吴建明 在经过第一轮和几天的休息,现在我们准备开始 ...

  7. Java 前端加密传输后端解密以及验证码功能

    目录(?)[-] 加密解密 1 前端js加密概述 2 前后端加密解密 21 引用的js加密库 22 js加密解密 23 Java端加密解密PKCS5Padding与js的Pkcs7一致 验证码 1 概 ...

  8. c 函数及指针学习 6

    不完整声明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /* 方法一   */ struct tag_a{ ...

  9. leetcode 131. Palindrome Partitioning----- java

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...

  10. 【SDOI2008】【P1377】仪仗队

    欧拉函数的应用 原题: 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...