应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Canvas从入门到实战

8月16日 回头爱投稿
  1、什么是Canvas?
  HTML5提供CanvasAPI,其本质上是一个DOM元素,可以看成是浏览器提供一块画布供我们在上面渲染2D或者3D图形。由于3D绘制上下文(webgl)目前在很多浏览器上兼容性较差,所以我们一般用于绘制2D图形。canvasidcanvascanvas
  2、为什么使用Canvas?
  Canvas是HTML5引入的标签,在此之前我们通常会使用SVG来绘制一些图形,那么两者之间有什么区别呢?SVG可缩放矢量图形(ScalableVectorGraphics)是基于可扩展标记语言XML描述的2D图形的语言,两者部分区别:
  SVG图像是使用各种元素创建的,这些元素分别应用于矢量图像的结构、绘制与布局;而Canvas本身并不描述图像,而是通过Javascript完成绘制;如上所述,SVG本身是DOM元素,每一个描述元素也是DOM元素,浏览器在进行渲染时需要进行大量计算以处理每一个元素;而在渲染Canvas的过程中,浏览器只需要渲染一张画布,其余的是通过Javascript引擎执行逻辑来绘制;SVG(矢量图)不依赖分辨率,放大不会失真;而Canvas(位图)依赖分辨率,放大会失真;
  由于Canvas是通过Javascript来完成绘制的,所以可控性很强,我们可以比较精确的控制图形渲染的每一帧;从另一方面来说,如果在高频率渲染中要处理过多的DOM元素就意味着性能一定不会太好,渲染速度会下降很多。Canvas的高性能能够保障复杂场景中图形的渲染效率,所以目前很多领域都会使用Canvas,例如动画、游戏图形、数据可视化、照片处理和实时视频处理等。
  3、Canvas的基本使用
  要使用Canvas,我们需要先获取Canvas元素的引用继而通过getContext()方法获取图形的绘制上下文。constcanvasdocument。getElementById(canvas)constctxcanvas。getContext(2d)
  获取到图形绘制上下文后,我们就能使用CanvasRenderingContext2D接口上的绘图API了,接下来我们可以了解一些比较常规的使用。
  3。1、画布属性:
  width、height:画布的宽度以及高度,默认大小为300x150;fillStyle:填充图形的样式,值可以是colorstring、CanvasGradient对象;strokeStyle:轮廓图形的样式,值可以是colorstring、CanvasGradient对象;lineWidth:绘制线条的宽度;globalAlpha:画布的透明度,01的偏移值;globalCompositeOperation:画布中新老图形重叠时的渲染方式,默认为sourceover,新图形覆盖老图形;。。。。。。ctx。width300ctx。height300ctx。fillStylefffctx。strokeStylebluectx。lineWidth5ctx。globalAlpha0。3ctx。globalCompositeOperationdestinationout新老图形重叠部分变透明。。。。。。
  3。2、绘制图形:
  。fillRect(x,y,width,height):绘制一个填充的矩形,矩形左上角的坐标为(x,y),高宽分别为width、。strokeRect(x,y,width,height):绘制一个矩形边框,矩形左上角的坐标为(x,y),高宽分别为width、。clearRect(x,y,width,height):清除指定矩形区域,让清除部分完全透明;ctx。fillStyleredctx。fillRect(100,100,100,100)ctx。strokeStylebluectx。strokeRect(200,200,100,100)ctx。clearRect(125,125,50,50)ctx。strokeRect(130,130,40,40)
  3。3、绘制路径:
  。beginPath():开始一段路径的绘制;。closePath():从起始点到当前点,结束路径的绘制,非必需;。fill():根据路径生成填充图形;。stroke():通过路径生成轮廓图形;。moveTo(x,y):声明一段路径的起始点;。lineTo(x,y):绘制一条从当前坐标到(x,y)的线;ctx。beginPath()ctx。moveTo(50,50)ctx。lineTo(100,100)ctx。lineTo(100,0)ctx。fill()ctx。beginPath()ctx。moveTo(110,100)ctx。lineTo(150,100)ctx。lineTo(150,200)ctx。lineTo(110,200)ctx。closePath()轮廓图形不会根据从当前坐标到起始坐标生成轮廓,所以需要闭合路径ctx。stroke()
  3。4、绘制圆弧:
  。arc(x,y,radius,startAngle,endAngle,anticlockwise):画一个以(x,y)为圆心的以radius为半径的圆弧(圆),从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针,false)来生成;arcTo(x1,y1,x2,y2,radius):根据给定的两条切线中的一组切点坐标生成半径为radius的圆弧;
  注意:arc函数中的角度的单位是弧度而不是度,弧度(Math。PI180)度圆左上部分ctx。beginPath()ctx。arc(100,100,50,Math。PI,Math。PI32,false)ctx。strokeStyleff6700ctx。stroke()圆右上部分ctx。beginPath()ctx。arc(100,100,50,Math。PI32,0,false)ctx。strokeStyle6700ffctx。stroke()圆右下部分ctx。beginPath()ctx。arc(100,100,50,0,Math。PI2,false)ctx。strokeStyle00FFFFctx。stroke()圆左下部分ctx。beginPath()ctx。arc(100,100,50,Math。PI2,Math。PI,false)ctx。strokeStyle8B008Bctx。stroke()两条切线的交点坐标为(0,0)ctx。beginPath()ctx。moveTo(100,0)ctx。arcTo(0,0,0,100,100)ctx。fillStylebluectx。fill()
  3。5、渐变对象:
  。createLinearGradient(x1,y1,x2,y2):创建一个沿参数坐标指定的直线的渐变,开始坐标为(x1,y1),结束坐标为(x2,y2);。createRadialGradient(x1,y1,r1,x2,y2,r2):创建根据参数确定两个圆的坐标的放射性渐变,开始圆形圆心为(x1,y1),半径为r1;结束圆形圆心为(x2,y2),半径为r2;
  创建好渐变对象之后,可以通过渐变对象上的。addColorStop(offset,color)为每一个渐变阶段填充颜色,offset为01的偏移值。constgradientctx。createLinearGradient(50,50,250,50)gradient。addColorStop(0,blue)gradient。addColorStop(0。5,green)gradient。addColorStop(1,red)ctx。fillStylegradientctx。fillRect(0,0,300,90)constradialGradientctx。createRadialGradient(200,200,100,200,200,50);radialGradient。addColorStop(0,yellow);radialGradient。addColorStop(1,green);ctx。fillStyleradialGctx。fillRect(100,100,200,200);
  3。6、像素操作:
  。drawImage(image,x,y,width,height):image可以是image对象、canvas元素、video元素;。getImageData(x,y,width,height):获取坐标为(x,y)一定区域内图像的像素数据;constpdocument。querySelector(p)functiongetRandom(){returnMath。round(255Math。random());}functiongetColor(){returnrgb({getRandom()},{getRandom()},{getRandom()});}constgradientctx。createLinearGradient(0,0,300,300);gradient。addColorStop(0,getColor());gradient。addColorStop(0。6,getColor());gradient。addColorStop(1,getColor());functionclear(){ctx。fillSctx。fillRect(0,0,canvas。width,canvas。height);}ctx。beginPath();ctx。fillSctx。fillRect(0,0,300,300);functionselector(x150,y150){clear();ctx。beginPath();ctx。arc(x,y,5,0,Math。PI2);ctx。strokeSctx。stroke();const{data}ctx。getImageData(x,y,1,1);获取(x,y)点对应的imageDataconstcolorrgba({data〔0〕},{data〔1〕},{data〔2〕},{data〔3〕255})p。innerTextcolor:{color};p。style。backgroundColorcolor}functionhandleSelector(e){constxe。offsetX;constye。offsetY;selector(x,y);}canvas。addEventListener(mousedown,(e){handleSelector(e)});canvas。addEventListener(mouseup,(){});canvas。addEventListener(mousemove,(e){if(mousedown){handleSelector(e)}});selector();
  3。7、画布状态:
  。save():将当前画布的状态推入到栈中,例如fillStyle、2D转换等;。restore():将栈顶元素弹出,恢复上一次推入栈中画布的状态;
  当我们需要通过空间转换来绘制图形时,保存与恢复画布的状态是很关键的,因为我们是在同一块画布上绘制图形,而变换都是基于画布的,这与我们平时使用到的CSS2D转换截然不同,所以我们在下一步绘制时要确认此时画布的状态是否是我们的理想状态。ctx。save()保存画布初始状态ctx。translate(100,100)将画布原点转移至(100,100)ctx。fillStyleredctx。fillRect(0,0,50,50)ctx。restore()恢复画布状态,此时画布原点为(0,0)ctx。fillStylebluectx。fillRect(0,0,50,50)
  3。8、几何变化:
  。translate(x,y):画布默认的原点是(0,0),此方法可以切换原点到(x,y)而不需要手动更改绘制图形的坐标;。rotate(angle):将画布旋转一定的角度,angle单位为弧度;。scale(sx,sy):sx为水平方向的缩放比例,sy为竖直方向的缩放比例;。transform(a,b,c,d,e,f):依次为水平缩放、垂直倾斜、水平倾斜、垂直缩放、水平移动、垂直移动;
  constcolors〔red,orange,yellow,green,blue,purple〕;ctx。translate(150,150)for(leti0;i6;i){ctx。beginPath()ctx。fillStylecolors〔i〕ctx。moveTo(0,0)ctx。lineTo(100,0)ctx。lineTo(100,50)ctx。rotate(Math。PI3)ctx。fill()}
  4、综合实战
  constpMath。PI;functionclock(){constdatenewDate();consthourdate。getHours()constsdate。getSeconds();constmdate。getMinutes();consth!!(hour12)?hour12:12;ctx。clearRect(0,0,canvas。width,canvas。height);ctx。save();保存画布初始状态ctx。translate(150,150);ctx。rotate(p2);轮廓ctx。beginPath();ctx。lineWidth5;ctx。strokeStyle76b2ctx。arc(0,0,80,0,p2);ctx。stroke();圆心ctx。beginPath();ctx。arc(0,0,2,0,p2);ctx。fill();分针、秒针刻度for(leti0;i60;i){ctx。beginPath();ctx。rotate(p30);ctx。moveTo(75,0);ctx。lineWidth4;ctx。strokeStyle89f086;ctx。lineTo(80,0);ctx。stroke();}时针刻度for(leti0;i12;i){ctx。beginPath()ctx。rotate(p6)ctx。moveTo(70,0)ctx。lineTo(80,0)ctx。stroke()}ctx。save();保存画布变换之后的状态秒针ctx。beginPath();ctx。rotate(s(p30));ctx。lineWidth2ctx。strokeStyleff6700ctx。moveTo(0,0);ctx。lineTo(80,0);ctx。stroke();恢复之前的状态再保存,时针、分针、秒针都是基于原点以及画布方向变换后绘制ctx。restore();ctx。save();分针ctx。beginPath();ctx。rotate(m(p30));ctx。lineWidth3;ctx。strokeStyle6700ffctx。moveTo(0,0);ctx。lineTo(70,0);ctx。stroke();ctx。restore();时针ctx。beginPath();ctx。rotate(h(p6));ctx。lineWidth4;ctx。moveTo(0,0);ctx。lineTo(60,0);ctx。stroke();ctx。restore();恢复画布最初状态document。querySelector(p)。innerTextNow:{h}:{m}:{s}{hour12?pm:am}window。requestAnimationFrame(clock);}clock();
  5、小结
  随着互联网的高速发展,用户对页面的视觉和交互有着越来越高的要求,传统的web开发无法得到满足,利用Canvas强大的绘图能力,可以让网页显示的内容更加的丰富多彩,也能给用户带来更好的视觉体验。
  作者:LLSFE团队
  来源:微信公众号:流利说技术团队
  出处:https:mp。weixin。qq。comsbvkx3wOeMvIUU64cktX6iA
投诉 评论 转载

每日一味抗癌中药松萝,功效全面,组方可用于肝癌乳腺癌等松萝【品种来源】松萝科松萝属植物节松萝或长松萝以地衣体(叶状体)入药。全年可采,去杂质,晒干备用。【别名】长松萝、云雾草、海风藤、天棚草、龙须草、老君须。【性……让群众尽享亲水亲绿之乐来源:【湛江日报湛江新闻网】廉江安铺镇滨水悬空休闲栈道。记者李忠摄日前,廉江市安铺镇九洲江边一条近600米长的滨水悬空休闲栈道建成,成为特色小镇一抹美丽的风景线,吸……爱的困惑,为什么相爱的人会相互伤害?头条创作挑战赛《相爱的人为什么会相互伤害》两个相爱的人为什么会相互伤害,自尊的心希望对方永远膜拜。语言的伤害是一种自我的疗伤可是……Canvas从入门到实战1、什么是Canvas?HTML5提供CanvasAPI,其本质上是一个DOM元素,可以看成是浏览器提供一块画布供我们在上面渲染2D或者3D图形。由于3D绘制上下文(we……50岁女人别乱选颜色,入秋多穿这4种气质色,时髦有魅力嗨,各位小仙女们,大家好呀!到了50岁后的女人,无论是在穿衣打扮上,还是衣服选款上,亦或者是在颜色挑选上,都是要格外注意的了。在这个年龄段,既不适合穿太沉闷的颜色,也不太……梁洛施成大赢家,晒出和圈内大佬聚会照!与李泽楷关系更亲密文小乐梁洛施,是一个极具魅力的女明星。虽说这些年很少出现在荧屏,但是她那靓丽的身影、精湛的演技着实吸引了一大批忠实的铁粉。只是后来梁洛施遇到了富豪李泽楷,一切的命运就此改……王治郅与消防战士过中秋!90后娇妻颜值高,前妻低调历经2段婚今年,内蒙古呼和浩特消防战士们度过了一个不一样的中秋佳节,前中国男篮国手王治郅现身消防站,与战士们一同打篮球,期间王治郅向战士们传授投篮技巧,并且组队与战士们进行对抗。值得一提……步步高一个月8次被强制执行!累计金额近1900万中新经纬12月16日电中新经纬查询中国执行信息公开网发现,近日,步步高商业连锁股份有限公司新增2条被执行人信息,执行标的共计486万余元,执行法院分别为郴州市北湖区人民法院、长……如画卷中风光迤逦的笔触,秋日黄河口是无法比拟的山辉川媚黄河从青藏高原奔涌而来在齐鲁大地融入大海的怀抱美丽的滩涂、广袤的湿地一起幻化成黄河山东段的绝美画卷今天,带您一睹黄河两岸醉美秋色看层林……重庆到三峡游轮票价是多少?黄金3号游轮价格和行程一览长江三峡是世界最大的峡谷之一,以壮丽多姿的自然风光闻名中外,也是国内游客热衷打卡的旅游胜地。如今游壮丽三峡,可以从重庆乘坐豪华游轮前往,一路经过瞿塘峡和巫峡,抵达湖北宜昌。那么……护肤成分维生素C(身体中必不可少的元素之一)头条创作挑战赛VC,又称维生素C,是一种多羟基化合物,结构类似葡萄糖,其分子中第2及第3位上两个相邻的烯醇式羟基极易解离而释出H,故具有酸的性质,也称抗坏血酸。维生素C具……多次并购猫腻巨额债务缠身,迅游科技原CEO不要江山要美人近日,网络加速行业的明星企业又现罢免CEO好戏。曾经A股最年轻的CEO袁旭被迅游科技董事会罢免,并引来了媒体对其高额债务、违规操作等报道,昔日的杰出青年一夜跌落。无论是公司的公……
运动员何智丽加入日本籍,击败邓亚萍后狂喊日语,曾想嫁给中国人云台山景区用高糊图片宣传美景,网友座机拍的?多吃这7种食物,对健康有好处,生活中都很常见这是最好的时代,这是最差的时代,盛世英超,怎一个乱字了得?德转新赛季莱比锡球员收入TOP10,有人低身价却拿着高工资全新vivoS15系列闪亮登场,vivoS12跌至大米价,网不用油炸怎样做出香而不辣的宫保鸡丁?中石油等五家大型国企为什么从美退市?吃在跳马这份五一美食攻略快提前收藏我国乙肝病毒携带者近1亿!乙肝患者一定会得肝癌吗?该如何预防周继红给中国跳水队世界杯表现打8。5分T1战胜EDG,锁定A组第一,携手EDG进军八强任正非的寒冬论给普通人的4点启示,照着做,挺过未来3年学习系列讲话强化四个意识发言稿范文师爷请自重谭铃音喜欢谁谭铃音唐天远结局在一起没关于吃东西日记范文使劲吻!扒一扒吻戏又多又美的10大电视剧(图)为什么有小名和大名大名和小名不一样可以吗信任养阿拉斯加需要注意什么养阿拉斯加的注意事项神奇的大海难忘的一件事500字的小学作文冬吃羊肉赛人参!但4个注意事项需得牢记,您可别去犯忌讳清华硕士讲述在中移动总部的日子大企业里的小职员

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找