上面的例子有用到moveTo()这个方法,这边就来说说moveTo()方法。语法如下:
moveTo(x,y)
moveTo()方法用于定位绘画的位置,即将点移动到参数x,y所指定的坐标位置。
canvas初始化或者调用了beginPath()方法时,绘画开始的位置即原点(0,0),使用moveTo()方法,我们可以将起始位置移动到任何我们想要的地方。
moveTo()的使用实例:
function draw(){
var canvas=document.getElementById(‘test_moveTo’);
if(canvas.getContext){
var cxt=canvas.getContext(‘2d’);
cxt.beginPath();
cxt.arc(75,75,50,0,Math.PI*2,true);
cxt.moveTo(100,75);
cxt.arc(75,75,35,0,Math.PI,false);
cxt.moveTo(65,65);
cxt.arc(60,65,5,0,Math.PI*2,true);
cxt.moveTo(95,65);
cxt.arc(90,65,5,0,Math.PI*2,true);
cxt.stroke();
}
}
绘制各种线条
用lineTo()方法来画直线。
lineTo()方法接受终点的坐标(x,y)作为参数。起始坐标取决于前一路径的终点坐标。当然,起始坐标也可以通过前面介绍的moveTo()方法来设置。
绘制线条示例:
function draw(){
var canvas=document.getElementById(‘test_lineTo’);
if(canvas.getContext){
var cxt=canvas.getContext(‘2d’);
cxt.beginPath();
cxt.moveTo(25,25);
cxt.lineTo(105,25);
cxt.lineTo(25,105);
cxt.fill(); //fill填充路径,会自动闭合路径。
cxt.beginPath();
cxt.moveTo(125,125);
cxt.lineTo(125,45);
cxt.lineTo(45,125);
cxt.closePath();
cxt.stroke(); //stroke不会闭合路径,所以再描边先要先闭合路径
}
}
上面的例子利用lineTo()方法绘制了两个三角形。从这个例子也可以看出fill和stroke的区别。
绘制弧线
用arc方法来绘制弧线或圆。
arc(x, y, radius, startAngle, endAngle, anticlockwise)
该方法接受五个参数。其中,x,y是圆心坐标;radius是圆的半径;startAngle和endAngle分别是起末弧度(以x轴为基准);anticlockwise为true表示逆时针,反之为顺时针。
这边有一点是需要注意的,就是arc方法里的角度是以弧度为计算单位的,不是度。这么说吧,通常我们说的180度,就等价于PI。两者的计算公式是这样的:radians=(Math.PI/180)*degrees.(其中,radians代表弧度,degrees代表度)
绘制圆弧示例:
function draw(){
var canvas=document.getElementById(‘test_arc’);
if(canvas.getContext){
var ctx=canvas.getContext(‘2d’);
for(var i=0; i<4; i++){ //输出4行4列的矩阵
for(var j=0; j<4; j++){
ctx.beginPath();
var x=25+j*50; //圆心x坐标
var y=25+i*50; //圆心y坐标
var radius=20; //半径
var startAngle=0; //起始弧度
var endAngle=Math.PI/2+(Math.PI*j)/2; //结束弧度
var anticlockwise=i%2==0?false:true; //奇数行顺时针;偶数行逆时针。
ctx.arc(x,y,radius,startAngle,endAngle,anticlockwise); //循环绘制圆/圆弧
if(i>1){
ctx.fill(); //3,4行填充图案
}else{
ctx.stroke(); //1,2行仅勾勒路径
}
}
}
}
}
上面这个例子,用双层循环输出了4*4的圆弧矩阵。
贝塞尔和二次方曲线
最后,要说的是贝赛尔曲线,它可以是二次和三次的形式,一般用于绘制复杂而有规律的形状。
二次贝赛尔曲线:
quadraticCurveTo(cpx, cpy, x, y)
其中,cpx指控制点的x坐标;cpy指控制点的y坐标;x指结束点的x坐标;y指结束点的y坐标。
由上面的参数可以看出,二次贝赛尔曲线需要两个点:第一个点用于二次贝赛尔计算中的控制点,第二个点是曲线的结束点。曲线的开始点是当前路径中最后一个点。如果路径不存在,可使用beginPath()和moveTo()方法来定义。
一个简单的二次贝赛尔曲线实例:
function draw(){
var canvas=document.getElementById(‘test_quadraticCurveTo’);
if(canvas.getContext){
var ctx=canvas.getContext(‘2d’);
ctx.beginPath();
ctx.moveTo(75,25);
ctx.quadraticCurveTo(25,25,25,62);
ctx.quadraticCurveTo(25,100,50,100);
ctx.quadraticCurveTo(50,120,30,125);
ctx.quadraticCurveTo(60,120,65,100);
ctx.quadraticCurveTo(125,100,125,62);
ctx.quadraticCurveTo(125,25,75,25);
ctx.stroke();
}
}
三次贝赛尔曲线:
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
其中,cp1x为第一个控制点的x坐标;cp1y为第一个控制点的y坐标;cp2x为第二个控制点的x坐标;cp2y为第二个控制点的y坐标;x为结束点的x坐标;y为结束点的y坐标。
由上面可以看出,三次贝赛尔曲线需要三个点。前两个点用于三次贝赛尔计算中的控制点,第三个点是曲线结束的控制点。同上,曲线的开始点是当前路径中最后一个点。如果路径不存在,可使用beginPath()和moveTo()方法来定义。
新建一个前端学习qun438905713,在群里大多数都是零基础学习者,大家相互帮助,相互解答,并且还准备很多学习资料,欢迎零基础的小伙伴来一起交流。
使用二次方和三次方的贝塞尔曲线是相当有挑战的,因为不像在矢量绘图软件 Adobe Illustrator 里那样有即时的视觉反馈。因为用它来画复杂图形是比较麻烦的。但如果你有时间,并且最重要是有耐心,再复杂的图形都可以绘制出来的。下面我们来画一个简单而又规律的图形。
一个简单的三次贝赛尔曲线实例:
function draw(){
var canvas=document.getElementById(‘test_quadraticCurveTo’);
if(canvas.getContext){
var ctx=canvas.getContext(‘2d’);
ctx.beginPath();
ctx.moveTo(75,40);
ctx.bezierCurveTo(75,37,70,25,50,25);
ctx.bezierCurveTo(20,25,20,62.5,20,62);
ctx.bezierCurveTo(20,80,40,102,75,120);
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
[外链图片转存中…(img-ueq46TFr-1714864762763)]
[外链图片转存中…(img-QTG8qEXg-1714864762764)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!