博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
canvas学习笔记,实用知识点总结(上)
阅读量:5962 次
发布时间:2019-06-19

本文共 3233 字,大约阅读时间需要 10 分钟。

本博客是本人日常学习笔记,作为重要知识点的总结记录,随笔风格可能更倾向于个人的学习习惯和方式,若对您有帮助十分荣幸,若存在问题欢迎互相学习探讨,前端小白一枚在此恭候。
一、基本使用规则
1.创建画布
2.创建绘图对象
3.开始位置 (画一条线当lineWidth特别大的时候起始点从这条线的左下角开始的)
4.结束位置
5开始画图
注意:canvas标签是不能在css中设置的,在标签上面设置width和height属性,值为不带px的数值;
栗子一:画一条直线
//1.画一条线var c = document.querySelector("canvas”);//创建画布var ctx = c.getContext("2d"); //获取绘图对象,一个画布对应一个绘图对象ctx.moveTo(100,100);ctx.lineTo(300, 100);ctx.strokeStyle = "green”;//设置线的颜色ctx.lineWidth = 5;//设置线的宽度ctx.stroke();//绘制
栗子二:再画一条线
ctx.beginPath();//重置路径;ctx.moveTo(100,100);ctx.lineTo(300, 100);//ctx.setLineDash([20,10]);//虚线参数解析:是一个数组,线的长度,空白部分ctx.strokeStyle = "green”;//设置线的颜色ctx.lineWidth = 5;//设置线的宽度ctx.stroke();//绘制
需要注意的问题:如果不重置路径,第一条线也会被重新画一次这里的解决办法有两种;
问题解决:
1.只写一次ctx.stroke();
2.第二次画线前调用:ctx.beginPath();(这个栗子采用的这种方式)
栗子三:画大于号(知识点:线的连接方式与结束方式设置);
//连接方式(lineJoin用于设置连接处样式)//线帽:lineCap用于设置线两端结束的方式   ctx.moveTo(100, 400);ctx.lineTo(300, 500);ctx.lineTo(100, 600);ctx.strokeStyle = "red";ctx.lineWidth = 10;ctx.lineJoin = "miter"; //round(圆角)—bevel(平角)—miter(默认,尖角)ctx.lineCap = "butt"; //round---square---butt(默认)ctx.stroke();
栗子四:画一个三角形(知识点:闭合路径)
var c = document.querySelector("canvas");var ctx = c.getContext("2d");ctx.moveTo(100, 100);ctx.lineTo(100, 300);ctx.lineTo(400, 300);//ctx.lineTo(100, 100);ctx.closePath();//闭合路径,画回到原点ctx.lineJoin = "miter";ctx.strokeStyle = "green";ctx.lineWidth = 10;ctx.stroke();
栗子五:线型渐变
var c = document.querySelector("canvas");var ctx = c.getContext("2d");//创建渐变方案(lgd)var lgd = ctx.createLinearGradient(100,100,500,100);//起始位置的横纵坐标,结束位置的横纵坐标lgd.addColorStop(0,"red");//添加渐变颜色,参数解析:第一个参数:相当于百分比的进度(0~1),第二个参数:颜色lgd.addColorStop(1,"green");ctx.strokeStyle = lgd;//将渐变方案赋给strokeStylectx.moveTo(100, 100); //毕竟是要画线还是要有起始点的ctx.lineTo(500, 100);ctx.lineWidth = 20;ctx.stroke();
效果如下:
栗子六:径向渐变(知识点:给闭合图形进行填充样式,这里填充为景象渐变)
var c = document.querySelector("canvas");var ctx = c.getContext("2d");//创建渐变方案(lgd)//参数解析:起始园的圆心横纵坐标及半径,结束园的圆心横纵坐标以及结束圆的半径var rgd = ctx.createRadialGradient(100, 100, 50, 100, 100, 100);//添加渐变颜色rgd.addColorStop(0, "red”);rgd.addColorStop(0.5, “yellow");rgd.addColorStop(1, "green");ctx.fillStyle = rgd;//设置填充样式// ctx.rect(0, 0, 200, 200);//画矩形,开始横坐标、纵坐标、长、宽ctx.arc(100,100, 100, 0, Math.PI*2);//画圆,参数:开始圆心横坐标、纵坐标、半径、开始弧度、结束弧度// ctx.moveTo(100, 50);// ctx.lineTo(300, 50);// ctx.lineTo(300, 300);// ctx.lineTo(100, 300);// ctx.closePath();ctx.fill();//填充

效果图如下:

                   

栗子七:非零环绕问题

var c = document.querySelector("canvas");var ctx = c.getContext("2d");//顺时针ctx.moveTo(0,0);ctx.lineTo(200,0);ctx.lineTo(200,200);ctx.lineTo(0,200);ctx.lineTo(0,0);//逆时针ctx.moveTo(50,50);ctx.lineTo(50,150);ctx.lineTo(150,150);ctx.lineTo(150,50);ctx.lineTo(50,50);ctx.fillStyle = "green";填充为绿色ctx.fill();
效果如下:

 

栗子八:制作动画矩形(知识点:清理画布)
思路:每隔10毫秒清除画布,重新在新的位置画一个新的矩形;
var c = document.querySelector("canvas");var ctx = c.getContext("2d");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;    } else if(x <= 0) {        i = 1;    }}, 10)
 
 效果为:矩形在画布上左右往返移动;
 
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/youyang-2018/p/9268264.html

你可能感兴趣的文章
scanf()中的%c 不能正常输入的问题
查看>>
PHP学习1——快速入门
查看>>
面试发散思维
查看>>
java日志commons-logging/log4j/slf4j/logBack需要知道的几件事
查看>>
TypeScript 2019 路线图:更效率,更易用!
查看>>
Springboot从HellWorld开始
查看>>
Apache uimaFIT 3.0.0 发布,Java 的 UIMA 注解类
查看>>
用js来实现那些数据结构15(图01)
查看>>
web前端学习:React是什么,为什么要使用它?
查看>>
常见排序算法及对应的时间复杂度和空间复杂度
查看>>
业界 | 在德州叫一辆自动驾驶车,Drive.ai安排了7辆无人车展开真实试验
查看>>
实时数据平台设计:解决从OLTP到OLAP实时流转缺失
查看>>
三家公司在SD-WAN方面的新动作
查看>>
C#在PDF中如何以不同颜色高亮文本
查看>>
在同一页面显示多个JavaScript统计图表
查看>>
Mac电脑Tomcat下载及安装(详细)MAC在Eclipse里配置tomcat
查看>>
多线程之-----------定时器
查看>>
C#语法——反射,架构师的入门基础。
查看>>
Beego Models 之 一
查看>>
Python购物车练习
查看>>