02Canvas

canvas

2.6.5 面向对象基础复习补充:

创建对象的方式:

* var o = { name: '123', age: 18 }; //json方式创建

* var o = new Object();  //通过new的方式创建

* var o = new Persion(); //通过类的构造函数创建

JS中对象的属性创建方式

* json的方式:var o = { age: 19 };

*直接添加属性:var o = {};  o.age = 19;//太分散了,不利于管理

*由于js动态语言的特性,如果属性不存在的时候,直接添加属性。

*构造函数添加属性

*原型添加公共的属性

JS的构造函数的原型 构造函数的原型就是:构造对象的模板,构造函数原型里面的所有的属性和方法都会共享给所有的 构造函数构造出来的所有实例。

canvas进阶

3.1 Canvas颜色样式和阴影

3.1.1 设置填充和描边的颜色(掌握)

fillStyle :设置或返回用于填充绘画的颜色

strokeStyle:设置或返回用于笔触的颜色

以上两个值都可以接受颜色名,16进制数据,rgb值,甚至rgba.一般先进行设置样式然后进行绘制。

例如:

ctx.strokeStyle = "red";

ctx.strokeStyle = "#ccc";

ctx.strokeStyle = "rgb(255,0,0)";

ctx.strokeStyle = "rgba(255,0,0,6)";

3.1.2 设置阴影(了解,少用,性能差)

类比于CSS3的阴影。

shadowColor: 设置或返回用于阴影的颜色

shadowBlur: 设置或返回用于阴影的模糊级别,大于1的正整数,数值越高,模糊程度越大

shadowOffsetX: 设置或返回阴影距形状的水平距离

shadowOffsetY: 设置或返回阴影距形状的垂直距离

ctx.fillStyle = "rgba(255,0,0, .9)"

ctx.shadowColor = "teal";

ctx.shadowBlur = 10;

ctx.shadowOffsetX = 10;

ctx.shadowOffsetY = 10;

ctx.fillRect(100, 100, 100, 100);

设置png图片的阴影,图片透明部分不会被投影。

3.2 复杂样式(了解)

3.2.1 创建线性渐变的样式(了解)

l一般不用,都是用图片代替,canvas绘制图片效率更高。

l线性渐变可以用于矩形、圆形、文字等颜色样式

l线性渐变是一个对象

语法:ctx.createLinearGradient(x0,y0,x1,y1); //参数:x0,y0起始坐标,x1,y1结束坐标

例如:

//创建线性渐变的对象,

var grd=ctx.createLinearGradient(0,0,170,0);

grd.addColorStop(0,"black");  //添加一个渐变颜色,第一个参数介于0.0与1.0之间的值,表示渐变中开始与结束之间的位置。

grd.addColorStop(1,"white");  //添加一个渐变颜色

ctx.fillStyle =grd;           //关键点,把渐变设置到 填充的样式

3.2.2 设置圆形渐变(径向渐变)了解

创建放射状/圆形渐变对象。可以填充文本、形状等

context.createRadialGradient(x0,y0,r0,x1,y1,r1);

radial半径的;放射状的;光线的;光线状的 英['reɪdɪəl]美['redɪəl]

参数详解:

x0:渐变的开始圆的x坐标

y0:渐变的开始圆的y坐标

r0:开始圆的半径

x1:渐变的结束圆的x坐标

y1:渐变的结束圆的y坐标

r1:结束圆的半径

var rlg = ctx.createRadialGradient(300,300,10,300,300,200);

rlg.addColorStop(0, 'teal');    //添加一个渐变颜色

rlg.addColorStop(.4, 'navy');

rlg.addColorStop(1, 'purple');

ctx.fillStyle = rlg;//设置 填充样式为延续渐变的样式

ctx.fillRect(100, 100, 500, 500);

3.2.3 绘制背景图(了解)

ctx.createPattern(img,repeat)方法在指定的方向内重复指定的元素了解

pattern:n.模式;图案;样品 英['pæt(ə)n]美['pætɚn]

第一参数:设置平铺背景的图片,第二个背景平铺的方式。

image: 规定要使用的图片、画布或视频元素。

repeat: 默认。该模式在水平和垂直方向重复。

repeat-x: 该模式只在水平方向重复。

repeat-y: 该模式只在垂直方向重复。

no-repeat: 该模式只显示一次(不重复)。

var ctx=c.getContext("2d");

var img=document.getElementById("lamp");

var pat=ctx.createPattern(img,"repeat");

ctx.rect(0,0,150,100);

ctx.fillStyle=pat;//把背景图设置给填充的样式

ctx.fill();

3.3 变换》※(重点)

3.3.1 缩放(重点)

scale()方法缩放当前绘图,更大或更小

语法:context.scale(scalewidth,scaleheight)

scalewidth :缩放当前绘图的宽度(1=100%, 0.5=50%, 2=200%,依次类推)

scaleheight :缩放当前绘图的高度(1=100%, 0.5=50%, 2=200%, etc.) +注意:缩放的是整个画布,缩放后,继续绘制的图形会被放大或缩小。

3.3.2 位移画布(重点)

ctx.translate(x,y)方法重新映射画布上的(0,0)位置

参数说明:

x: 添加到水平坐标(x)上的值

y: 添加到垂直坐标(y)上的值

发生位移后,相当于把画布的0,0坐标 更换到新的x,y的位置,所有绘制的新元素都被影响。

位移画布一般配合缩放和旋转等。

3.3.3 旋转(重点)

context.rotate(angle);方法旋转当前的绘图

l注意参数是弧度(PI)

l如需将角度转换为弧度,请使用degrees*Math.PI/180公式进行计算。

3.3 绘制环境保存和还原(重要)

ctx.save()保存当前环境的状态

可以把当前绘制环境进行保存到缓存中。

ctx.restore()返回之前保存过的路径状态和属性

获取最近缓存的ctx

一般配合位移画布使用。

3.4 设置绘制环境的透明度(了解)

context.globalAlpha=number;

number:透明值。必须介于0.0(完全透明) 与1.0(不透明) 之间。

设置透明度是全局的透明度的样式。注意是全局的。

3.5 画布限定区域绘制(了解)

ctx.clip();方法从原始画布中剪切任意形状和尺寸

l一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内(不能访问画布上的其他区域)

l一般配合绘制环境的保存和还原。

3.6 画布保存base64编码内容(重要)

把canvas绘制的内容输出成base64内容。

语法:

canvas.toDataURL(type, encoderOptions);

例如:

canvas.toDataURL("image/jpg",1);

参数说明:

type,设置输出的类型,比如image/png image/jpeg等

encoderOptions:0-1之间的数字,用于标识输出图片的质量,1表示无损压缩,类型为:image/jpeg或者image/webp才起作用。

案例1:

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

var dataURL = canvas.toDataURL();

console.log(dataURL);

// "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNby

// blAAAADElEQVQImWNgoBMAAABpAAFEI8ARAAAAAElFTkSuQmCC"

var img = document.querySelector("#img-demo");//拿到图片的dom对象

img.src = canvas.toDataURL("image/png");      //将画布的内容给图片标签显示

3.7 画布渲染画布(重要)

context.drawImage(img,x,y);

img参数也可以是画布,也就是把一个画布整体的渲染到另外一个画布上。

var canvas1 = document.querySelector('#cavsElem1');

var canvas2 = document.querySelector('#cavsElem2');

var ctx1 = canvas1.getContext('2d');

var ctx2 = canvas2.getContext('2d');

ctx1.fillRect(20, 20, 40, 40);      //在第一个画布上绘制矩形

ctx2.drawImage(canvas1, 10, 10);    //将第一个画布整体绘制到第二个画布上

3.8 了解:线条样式(了解)

lineCap设置或返回线条的结束端点(线头、线冒)样式

butt: 默认。向线条的每个末端添加平直的边缘。

翻译.:屁股;烟头;笑柄;靶垛;粗大的一端 英[bʌt]美[bʌt]

round: 向线条的每个末端添加圆形线帽。

square: 向线条的每个末端添加正方形线帽。

lineJoin设置或返回两条线相交时,所创建的拐角类型

bevel:创建斜角。

翻译.斜角;斜面;[测]斜角规 英['bev(ə)l]美['bɛvl]

round:创建圆角。

miter:默认。创建尖角

lineWidth设置或返回当前的线条宽度

miterLimit设置或返回最大斜接长度

意思:斜接 英['maɪtə]

斜接长度指的是在两条线交汇处内角和外角之间的距离。

一般用默认值:10就可以了。除非需要特别长的尖角时,使用此属性。

3.9 了解贝塞尔曲线(知道有)

3.9.1 绘制一条二次方曲线

微软的画图板中的曲线的颜色。

quadratic:二次方的意思, 英[kwɒ'drætɪk]美[kwɑ'drætɪk]

Curve:曲线的意思, 英[kɜːv]美[kɝv]

语法:

context.quadraticCurveTo(cpx,cpy,x,y);

参数:

cpx: 贝塞尔控制点的x坐标

cpy: 贝塞尔控制点的y坐标

x: 结束点的x坐标

y: 结束点的y坐标

ctx.beginPath();

ctx.moveTo(20,20);

//绘制2次方曲线,贝赛尔曲线

ctx.quadraticCurveTo(20,100,200,20);

ctx.stroke();

3.9.2 绘制贝塞尔曲线(知道有)

绘制一条三次贝塞尔曲线

语法:

context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);

提示:

三次贝塞尔曲线需要三个点。前两个点是用于三次贝塞尔计算中的控制点,第三个点是曲线的结束点。曲线的开始点是当前路径中最后一个点。如果路径不存在,那么请使用beginPath()和moveTo()方法来定义开始点。

参数说明:

cp1x: 第一个贝塞尔控制点的x坐标

cp1y: 第一个贝塞尔控制点的y坐标

cp2x: 第二个贝塞尔控制点的x坐标

cp2y: 第二个贝塞尔控制点的y坐标

x:结束点的x坐标

y:结束点的y坐标

//绘制复杂的贝塞尔曲线

ctx.beginPath();

ctx.moveTo(400,400);

//参数说明:context.bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y);

// cp1x: 第一个贝塞尔控制点的x坐标

// cp1y: 第一个贝塞尔控制点的y坐标

// cp2x: 第二个贝塞尔控制点的x坐标

// cp2y: 第二个贝塞尔控制点的y坐标

// x:结束点的x坐标

// y:结束点的y坐标

ctx.bezierCurveTo(500, 200, 600, 600, 700, 300);

ctx.stroke();

3.10了解创建两条切线的弧(知道有)

在画布上创建介于当前起点和两个点形成的夹角的切线之间的弧

语法:

context.arcTo(x1,y1,x2,y2,r); //类比:css3中的圆角。

例如:

ctx.arcTo(240, 100, 240, 110, 40);

参数:

x1:弧的端点1的x坐标

y1:弧的端点1的y坐标

x2:弧的端点2(终点)的x坐标

y2:弧的端点2(终点)的y坐标

r :弧的半径

//代码demo:

ctx.beginPath();

ctx.moveTo(100,100);

ctx.lineTo(200,100);

//context.arcTo(x1,y1,x2,y2,r); //类比:css3中的圆角。

ctx.arcTo(240, 100, 240, 110, 40);

ctx.lineTo(240, 300);

ctx.stroke();

3.11了解判断点是否在路径中(知道有)

context.isPointInPath(x,y);

//isPointInPath()方法返回true,如果指定的点位于当前路径中;否则返回false。

//判断x,y坐标的点是否在当前的路径中。

3.12了解文本宽度计算(知道有)

context.measureText(text).width;

3.13其他》

如果以后做canvas游戏方向开发深入学习可以扩展内以下容:

lsetTransform()将当前转换重置为单位矩阵。然后运行transform()

ltransform()替换绘图的当前转换矩阵

lglobalCompositeOperation设置或返回新图像如何绘制到已有的图像上

l像素操作

e

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

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,604评论 2 32
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,856评论 3 40
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    J_L_L阅读 1,450评论 0 4
  • 线条样式 绘制直线,第五章知识简单回顾 lineWidth 设置或返回当前的线条宽度,单位为像素 lineCap ...
    Zd_silent阅读 442评论 0 0
  • "我一一,我一一,我不知道。" 当杨峰灼热的双眼离慕雪的凝眸越来越近时,慕雪感到心跳不断加速,仿佛把全身的血液都推...
    踏雪无恒终有痕阅读 320评论 0 1