canvas绘制图形API(一)

编程入门 行业动态 更新时间:2024-10-11 21:29:46

canvas绘制<a href=https://www.elefans.com/category/jswz/34/1770818.html style=图形API(一)"/>

canvas绘制图形API(一)

canvas元素的基础知识

  canvas元素是HTML5中的一个新增的重要元素,专门用来绘制图形。在页面上放置一个canvas元素,就相当于在页面上放置了一块“画布”,可以在其中进行图形的描绘。但是,在canvas元素中进行绘画,并不是拿鼠标来作画。事实上,canvas元素只是一块无色透明的区域,需要利用JavaScript编写在其中进行绘画的脚本。

1. 用canvas元素基本知识

1)取得canvas元素:使用document.getElementById等方法取得canvas对象。

2)取得上下文(context):使用canvas对象的getContext方法来获得。

3)填充与绘制边框:结合使用fill和stroke方式绘制图形。

4)设定绘图样式(style)

fillStyle:填充的样式,填入颜色值

strokeStyle:图形边框的样式,填入颜色值。

5)指定线宽:lineWidth

6)指定颜色值

7)绘制矩形

context.fillRect(x,y,width,height)
context.strokeRect(x,y,width,height)
x-横坐标,y-纵坐标,width-矩形宽带,height-矩形高度,坐标原点为canvas画布的最左上角。

2. 利用canvas绘制矩形

HTML代码:

<!DOCTYPE html><head><meta charset="UTF-8"><title>demo</title><script src="demo.js"></script></head>
<body onload="draw('canvas');">
<h1>canvas元素示例</h1>
<canvas id="canvas" width="400" height="300"></canvas>
</body>
</html>

js代码:

function draw(id){
var canvas=document.getElementById(id);
if (canvas == null) {return false
}
var context= canvas.getContext('2d');
context.fillStyle="#EEEEFF";
context.fillRect(0,0,400,300);
context.fillStyle="#D620E8";
context.strokeStyle="#2AC773";
context.lineWidth=1;
context.fillRect(50,50,100,100);
context.strokeRect(50,50,100,100);}

运行结果:

3.canvas 绘制圆形

1)开始创建路径:context.beginPath();该方法不使用参数

2)创建圆形路径:用arc方法

context.arc(x,y,radius,startAngle,endAngle,anticlockwise);

x-绘制圆形的起点坐标,y-绘制圆形的终点坐标,radius-圆形半径,startAngle-开始角度,endAngle-结束角度,anticlockwise-布尔值参数,值为true时按顺指针绘制,值为false时按逆时针绘制。

3)关闭路径

context.closePath();
4)设定绘制样式,进行图形绘制

HTML代码与上面一样。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>demo</title><style>#div{width: 1000px;position: relative;left: 300px;}</style><script src="demo.js"></script>
</head>
<body onload="draw('canvas');"><div id="div"><h1>canvas moveTo与lineTo示例</h1><canvas id="canvas" width="400" height="300"></canvas></div>
</body>
</hml>

js代码:

function draw(id){var canvas=document.getElementById(id);if(canvas==null){return false;
}var context=canvas.getContext('2d');context.fillStyle='#eeeeff';context.fillRect(0,0,400,300);for(var i=0;i<10;i++){//开始创建路径context.beginPath();//绘制路径context.arc(i*25,i*25,i*10,0,Math.PI*2,true);//关闭路径context.closePath();//进行图形绘制context.fillStyle='rgba(255,0,0,0.15)';context.fill();}
}

运行结果:

4. moveTo与lineTo

1.moveTo(x,y)
moveTo方法将光标移动到指定坐标点,绘制直线的时候以这个坐标点为起点。x表示指定坐标点的横坐标,y表示指定坐标点的纵坐标。

2.lineTo(x,y)
lineTo方法在moveTo方法中指定的直线起点与参数中指定的直线终点之间绘制一条直线,x表示直线重点的横坐标,y表示直线终点的纵坐标。

js代码如下:

function draw(id){
var canvas=document.getElementById(id);
if (canvas == null) {return false
}
//创建canvas对象
var context= canvas.getContext('2d');
//设置填充颜色
context.fillStyle="#EEEEFF";
//填充路径
context.fillRect(0,0,400,300);
var dx=150,dy=150,s=150;
context.beginPath();
context.fillStyle='rgb(100,255,100)';
context.strokeStyle='rgb(0,0,100)';
var dig=Math.PI/15*11;
for(var i=0;i<30;i++){var x=Math.sin(i*dig);var y=Math.cos(i*dig);context.lineTo(dx+x*s,dy+y*s);
}
context.closePath();
context.fill();
context.stroke();
}

运行结果:


5.canvas绘制渐变图形

canvas 绘制线性渐变

1)创建LinearGradient对象,绘制线性渐变。

context.createLinearGradient(xStart,yStart,xEnd,yEnd);
xStart-渐变起始地点的横坐标,yStart-渐变起始地点的纵坐标,xEnd-渐变结束地点的横坐标,yEnd-渐变结束地点的纵坐标

2)设定渐变的颜色
context.addColorStop(offset,color);
offset-设定的颜色离开渐变起始点的偏移量,该参数的值是一个范围0到1的浮点值

js代码如下:

function draw(id){
var canvas=document.getElementById(id);
if (canvas == null) {return false
}
//创建canvas对象
var context= canvas.getContext('2d');
var g1=context.createLinearGradient(0,0,0,300);
g1.addColorStop(0,'rgb(255,255,0)');
g1.addColorStop(1,'rgb(0,255,255)');
//设置填充颜色
context.fillStyle=g1;
//填充路径
context.fillRect(0,0,400,300);
var g2=context.createLinearGradient(0,0,300,0);
g2.addColorStop(0,'rgba(0,0,255,0.5)');
g2.addColorStop(1,'rgba(255,0,0,0.5)');
for(var i=0;i<10;i++){context.beginPath();context.fillStyle=g2;context.arc(i*25,i*25,i*10,0,Math.PI*2,true);context.closePath();context.fill();
}}

运行结果:

canvas绘制径向渐变

径向渐变是指沿着圆形的半径方向向外进行扩散的渐变方式。比如在描绘太阳时,沿着太阳的半径方向向外扩散出去的光晕,就是一种径向渐变。
使用图形上下文的createRadialGradient方法绘制径向渐变,该方法的定义如下所示:

 context.createRadialGradient(xStart,yStart,radiusStart,xEnd,yEnd,radiusEnd);

xStart–渐变开始圆的圆心横坐标,yStart–渐变开始时圆的圆心纵坐标

radiusStart–为开始时圆的半径,xEnd–渐变结束圆的圆心横坐标,

yEnd–渐变结束圆的圆心纵坐标,radiusEnd–结束圆的半径

js代码:

function draw(id){
var canvas=document.getElementById(id);
if (canvas == null) {return false
}
//创建canvas对象
var context= canvas.getContext('2d');
var g1=context.createRadialGradient(400,0,0,400,0,400);
g1.addColorStop(0.1,'rgb(255,255,0)');
g1.addColorStop(0.3,'rgb(255,0,255)');
g1.addColorStop(1,'rgb(0,255,255)');
//设置填充颜色
context.fillStyle=g1;
//填充路径
//context.fillRect(0,0,400,300);
var g2=context.createRadialGradient(250,250,0,250,250,300);
g2.addColorStop(0.1,'rgba(255,0,0,0.5)');
g2.addColorStop(0.7,'rgba(255,255,0,0.5)');
g2.addColorStop(1,'rgba(0,0,255,0.5)');
for(var i=0;i<10;i++){context.beginPath();context.fillStyle=g2;context.arc(i*25,i*25,i*10,0,Math.PI*2,true);context.closePath();context.fill();
}}

运行结果:

6.绘制变形图形

坐标变换

1)平移

context.translate(x,y);

x-将坐标轴原点向左移动x个单位,y-将坐标轴原点向下移动y个单位,单位默认情况下是像素。
2)扩大
context.scale(x,y);
x-水平方向的放大倍数,y-垂直方向的放大倍数。
3)旋转
context.rotate(angle);
angle-顺时针旋转的角度,要想逆时针选择,将angle设定为负数即可。

示例代码:

function draw(id){
var canvas=document.getElementById(id);
if (canvas == null) {return false
}
var context= canvas.getContext('2d');
context.fillStyle='#EEEEFF  ';
context.fillRect(0,0,400,300);
//图形绘制
context.translate(200,50);
context.fillStyle='rgba(255,0,0,0.25)';
for(var i=0;i<50;i++){context.translate(25,25);context.scale(0.95,0.95);context.rotate(Math.PI/10);context.fillRect(0,0,100,50);
}}

运行结果:

矩阵变换

使用图形上下文对象的transforms方法修改变换矩阵,该方法的定义如下:

context.transform(m11,m12,m21,m22,dx,dy);

其中m11,m21,m12,m22四个参数用来修改使用这个方法之后,绘制图形时的计算方法,以达到变形的目的,dx与dy参数移动坐标原点,dx表示将坐标原点在x轴上向右移动x个单位,默认情况下以像素为单位,dy表示将坐标原点在y轴上向下移动y个单位。

更多推荐

canvas绘制图形API(一)

本文发布于:2023-06-23 09:32:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/847165.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:图形   canvas   API

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!