canvas对象有哪些方法

1. canvas对象概述

canvas是HTML5新增的画布元素。它是一种使用JavaScript API在网页上绘制图形的方法,可以绘制图形、动画、游戏等效果,可替代以前使用Flash的方式,同时增强了用户体验。

canvas元素默认情况下没有任何绘制。它只是允许您添加绘制环境的容器。要在canvas上进行绘制,您需要使用JavaScript来获取绘制上下文。canvas只有2D上下文和3D上下文,我们这里只说2D上下文。

2. 获取canvas绘图上下文

canvas的API基于上下文环境,因为在canvas上绘制而不是标准的 HTML 绘图,所以它可以使用JavaScript来完成。我们接下来看如何获取canvas的绘图上下文。

2.1 获取2D绘图上下文

要绘制2D图形,在canvas上创建一个2D画布上下文是必须的,该上下文定义了在画布上绘制的路径、形状、样式和文本的API。创建画布上下文有两种方法:

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

这里使用了canvas的2D Context,即"2d",通过getElementById()方法获取到canvas元素,并通过getContext()方法来获取2D上下文,如果你的id不是"myCanvas",那么就将其替换成您的canvas元素的id。

2.2 获取3D绘图上下文

要使用3D绘制需要使用WebGL,WebGL(WebGL即“Web图形库”,全称为:Web Graphics Library)是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,WebGL通过引入一个与OpenGL ES 2.0紧密相符合的API集合,为HTML5 Canvas提供了3D绘制功能。

要获取3D绘图上下文,可以使用WebGL上下文,API如下:

var canvas = document.getElementById("myCanvas");

var gl = canvas.getContext("webgl");

这里使用的是CanvasWebGLRenderngContext,即 "webgl",也可以使用 "experimental-webgl"

3. Canvas API

canvas标签提供了大量的API,允许我们使用JavaScript绘制任何类型的图形,比如:直线、矩形、圆形、字符、图像等等,还可以使用各种样式和颜色、渐变、阴影等特效来制作更酷炫的效果,下面我们具体看一下canvas提供的API。

3.1 绘制基本图形

canvas API允许我们绘制直线、矩形、圆形、字符、图像等等基本图形,下面我们来看一下这些API的使用。

3.1.1 绘制直线

绘制直线是canvas API中最基本的操作之一,可以使用canvas对象的stroke()函数来绘制直线。代码实现如下所示:

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

ctx.beginPath();

ctx.moveTo(0,0);

ctx.lineTo(200,100);

ctx.stroke();

以上代码中,首先通过getElementById方法获取canvas元素,再通过getContext("2d")获取canvas绘制上下文,之后使用beginPath()函数开始路径,使用moveTo()函数设置起点,使用lineTo()函数设置终点,最后使用stroke()函数将路径进行描边。

3.1.2 绘制矩形

绘制矩形同样是canvas API中基本操作之一,可以使用canvas对象的rect()函数来绘制矩形,代码实现如下所示:

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

ctx.rect(20,20,100,100);

ctx.stroke();

以上代码中,按照顺序传入了x,y,width和height四个参数,表示要绘制的矩形的位置和大小。最后使用stroke()函数将路径进行描边。

3.1.3 绘制圆形

要绘制圆形,我们需要使用canvas对象的arc()函数,具体实现如下:

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

ctx.beginPath();

ctx.arc(100,100,50,0,2*Math.PI);

ctx.stroke();

以上代码中,首先使用beginPath()函数开始一个新的路径,接着使用arc()函数画一条从一个给定点开始到另外一个给定点结束的弧线,以(100,100)为圆心,半径为50,起始角度为0,结束角度为2π。最后使用stroke()函数将路径进行描边。

3.1.4 绘制字符

canvas API提供了绘制字符的方法,可以使用canvas对象的fillText()和strokeText()函数,具体实现如下:

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

ctx.font="30px Arial";

ctx.strokeText("Hello World",10,50);

以上代码中,首先使用getElementById方法获取canvas元素,接着使用getContext("2d")获取canvas绘制上下文,我们设置字体样式,使用strokeText()函数将指定的文本绘制在画布上。

3.2 绘制样式与颜色

除了基本图形之外,canvas API还提供了样式与颜色的方法,能够增强绘图效果,下面我们来看一下这些方法的使用。

3.2.1 颜色

在canvas中,图形和文本的颜色都是用CSS颜色值来表示的。可以使用fillStyle和strokeStyle属性来设置填充和描边的颜色值。

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

ctx.fillStyle = "red";

ctx.fillRect(10, 10, 100, 100);

以上代码中,我们使用fillStyle属性将填充色设置为红色,然后使用fillRect()函数绘制一个红色的矩形。

3.2.2 渐变

canvas API提供了两种渐变类型,一种是线性渐变,另一种是径向渐变。可以使用createLinearGradient()函数或createRadialGradient()函数创建渐变对象。

3.2.2.1 创建线性渐变

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

var gradient = ctx.createLinearGradient(0,0,200,0);

gradient.addColorStop(0,"red");

gradient.addColorStop(1,"white");

ctx.fillStyle = gradient;

ctx.fillRect(10, 10, 100, 100);

先创建一个简单的线性渐变实例,从左上角到右上角。从红色到白色。

3.2.2.2 创建径向渐变

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

var gradient = ctx.createRadialGradient(100,100,20,100,100,60);

gradient.addColorStop(0,"red");

gradient.addColorStop(1,"white");

ctx.fillStyle = gradient;

ctx.fillRect(10, 10, 100, 100);

径向渐变可以被认为是 从一个圆形中心,到这个圆形之外渐变的过渡,渐变由中心向外辐射。

3.2.3 阴影

在canvas中,可以设置阴影使图形或文本具有立体感。可以使用shadowOffsetX、shadowOffsetY、shadowBlur和shadowColor属性来定义阴影,如下所示:

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

ctx.shadowOffsetX = 10;

ctx.shadowOffsetY = 10;

ctx.shadowBlur = 5;

ctx.shadowColor = "rgba(0, 0, 0, 0.5)";

ctx.fillStyle = "#FF0000";

ctx.fillRect(10, 10, 100, 100);

以上代码中,我们使用shadowOffsetX和shadowOffsetY设置阴影的偏移位置,使用shadowBlur设置模糊度,使用shadowColor设置阴影的颜色,然后使用fillRect()函数绘制一个阴影矩形。

4. Canvas动画

canvas API不仅可以用来绘制静态图形,还可以用来制作动画效果,下面我们来看一下canvas制作动画的基本步骤。

4.1 清空画布

在绘制下一帧动画之前,我们需要将上一帧的画布内容清空,可以使用canvas对象的clearRect()函数来实现:

var canvas = document.getElementById("myCanvas");

var ctx = canvas.getContext("2d");

ctx.clearRect(0, 0, canvas.width, canvas.height);

以上代码清空了整个画布,使用clearRect()函数,传入0, 0, canvas.width和canvas.height四个参数即可。

4.2 绘制新帧

在清空画布之后,我们需要绘制新的帧,这一步包括两个基本操作,分别是重新计算每个物体的位置和重新绘制每个物体,这是一个常规的做法。以下是实现方法:

第一步是重新计算每个物体的位置,我们需要在每个时间步长中对每个物体的位置进行更新。

function updatePosition(object) {

object.x += object.vx;

object.y += object.vy;

}

以上代码中,我们定义一个updatePosition()函数,该函数接受一个对象作为参数,然后更新该对象的x和y属性使其移动。

第二步是重新绘制每个物体,我们需要在每个时间步长中重新绘制所有的物体。

function drawObject(object) {

ctx.fillStyle = object.color;

ctx.fillRect(object.x, object.y, object.width, object.height);

}

以上代码中,我们定义一个drawObject()函数,该函数接受一个对象作为参数,然后使用填充颜色和fillRect()函数重新绘制该对象。

4.3 开始动画循环

在清空画布并绘制新的帧后,我们需要创建一个动画循环来反复绘制新帧。使用JavaScript的setInterval()函数或requestAnimationFrame()函数可以实现动画循环,以下是实现方法:

4.3.1 setInterval()函数

setInterval(function() {

// 清空画布

ctx.clearRect(0, 0, canvas.width, canvas.height);

// 重新计算每个物体的位置

for (var i = 0; i < objects.length; i++) {

updatePosition(objects[i]);

}

// 重新绘制每个物体

for (var i = 0; i < objects.length; i++) {

drawObject(objects[i]);

}

}, 1000 / 60);

以上代码中,我们使用setInterval()函数和1000 / 60间隔来反复执行清空画布、重新计算每个物体的位置和重新绘制每个物体的步骤。

4.3.2 requestAnimationFrame()函数

function loop() {

// 清空画布

ctx.clearRect(0, 0, canvas.width, canvas.height);

// 重新计算每个物体的位置

for (var i = 0; i < objects.length; i++) {

updatePosition(objects[i]);

}

// 重新绘制每个物体

for (var i = 0; i < objects.length; i++) {

drawObject(objects[i]);

}

// 反复调用loop函数

requestAnimationFrame(loop);

}

// 开始动画循环

requestAnimationFrame(loop);

以上代码中,我们定义了一个名为loop()的函数,该函数在每个时间步长中清空画布、重新计算每个物体的位置和重新绘制每个物体。在函数的最后,我们使用requestAnimationFrame()函数调用loop函数,从而实现帧的循环。

5. 总结

本文介绍了canvas对象的基本概念、获取绘图上下文的方法、常见API以及如何使用canvas实现动画效果。

首先介绍了canvas是HTML5新增的画布元素,它可以通过JavaScript API绘制图形、动画、游戏等效果,增强用户体验;然后介绍了获取2D和3D绘图上下文的方法;接着详细介绍了canvas API,包括绘制基本图形、颜色、渐变和阴影等;最后介绍了如何使用JavaScript的setInterval()函数或requestAnimationFrame()函数实现动画效果。

学了这个,你可以去试着自己画一些图形,或者制作一些简单的动画效果。这里提醒一下,在实际应用中最好将canvas绘制的图形封装起来,避免直接在html中操作canvas。