canvas基础第一节

一、基础介绍和画直线

大多数现代浏览器都是支持Canvas的,比如 Firefox, safari, chrome, opera的最近版本以及IE9都支持.IE8及以下不支持HTML5,但是我们可以进行提示用户更新到最新的版本。

在进行图形绘制时,我们是通过context绘图环境进行操作。context是canvas的核心。context字面意思是上下文,我们可以把它理解为绘图的助手,用于存储操作步骤。

Canvas坐标系:X轴:横向向右为正方向。Y轴:竖向向下为正方向。

<canvas  id="myCanvas"  width="500"  height="500">你的浏览器不支持canvas,请使用高版本的浏览器。</canvas>

//获取canvas画布对象

var    canvas=document.getElementById("myCanvas");

//创建上下文

var    context=canvas.getContext("2d");

//画线

//创建一个图层

context.beginPath();

//移动画笔到指定位置

context.moveTo(0,0);

//画笔画到什么位置

context.lineTo(200,200);

context.lineTo(20,360);

//设置线条的颜色

context.strokeStyle="blueviolet";

//设置线条的粗细

context.lineWidth=10;

//设置线条的线帽,端点样式

//lineCap用于设置线条两端的形状

//butt(default) 默认,没有帽

//round 圆头

//square 方头,加上会增加一个线帽,长度是线条宽度的一半

context.lineCap="round";

//渲染,画图

context.stroke();


你画我猜的小练习

var    canvas=document.getElementById("myCanvas");

var    context=canvas.getContext("2d");

canvas.onmousedown=function(event) {

var   ev=event||window.event;

var    x=ev.clientX-canvas.offsetLeft;

var   y=ev.clientY-canvas.offsetTop;

console.log(x, y)

context.beginPath();

context.moveTo(x, y)

canvas.onmousemove=function(event) {

var      ev=event||window.event;

var       Left=ev.clientX-canvas.offsetLeft;

var        Top=ev.clientY-canvas.offsetTop;

context.lineTo(Left, Top);

context.stroke();

}

document.onmouseup=function() {

canvas.onmousemove=null;

}

}


二、封闭图形

var    canvas=document.getElementById("myCanvas");

var     context=canvas.getContext("2d");

context.beginPath();

context.moveTo(50,50);

context.lineTo(50,150);

context.lineTo(150,150);

//context.lineTo(50, 50);

//封闭图形

context.closePath();

//填充颜色

context.fillStyle="#6767BB";

//线的颜色

context.strokeStyle="#56FFCC";

//线的宽

context.lineWidth=5;

//渲染面

context.fill();

//渲染线,如果把context.stroke去掉,就没有边了,相当于线没有渲染

context.stroke();


三、画矩形的简单方式

var   canvas=document.getElementById("myCanvas");

var     context=canvas.getContext("2d");

context.beginPath();

//以线来画矩形,四个参数(x起点,y起点,矩形的宽,矩形的高),不需要渲染

context.strokeRect(50,50,200,200);

//画填充的矩形,四个参数(x起点,y起点,矩形的宽,矩形的高),不需要渲染

context.fillRect(50,50,200,200);


四、画圆

var   canvas=document.getElementById("myCanvas");

var   context=canvas.getContext("2d");

context.beginPath();

//第一个参数:圆心的x坐标

//第二个参数:圆心的y坐标

//第三个参数:半径

//第四个参数:开始画圆的开始角度

//第五个参数:结束的角度

//第六个参数:画圆的方向(顺时针false、逆时针true)

context.arc(200,200,180,0, Math.PI*2,true); 


五、渐变色

var   canvas=document.getElementById("myCanvas");

var   context=canvas.getContext("2d");

context.beginPath();

context.arc(200,200,180,0, Math.PI*2,true);

//createLinearGradient(x, y, x1, y1) - 创建线条渐变

//第一个参数:开始渐变的x坐标,

//第二个参数:开始渐变的y坐标,

//第三个参数:结束渐变的x坐标

//第四个参数:结束渐变的y坐标

//createRadialGradient(x, y, r, x1, y1, r1) - 创建一个径向 / 圆渐变

var   gradient=context.createLinearGradient(0,0,400,400);

//addColorStop()方法指定颜色停止, 参数使用坐标来描述, 可以是0至1

gradient.addColorStop(0,"red");

gradient.addColorStop(0.5,"yellow");

gradient.addColorStop(1,"green");

//addColorStop()可以添加无数个

//渲染

context.fillStyle=gradient;

context.lineWidth=10;

context.strokeStyle="deeppink"

context.stroke();

context.fill();


六、绘制文字

//strokeText(text,x,y) - 在 canvas 上绘制空心的文本

//fillText(text,x,y) - 在 canvas 上绘制实心的文本

//三个参数,第一个参数:文字内容.第二个参数:开始绘制文字的x坐标.第三个参数:开始绘制文字的y坐标

//font - 定义字体

var   canvas=document.getElementById("myCanvas");

var   context=canvas.getContext("2d");

context.beginPath();

//改变字体颜色

context.strokeStyle="orangered";

context.font="italic 50px Arial";//斜体 字体大小 字体样式

context.strokeText("hello  world",100,100);//空心文本

context.fillStyle="red";

context.fillText("hello   world",100,300);//实心文本


七、绘制阴影

var   canvas=document.getElementById("myCanvas");

var   context=canvas.getContext("2d");

context.beginPath();

//阴影的右偏移量(如果是负值就是左偏移量)

context.shadowOffsetX=10;

//阴影的下偏移量(如果是负值就是上偏移量)

context.shadowOffsetY=10;

//设置阴影颜色

context.shadowColor="blue";

//设置阴影的模糊程度,值越来越模糊

context.shadowBlur=10;

context.arc(200,200,100,0, Math.PI*2);

context.fillStyle="red";

context.fill();


八、平移

var  canvas=document.getElementById("myCanvas");

var   context=canvas.getContext("2d");

context.beginPath();

context.fillStyle="red";

//平移,平移的是画布的坐标系,想要产生效果需要先平移再画,

context.translate(100,100);

context.fillRect(0,50,100,100);


九、旋转

var  canvas=document.getElementById("myCanvas");

var   context=canvas.getContext("2d");

context.beginPath();

context.fillStyle="#7B68EE";

//是坐标系从原点旋转,旋转的是坐标系,正值顺时针旋转,负值逆时针旋转

context.rotate(Math.PI/4);

context.fillRect(200,0,50,50);


十、缩放

var   canvas=document.getElementById("myCanvas");

var   context=canvas.getContext("2d");

context.beginPath();

context.fillStyle="#7B68EE";

//缩放:第一个值是x轴缩放的比例,第二个值是y轴缩放的比例

//缩放的是坐标系

context.scale(2,0.5);//x轴整体坐标放大两倍,y轴整体缩小0.5倍

context.fillRect(50,0,50,50);


十一、储存和释放状态

context.save()储存状态,存储绘制状态

context.restore()释放状态,获取之前的画布状态

这两个是成对出现的,调用context.restore()之后将返回在context.save()这个节点时的canvas的所有的状态。这是保持canvas绘图状态的方法。在save和restore之间可以随意更改canvas的状态,而不会影响后续的绘制效果。当涉及到图形变换(平移,旋转,缩放)的时候,记得要先save,变换结束之后restore,以保证canvas图形绘制的正确。


如果有多个存档,是倒着取的


十二、二次曲线和三次曲线(贝塞尔曲线)

quadraticCurveTo(cpx,cpy,dx,dy);创建一条表示二次曲线的路径.(二次曲线其实就是二次方函数形成的曲线)。有四个参数。

//第一个参数:控制点的x坐标

//第二个参数:控制点的y坐标

//第三个参数:结束点的x坐标

//第四个参数:结束点的y坐标

控制点,决定曲线的形状。结束点代表终点。

bezierCurveTo(cpx,cpy,cpx2,cpx2,dx,dy);创建一条表示贝塞尔曲线的路径.该函数接受六个参数:

//第一二个参数是第一个控制点的x,y坐标

//第三四个参数是第二个控制点的x,y坐标

//第五六个参数是曲线结束的坐标

var   canvas=document.getElementById("myCanvas");

var    context=canvas.getContext("2d");

context.beginPath();

//二次曲线

context.moveTo(0,0);//起点

context.quadraticCurveTo(400,0,400,400);

context.stroke();

//三次曲线

context.moveTo(0,0);//起点

context.bezierCurveTo(400,0,400,100,400,400)

context.stroke();


十三、变换矩阵

//transform(a,b,c,d,e,f)

//a,d水平、垂直缩放

//b,c水平、垂直倾斜(可以取负值,负值的方向就是相对正值相反的方向)

//e,f水平、垂直位移

//默认是transform(1, 0, 0, 1, 0, 0)

//注意:使用transform设置变换矩阵是在之前的变换的基础上进行变换设置的,也就是说transform设置的变换矩阵具有集联的关系,

//setTransform(a,b,c,d,e,f)就是忽略之前的设置,将会让之前所有的设置失效,只使用当前的setTransform中传入的变换矩阵

context.fillStyle="red";

context.strokeStyle="#058";

context.lineWidth=5;

context.save();

context.transform(2,0.2,0.2,1.5,50,100);

context.fillRect(50,50,300,300);

context.strokeRect(50,50,300,300);

context.restore();


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,674评论 2 32
  • 一、图形的组合方式 globalAlpha是一个介于0和1之间的值(包括0和1),用于指定所有绘制的透明度。默认值...
    空谷悠阅读 1,256评论 0 0
  • 画同心圆的方法! var canvas = document.getElementById("myCanvas")...
    久久归移阅读 1,456评论 0 0
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,939评论 3 40
  • 0x001 Canvas是啥? 说白了Canvas就是一块画布,可以使用js当画笔在上面绘画的画布,可以显示在网页...
    卖梳子的鲤鱼阅读 1,850评论 1 21