画三角形
画一个颜色为red,线条为6的正三角形<canvas width="800" height="600"></canvas>
width和height不能通过css来设置,不能有单位
//获取画布
var c=document.querySelector("canvas");
//获取绘制的对象
var ctx=c.getContext("2d");
//设置颜色和width
ctx.strokeStyle = "red";
ctx.lineWidth = 6; // 不需要带单位
//开始的位置(横纵坐标)
ctx.moveTo(100,100);
ctx.lineTo(50,200);
ctx.lineTo(150,200);
ctx.lineTo(100,100); // 闭合直接lineTo当然可以
// ctx.closePath();//也可以采用clothPath闭合路径,用于画图最后一步的合并
//绘制
ctx.stroke();
此时正三角形就画好了,还可以设置连接处的样式
- 线连接方式 lineJoin: round | bevel | miter (默认)
- 线帽(线两端的结束方式)lineCap: butt(默认值) | round | square
重新画另外线条的时候需要注意一下
//再画一条线
//开始的位置(横纵坐标)
ctx.moveTo(100, 200);
//结束的位置
ctx.lineTo(400, 200);
//设置线的颜色
ctx.strokeStyle = "green";
//设置线的宽度
ctx.lineWidth = 10;
//绘制
ctx.stroke();
1、此时两次stroke()的绘制会导致第一次的stroke的绘制带有阴影,那是因为第二次相当于将第一次又进行了临摹
2、也可以在每个画图后使用beginPath()重置路径的方法
线性渐变
- var grd=ctx.createLinearGradient(x0,y0,x1,y1);
var c=document.querySelector("canvas");
var ctx=c.getContext("2d");
//创建渐变的方案
//起始位置的横纵坐标,结束位置的横纵坐标
var lgd=ctx.createLinearGradient(100,100,500,100);
//添加渐变的颜色
// addColorStop(offse,color);
// 中渐变的开始位置和结束位置介于0-1之间,0代表开始,1代表结束。中间可以设置任何小数
lgd.addColorStop(0,"red");
lgd.addColorStop(0.2,"green");
lgd.addColorStop(0.5,"blue");
lgd.addColorStop(1,"yellow");
//把渐变的方案给strokeStyle
ctx.strokeStyle=lgd;
ctx.moveTo(100,100);
ctx.lineTo(500,100);
ctx.lineWidth=20;
ctx.stroke();
径向渐变
- ctx.createRadialGradient(x0, y0, r0, x1, y1, r1)
//开始的横纵坐标,半径,结束的横纵坐标,半径
var rgd=ctx.createRadialGradient(200,150,50,200,150,100);
//添加渐变的颜色
rgd.addColorStop(0,"red");
rgd.addColorStop(0.5,"green");
rgd.addColorStop(1,"blue");
ctx.fillRect(0,0,200,150);
非零环绕
- 以射线为半径顺时针旋转,相交的边同向记为+1,反方向记为-1,如果相加的区域等于0,则不填充。
- 非零区域填充
//逆时针绘制外面的矩形
ctx.moveTo(100,100);
ctx.lineTo(100,300);
ctx.lineTo(300,300);
ctx.lineTo(300,100);
ctx.closePath();
//顺时针绘制里面的矩形
ctx.moveTo(150,150);
ctx.lineTo(250,150);
ctx.lineTo(250,250);
ctx.lineTo(150,250);
ctx.closePath();
ctx.stroke();
//中间的区域被填充颜色
ctx.fillStyle="red";
ctx.fill();
绘制虚线
- ctx.setLineDash(segments);
- segments
- 一个Array数组。一组描述交替绘制线段和间距(坐标空间单位)长度的数字。 如果数组元素的数量是奇数, 数组的元素会被复制并重复。例如, [5, 15, 25] 会变成 [5, 15, 25, 5, 15, 25]。
ctx.moveTo(100,50);
ctx.lineTo(400,50);
//虚线:参数是一个数组:线的长度是20,空白的地方也是20
//ctx.setLineDash([20,20]);
ctx.setLineDash([10,20,10]);
ctx.stroke();
绘制动画矩形
// 绘制一个矩形
// ctx.fillStyle="green";
// //绘制矩形
// ctx.fillRect(100,100,100,200);
// ctx.stroke();
// 将矩形动起来的思路就是使用setInterval
var x = 0;//开始的坐标
//每次移动的步数
var step = 5;
//标记(设置矩形向右移动后再回来)
var i = 1;
setInterval(function () {
//清理画布 必须要先清理,否则就是重绘
ctx.clearRect(0, 0, c.width, c.height);
ctx.fillStyle = "green";//颜色
ctx.fillRect(x, 100, 100, 200);//横纵坐标,宽和高
ctx.stroke();
x += step * i;//控制横坐标的
if (x > c.width - 100) {
i = -1;//标记设置为-1
} else if (x <= 0) {
i = 1;//i的值,不是x
}
}, 10);
绘制文本
- 绘制填充文本 content.fillText(文本的内容,x,y)
- 绘制镂空文本 content.strokeText()
- 设置文字大小:
content.font="20px 微软雅黑"
备注: 该属性设置文字大小,必须按照cssfont属性的方式设置 - 文字水平对齐方式【文字在圆心点位置的对齐方式】 content.textalign="left | right | center"
- 文字垂直对齐方式 content.textBaseline="top | middle | bottom | alphabetic(默认)"
- 文字阴影效果
- ctx.shadowColor="red"; 设置文字阴影的颜色
- ctx.ShadowOffsetX=值; 设置文字阴影的水平偏移量
- ctx.shadowOffsetY=值; 设置文字阴影的垂直偏移量
- ctx.shadowBlur=值; 设置文字阴影的模糊度
绘制十字线作为参考
ctx.moveTo(300, 0);
ctx.lineTo(300, 400);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(0, 200);
ctx.lineTo(600,200);
ctx.stroke();
// 开始绘制文本
//绘制文本 :是像素 和字体()
ctx.font="50px 宋体";
//设置文本的对齐方式
ctx.textAlign="center";//left|right|center
//设置文本的上下对齐方式
ctx.textBaseline="middle";//top|bottom|alphabetic(默认)
//设置阴影的颜色
ctx.shadowColor="red";
//水平方向偏移量
ctx.shadowOffsetX=15;
ctx.shadowOffsetY=5;
//阴影的模糊度
ctx.shadowBlur=5;
//参数1:文字内容,参数2:横坐标,参数3;纵坐标
//镂空的效果
// ctx.strokeText("你好",300,200);
//填充文本
ctx.fillText("你好",300,200);
绘制图片
将图片绘制到画布的指定位置
- void ctx.drawImage(image, dx, dy);
- void ctx.drawImage(image, dx, dy, dWidth, dHeight);
- void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
//绘制图片
var img=document.createElement("img");
img.src="image/2.jpg";
//图片和画图发生关系,才可以绘制这个图片
//图片加载
img.onload=function () {
//将图片绘制到画布的指定位置
content.drawImage(图片对象,x,y);
ctx.drawImage(img,0,0); // 从画布的0,0位置开始绘制
//将图片绘制到指定区域大小的位置 x,y指的是矩形区域的位置,width和height指的是矩形区域的大小
content.drawImage(图片对象,x,y,width,height);
ctx.drawImage(img,100,100,200,100); // 在规定矩形范围之内画图
//将图片的指定区域绘制到指定矩形区域内
content.drawImage(图片对象,sx,sy,swidth,sheight,dx,dy,dwidth,dheight);
sx,sy 指的是要从图片哪块区域开始绘制,swidth,sheight 是值 截取图片区域的大小
dx,dy 是指矩形区域的位置,dwidth,dheight是值矩形区域的大小
ctx.drawImage(img,180,50,350,170,100,100,350,170); //图片对象,图片选择的横纵坐标,图片的宽和高,画图的横纵坐标,图片显示的宽和高
};
- 解决图片绘制到某一个区域的按原比例缩放绘制:
绘制宽:绘制高==原始宽:原始高
// 不失真的公式
var w=img.width
var h=img.height
var drawH=200*h/w
ctx.drarImage(img,100,50,200,drawH)
绘制弧度
- ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise)
- x 圆弧中心(圆心)的 x 轴坐标。 y 圆弧中心(圆心)的 y 轴坐标。 radius 圆弧的半径。 startAngle 圆弧的起始点, x轴方向开始计算,单位以弧度表示。 endAngle 圆弧的终点, 单位以弧度表示。 anticlockwise 可选 可选的Boolean值 ,如果为 true,逆时针绘制圆弧,反之,顺时针绘制。
//绘制弧度:圆心坐标,半径,开始的弧度,结束的弧度,默认顺时针(false)
ctx.arc(200,150,50,Math.PI/2,2*Math.PI,false);
ctx.stroke();
- 0度角在哪?
以圆心为中心向右为0角 顺时针为正,逆时针为负 - 角度 和 弧度的关系: 角度:弧度= 180:pi
- 特殊值
- 0度 = 0弧度
- 30度 = π/6 (180度的六分之一)
- 45度 = π/4
- 60度 = π/3
- 90度 = π/2
- 180度 = π
- 360度 = 2π
- 绘制圆上任意点:
- x=ox+r*cos( 弧度 )
- y=oy+r*sin( 弧度 )
- ox: 圆心的横坐标
- oy: 圆心的纵坐标
- r: 圆的半径
旋转
//设置画布原点平移 通过该方法可以将原点的位置进行重新设置。
ctx.translate(100, 100);
//旋转的弧度
ctx.rotate( Math.PI/2 );//90度
- 注意
-
translate(x,y) 中不能设置一个值
-
与moveTo(x,y) 的区别:
moveTo(x,y) 指的是将画笔的落笔点的位置改变,而坐标系中的原点位置并没有发生改变
translate(x,y) 是将坐标系中的原点位置发生改变
-
缩放
ctx.scale(2, 0.5);//参数1:相对于原来的横坐标的缩放值,参数2:相对于原来的纵坐标的缩放值