专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Canvas从入门到实战

  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、height;。strokeRect(x,y,width,height):绘制一个矩形边框,矩形左上角的坐标为(x,y),高宽分别为width、height;。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。fillStyleradialGradient;ctx。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)letmousedownfalse;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。fillStylegradient;ctx。fillRect(0,0,canvas。width,canvas。height);}ctx。beginPath();ctx。fillStylegradient;ctx。fillRect(0,0,300,300);functionselector(x150,y150){clear();ctx。beginPath();ctx。arc(x,y,5,0,Math。PI2);ctx。strokeStylefff;ctx。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){mousedowntrue;handleSelector(e)});canvas。addEventListener(mouseup,(){mousedownfalse;});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。strokeStyle76b2ff;ctx。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

看完马龙32胜出,才明白3连败的樊振东输在哪里?球迷太像王皓林高远首轮出局之后,樊振东也是首轮出局,以23不敌奥恰洛夫,无缘半决赛。当小编看见马龙32取胜林昀儒的比赛后,才明白3连败的樊振东输在哪里?有球迷评价樊振东太像王皓了!樊振东曾经有NBA在中国的市场营销NBA在中国市场最热的阶段,一定是中国三大移动长城在NBA打球的年代。那时候直播还没有现在这么发达,大学生逃了课,去那时候的大录像厅看现场直播。上班族在电脑面前,看着新浪体育和虎扑NBA伤病潮!三大球星将伤停,威少有望复出,篮网火箭坏消息北京时间10月28日,NBA新赛季正在如火如荼进行着,别看赛季才刚刚开始,可联盟却出现了多个伤病情况。最近更是迎来一波伤病潮,其中三大球星莱昂纳德利拉德和英格拉姆都进入伤停名单中,乒乓球世界杯决赛首轮全景赛报中国7胜1负,林高远出局,陈梦险胜北京时间10月27日22点50分,世界乒乓球职业大联盟世界杯决赛,在河南新乡平原体育中心结束了首日八强战的15场比赛,首轮樊振东轮空,中国军团8人出战,马龙王楚钦王曼昱陈梦。陈幸同初秋养肺有三宝百合雪梨冬虫草秋季已至,但气温依旧较高,空气干燥。中医往往会强调此时宜滋阴润燥,重在养肺。现介绍初秋养肺原则和养肺三宝。养肺原则顺应秋收之气,保养肺阴黄帝内经中说秋冬养阴,这里的阴应该有三个方面吃柿子长结石?那是你吃法错了到了干燥的秋季就应该注重身体的养护,进食一些调养身体的食物来促进健康。秋天是柿子上市的季节,柿子营养价值很高,富含单宁维生素类黄酮膳食纤维和类胡萝卜素等,柿子碳水化合物的含量较高,我国科学家首次揭示旋转天体内部热对流运动新机制中国科学院上海天文台研究人员通过理论推导,首次揭示快速旋转的天体内部热对流运动新机制,相关研究成果今天(10月27日)在流体力学期刊流体物理论评(PhysicalReviewFlu我国科学家首次揭示旋转天体内部热对流运动新机制中国科学院上海天文台研究人员通过理论推导,首次揭示快速旋转的天体内部热对流运动新机制,相关研究成果今天(10月27日)在流体力学期刊流体物理论评(PhysicalReviewFlu中山房价五连跌,深圳房价都跌了,中山房价靠什么维持呢?深圳楼市成了中山楼市的黑天鹅,中山房价下跌主要是怪深圳房价。中山房价这周又跌了,看来深圳楼市那边热不起来,中山楼市这边也就热不起来了。中山楼市的那些炒房客也是比较无奈了,尤其是去年茅台本月大跌27,4年前一幕重现,后市将如何演绎?本文系基于公开资料撰写,仅作为信息交流之用,不构成任何投资建议。出品公司研究室文淮上月黑色星期五再现A股,沪深两市近5000只股票,跌幅超过5的股票近1300只,只有不到400只翻终于暴露!外汇储备暴降15,美元将港币视作30年前的阿根廷比索近段时间,一直再写关于人民币的问题,当然原因是大家都在关注这个话题,问的最多的还是关于放贷的事儿,这里可以很明确的告诉你,过去还多少,现在也差不多一样,看央行的利率政策,无论是公积
泰坦尼克号唯一幸存的日本人,一生受尽唾骂,隐忍到死才揭露真相1939年,在无数谩骂和侮辱声中,泰坦尼克号唯一幸存的日本人细野正文去世了。这个人有什么特殊之处吗?其实他就是电影泰坦尼克号中男扮女装上了救生艇的人物原型。1912年,泰坦尼克号巨福州房价四连跌,福州楼市掉进冰窟了,福州楼市分析第44期现在福州楼市里面房价跌得最多的,居然就是福州鼓楼区的房价。福州鼓楼区是福州房价最高的地方,也是福州楼市最核心的区域,但很多人都没想到,鼓楼区的房价会跌得这么惨。对比2021年9月份对于贷款你是否存在一些误解?大多数人对于贷款行业,多少有些误解。个人观点,采不采纳全凭自愿!一方面对金融贷款行业知识一知半解产生误解另一方面,不理解贷款从业者。信贷经理在朋友圈在人流多的地方推销贷款产品,这些就算实施延迟退休,以下4类人还可以提早领养老金,但有3个弊端最近,延迟退休又被网友炒上热搜,究其原因主要是3个信号令大家担忧第一,人口寿命提高建国初期我国的人均寿命仅有40岁左右的,2025年预期水平将达到了78。3岁,上涨超过38年,但目来之不易!财政收入由负转正最新统计显示,8月份,全国一般公共预算收入扣除留抵退税因素后,比上年同期增长9。5,按自然口径增长5。6。这是4月份以来,月度的财政收入首次实现自然口径正增长,可谓来之不易。同时,3000点保卫战又又又来了?头条群星8月榜截至今日收盘,沪指收盘3051点,股市跌跌不休,我只能说无话可说,那今天我们来讲讲其他的内容。最近全球的汇率市场也是血流成河,但未来可能比这个词更严酷。全世界只有四个猪价减仓下行为哪般?花生高位放大量,减仓下行,多头要跑?上周生猪2301合约破位下跌,增仓下跌的发生可能使得市场情绪发生转变抛储政策接连颁布,现货价格却越涨越高,然而在现货价格继续上行的时候,01合约本周却迎来破位下跌,为何?一方面,市看看东亚银行将一个违规违法的巨烂民生信托推介给我们从泛海法定代表人的承诺函从2021年3月开始的民生信托的暴雷,民生信托资金池的三个产品(永泰汇鑫汇天),2021年3月开始停止兑付,销售们纷纷安抚。放心,产品没有终极风险,底层资产iPhone14销量太差,苹果十月发布会要凉凉了?这个月苹果才举行了秋季发布会,新机iPhone14口碑却一直不咋地,而与它本是同根生的iPhone14Pro却依靠灵动岛功能成功出圈,大受追捧。据媒体报道,受iPhone14销量不美联储强收缩疗法加剧世界经济困境美联储21日宣布加息75个基点,为今年连续第三次如此大幅度加息。这表明,在没有看到通胀水平明显回落之前,美联储大概率不会停止其强收缩疗法,而这会显著加大世界经济困境。美联储今年3月伊万卡到婆家过节,罕见和超模妯娌小KK聊天,1米8的优势瞬间消失当地时间9月26日,伊万卡特朗普和丈夫贾里德库什纳,一同出现在新泽西州的朗布兰奇,到那里的库什纳家族庄园庆祝犹太新年。库什纳家族庄园就是伊万卡的公公婆婆现在生活的地方,在过节的时候
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网