浅谈HTML5中的Canvas基本绘图API简易封装和使用(一)

时间:2021-12-14 15:09:18

     HTML5的Canvas的功能可谓是非常强大,它可以做出很多炫酷的效果,从而更好的增加用户的体验。今天我们就来一起看下HTML5一些常用的API,个人根据实际的使用把它再次进行一次封装,使用起来感觉更方便,可能封装的不全面,但是这个个人感觉后期可以自动添加,主要给自己复习使用,第一次发H5博客,菜鸟一枚,初识H5.

MikyouCanvas.js(自己封装的Canvas的Js库)

var mCanvas; //声明Canvas对象;
var cxt; //声明context对象,该对象拥有丰富的绘图的API
function initMikyouCanvas(mCanvas, cxt) {
this.mCanvas = mCanvas;
this.cxt = cxt;
}
/**
* 1、绘制矩形(主要分为:绘制填充矩形和绘制边框矩形和清除矩形区域(利用isClear标记是否绘制清除矩形,实际上就是绘制一个与画布背景色一致的矩形区域),利用isFill变量来标记)
* 主要使用canvas原生的API:FillRect(x,y,width,height),StrokeRect(x,y,width,height),ClearRect(x,y,width,height)
* 自己封装的参数:drawRect(x,y,width,height,isClear,isFill,bgColor)
* x:矩形起点的X坐标(注意:相对坐标系是以画布的左上角为原点,向右为X坐标正方向,向下为Y坐标的正方向)
* y:矩形终点的Y坐标
* width:矩形的宽度
* height:矩形的高度
* isClear:是否绘制清除画布的矩形区域,true则就是绘制一个清除画布矩形区域,false就是绘制其他两种矩形
* isFill:是否是填充,false为绘制边框,true为绘制填充
* bgColor:矩形的颜色,若为填充则为整个矩形背景色,边框则为边框色
* */
function drawRect(x, y, width, height, isClear, isFill, bgColor) {
if (isClear) { //为true表示绘制清除画布的矩形区域,那么传入的isFill, bgColor值可以为任意值
cxt.clearRect(x, y, width, height);
} else { //false
if (isFill) { //为true,则绘制填充矩形
cxt.fillStyle = bgColor;
cxt.fillRect(x, y, width, height);
} else { //为false,则绘制边框矩形
cxt.strokeStyle = bgColor;
cxt.strokeRect(x, y, width, height);
}
}

}
/**
* 2、绘制圆弧(主要分为:绘制填充圆弧和绘制圆弧边框利用isFill变量来标记,注意:在绘制圆弧边框的时候还有一种特殊情况就是,只需要仅仅绘制弧边,不需要绘制圆弧开始起点和终点之间的连线,这个就是调用了beginPath()不需要调用closePath(),这里也使用一个isOnlyArc变量来标记true为仅仅绘制弧边
*其他的正常)
* 主要是使用的是canvas原生的API:
* arc(x,y,radius,startAngle,endAngle,anticlockwise);
* x:圆心X坐标
* y:圆心Y坐标
* startAngle:开始的弧度
* endAngle:结束的弧度
* anticlockwise:true为逆时针,false为顺时针
* 自己封装的参数:drawCircle(x,y,radius,startAngle,endAngle,anticlockwise,isFill,bgColor)
* x:圆心X坐标
* y:圆心Y坐标
* startAngle:开始的角度(通过getAngle方法将传入的角度转换成相应角度的弧度,
* 因为在原生的绘制圆弧的API它是根据弧度大小来绘制的,例如如果你想绘制一个30度的圆弧,如果直接传入30是不行的,要传入Math.PI/6
* 所以在这里个人做了一个优化,直接传入30就通过getAngle方法转换成Math.PI/6,这样就很方便的绘制自己传入的角度大小的圆弧。
* )
* endAngle:结束的角度
* 注意:如果要绘制圆形那么只需要调用该方法,传入的startAngle和endAngle是0度和360度即可。
* anticlockwise:true为逆时针,false为顺时针
* isFill:是否是填充,false为绘制边框,true为绘制填充
* bgColor:圆弧的颜色
* */
function drawArc(x, y, radius, startAngle, endAngle, anticlockwise, isOnlyArc, isFill, bgColor) {
if (isFill) { //为true绘制填充圆弧
cxt.fillStyle = bgColor;
cxt.beginPath();
cxt.arc(x, y, radius, getAngle(startAngle), getAngle(endAngle), anticlockwise);
cxt.closePath();
cxt.fill();
} else { //为false绘制边框圆弧
cxt.strokeStyle = bgColor;
cxt.beginPath();
cxt.arc(x, y, radius, getAngle(startAngle), getAngle(endAngle), anticlockwise);
if (isOnlyArc) { //绘制边框的另一种情况就是仅仅绘制弧边不需要调用closePath()

} else { //否则就是不仅绘制边框还得绘制起点和终点的连线,需要调用了closePath();
cxt.closePath();
}

cxt.stroke();
}
}
/**
* 3、绘制扇形(主要分为:绘制填充扇形和绘制扇形边框利用isFill变量来标记)
*主要是使用的是canvas原生的API:
* arc(x,y,radius,startAngle,endAngle,anticlockwise);
* x:圆心X坐标
* y:圆心Y坐标
* startAngle:开始的弧度
* endAngle:结束的弧度
* anticlockwise:true为逆时针,false为顺时针
* 自己封装参数API:drawSector(x,y,radius,startAngle,endAngle,anticlockwise,isFill,bgColor);
* x:圆心X坐标
* y:圆心Y坐标
* startAngle:开始的角度(通过getAngle方法将传入的角度转换成相应角度的弧度,
* 因为在原生的绘制圆弧的API它是根据弧度大小来绘制的,例如如果你想绘制一个30度的圆弧,如果直接传入30是不行的,要传入Math.PI/6
* 所以在这里个人做了一个优化,直接传入30就通过getAngle方法转换成Math.PI/6,这样就很方便的绘制自己传入的角度大小的圆弧。
* )
* endAngle:结束的角度
* anticlockwise:true为逆时针,false为顺时针
* isFill:是否是填充,false为绘制边框,true为绘制填充
* bgColor:扇形的颜色
* */
function drawSector(x, y, radius, startAngle, endAngle, anticlockwise, isFill, bgColor) {
if (isFill) {
cxt.fillStyle = bgColor;

cxt.beginPath();
cxt.moveTo(x, y); //把路径移动到画布中的指定点,不创建线条,注意:绘制扇形唯一与绘制弧的区别在于,紧跟着beginPath()后面调用,首先将路径移动到圆心位置
cxt.arc(x, y, radius, getAngle(startAngle), getAngle(endAngle), false);
cxt.closePath();
cxt.fill();
} else {
cxt.strokeStyle = bgColor;

cxt.beginPath();
cxt.moveTo(x, y);
cxt.arc(x, y, radius, getAngle(startAngle), getAngle(endAngle), false);
cxt.closePath();
cxt.stroke();
}
}
/**
* @description 4、绘制线段(主要分为:绘制填充线段和绘制空心线段利用isFill变量来标记)
* 主要是使用的是canvas原生的API:
* lineTo(x,y):表示从某点连线到该坐标点
*moveTo(x,y):表示将路径移动到画布中的该坐标点
* x:画布中某点的X坐标
* y:画布中某点的Y坐标
* 注意:如果开始没有调用moveTo,那么第一个lineTo的功能就相当于一个moveTo
* 自己封装的API:drawLine(startX,startY,endX,endY,lineWidth,bgcolor)
*
* startX:表示线的起点的X坐标
* startY:表示起点的Y坐标
* endX:表示线的终点的X坐标
* endY:表示线的终点的Y坐标
* lineWidth:表示线段的宽度
* bgColor:线的颜色
* */
function drawLine(startX, startY, endX, endY, lineWidth, bgColor) {
cxt.beginPath();
cxt.lineWidth = lineWidth;
cxt.fillStyle = bgColor;//经过测试不管是fillStyle还是StrokeStyle都是一样的
cxt.moveTo(startX, startY);
cxt.lineTo(endX, endY);
cxt.closePath();
cxt.fill();
}
/**
* @description 5、绘制贝塞尔曲线
* drawBezierCurve
* */

//将角度转换成弧度函数,
function getAngle(arc) {
return Math.PI * (arc / 180);
}
测试的Canvas.js

var mCanvas; //声明Canvas对象;
var cxt; //声明context对象,该对象拥有丰富的绘图的API
function initCanvas() { //onload事件加载该方法,当HTML5页面加载的时候就会回调该方法
mCanvas = document.getElementById("canvas"); //初始化canvas对象,这里只是获得了Canvas的这个整个的标签---<canvas id="mCanvas" width="800" height="800"></canvas>
cxt = mCanvas.getContext("2d"); //初始化cxt对象,然后就去获得canvas的上下文对象cxt,注意传入参数为2d表示绘制2d平面,cxt得到的是一个canvasRenderingContext2D对象,里面封装了大量的canvas绘图API
//初始化Canvas
initMikyouCanvas(mCanvas,cxt);
/**canvas各种绘图的API**/
//1、绘制矩形,drawRect(x,y,width,height,isClear,isFill,bgColor);
drawRect(100, 100, 200, 200, false, false, "rgba(0,0,255,0.8)");
//2、绘制圆弧,drawArc(x,y,radius,startAngle,endAngle,anticlockwise,isOnlyArc,isFill);
drawArc(200, 200, 100, 0, 190, false, true, false, "rgba(255,0,255,0.6)");
//3、绘制圆形
drawArc(420,200,100,0,360,false,false,true,"rgba(255,0,0,0.5)");
//4、绘制扇形。drawSector(x, y, radius, startAngle, endAngle, anticlockwise, isFill, bgColor)
drawSector(350, 350, 100, 0, 120, false, true, "rgba(255,0,0,0.5)");
//5、绘制线段 drawLine(startX, startY, endX, endY, lineWidth,bgColor)
drawLine(300,300,400,400,1,"rgba(255,0,0,0.5)");
drawLine(310,350,450,450,1,"rgba(0,0,255,0.5)");
}

测试的Html5的Html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/MikyouCanvas.js" type="text/javascript" charset="utf-8"></script>
<script src="js/canvas.js" type="text/javascript" charset="utf-8"></script>

</head>
<body onload="initCanvas()" style="text-align: center;">
<canvas id="canvas" width="600px" height="600px" style="background: #EEEEFF;"></canvas>
</body>
</html>

测试结果:

浅谈HTML5中的Canvas基本绘图API简易封装和使用(一)