博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
h5——canvas
阅读量:5295 次
发布时间:2019-06-14

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

目录

语义化标签

canvas标签

你的浏览器不支持canvas!

获取canvas容器

var can = document.getElementById(‘canvas’);

获取容器的宽和高度

var canWid = can.width;   //canvas 的宽度var canHei = can.height;   //canvas 的高度

创建一个画布

var ctx = can.getContext('2d');

设置画布宽度

ctx.lineWidth = 2;   //线条宽度

边框矩形,默认1px 黑色

ctx.strokeRect(x, y, width, height);

清除指定的矩形区域,变为透明

++设置fillStyle属性可以是CSS颜色,渐变,或图案。fillStyle 默认设置是#000000(黑色)++

ctx.clearRect(x, y, width, height);    

绘制线条

moveTo(x,y) 定义线条开始坐标

lineTo(x,y) 定义线条结束坐标
绘制线条我们必须使用到 "ink" 的方法,就像stroke()

ctx.moveTo(0,0);
ctx.lineTo(200,100);ctx.stroke();

线段端点显示的样式

ctx.lineCap = 'butt(默认)'、'round(圆弧)'、'square(方形)'

两线段连接处所显示的样式

ctx.lineJoin = 'miter(默认)'、round(圆角)、`bevel(横线)`

虚线

ctx.setLineDash([4, 2])   //设置虚线,参数为数组,第一个值为实现宽度,第二个值为空白的宽度ctx.lineDashOffset = 0;   //虚线起始偏移量

例如

var can = document.getElementById('canvas');var ctx = can.getContext('2d');var offset = 0;function draw() {     offset++;          if (offset > 16) {                    offset = 0;          }    ctx.clearRect(0,0, can.width, can.height);      ctx.setLineDash([6, 2]);      ctx.lineDashOffset = -offset;      ctx.strokeRect(10,10, 100, 100);}setInterval(draw, 20);

绘制圆形

arc(x,y,r,start,stop)

绘制圆形时使用了 "ink" 的方法, 比如
stroke() 【通过线条绘制轮廓(边框)】或者 fill()【通过路径填充区域(实心)】

ctx.beginPath();ctx.arc(95,50,40,0,2*Math.PI);//通过线条绘制轮廓(边框)ctx.stroke();

绘制弧线

//当前端点、(x1,y1)和(x2,y2)这三个点连成的弧线,r是半径ctx.arcTo(x1, y1, x2, y2, r);  //闭合路径,不是必须的,如果线的终点跟起点一样,会自动闭合。ctx.closePath()

==住:==

1.fill()和stroke()函数表示绘图结束。如果要继续绘制,需要重新新建路径(beginPath())。2.如果lineTo()最后的路径没有封闭,fill()函数会自动封闭路径,而stroke()函数不会。

绘制三角形

ctx.beginPath();ctx.moveTo(75, 50);    //路径起点ctx.lineTo(100, 75);ctx.lineTo(100, 25);ctx.fill();   //自动将路径闭合,并默认填充黑色。

填充颜色

ctx.fillStyle="#FF0000";

填充矩形

ctx.fillRect(x, y, width, height);

canvas 绘制文本

font - 定义字体

fillText(text,x,y) —— 在 canvas 上绘制实心的文本
strokeText(text,x,y) —— 在 canvas 上绘制空心的文本

ctx.shadowOffsetX = 2;     //X轴阴影距离,负值表示往上,正值表示往下ctx.shadowOffsetY = 2;     //Y轴阴影距离,负值表示往左,正值表示往右ctx.shadowBlur = 2;     //阴影的模糊程度ctx.shadowColor = "rgba(0, 0, 0, 0.5)";    //阴影颜色ctx.font="30px Arial";ctx.fillText("Hello World",10,50);

还有以下一些属性

ctx.font = '20px Times New Roman';ctx.textAlign = 'center';    //start, end, left, right or centerctx.textBaseline = 'middle'  //top, hanging, middle, alphabetic, ideographic, bottomctx.direction = 'inherit'   //ltr, rtl, inherit

渐变

  • createLinearGradient(x,y,x1,y1) - 线性渐变
// 创建渐变var grd=ctx.createLinearGradient(0,0,200,0);grd.addColorStop(0,"red");grd.addColorStop(1,"white"); // 填充渐变ctx.fillStyle=grd;ctx.fillRect(10,10,150,80);
  • createRadialGradient(x,y,r,x1,y1,r1) - 径向渐变
// 创建渐变var grd=ctx.createRadialGradient(75,50,5,90,60,100);grd.addColorStop(0,"red");grd.addColorStop(1,"white"); // 填充渐变ctx.fillStyle=grd;ctx.fillRect(10,10,150,80);

图像

drawImage(image,x,y)

var img=document.getElementById("scream");ctx.drawImage(img, 0, 0[,w, h]);   //w、h指定图片的宽高,则会同比例缩放

变形

状态

save()用来保存当前状态,restore()用来恢复刚才保存的状态。他们都可以多次调用。

ctx.fillStyle = 'black';  ctx.fillRect(20, 20, 150, 150);  ctx.save();  //保存当前状态  ctx.fillStyle= '#fff';  ctx.fillRect(45, 45, 100, 100);  ctx.restore();    //恢复到刚才保存的状态  ctx.fillRect(70, 70, 50, 50);

位移(translate)

ctx.translate(x, y); //更改canvas的原点

var ctx = document.getElementById('canvas').getContext('2d');for(var i = 1; i< 4; i++) {    ctx.save();   //使用save方法保存状态,让每次位移时都针对(0,0)移动。  ctx.translate(100*i, 0);  ctx.fillRect(0, 50, 50, 50);  ctx.restore();}

旋转

ctx.rotate(Math.PI * 2) //参照原点顺时针旋转360度

ctx.translate(75,75);    //把原点移动到(75, 75);  for (var i=1; i<6; i++){       // 从里到外一共6圈    ctx.save();    ctx.fillStyle = 'rgb('+(50*i)+','+(255-50*i)+',255)';    for (var j=0; j

缩放

ctx.scale(x, y); //基于原点缩放,x、y是两个轴的缩放倍数

var ctx = document.getElementById('canvas').getContext('2d');ctx.fillStyle = 'red';ctx.scale(0.8, 1.2);ctx.beginPath();ctx.arc(75, 75, 60, 0, Math.PI * 2);ctx.fill();

动画

  • setInterval(myFun, 10);

意思是隔一毫秒执行一个myFun函数,但是这样就有一个问题了,比如我myFun函数里面绘制的东西比较耗时,而10ms之内还没有完全绘制出来,但是这段代码强制1ms之后又开始绘制下一帧了,所以就会出现丢帧的问题;反之,如果时间设置太长,就会出现画面不流畅、视觉卡顿的问题.

  • ==requestAnimationFrame(myFun);==

根据一定的时间间隔,会自动执行myFun函数来进行绘制。这个”一定的时间间隔”就是根据浏览器的性能或者网速快慢来决定了,总之,它会保证你绘制完这一帧,才会绘制下一帧,保证性能的同时,也保证动画的流畅。

转载于:https://www.cnblogs.com/shuiyu/p/11134276.html

你可能感兴趣的文章
区间DP 等腰三角形
查看>>
mysql 存储引擎对索引的支持
查看>>
Linq 学习(1) Group & Join--网摘
查看>>
asp.net 调用前台JS调用后台,后台掉前台JS
查看>>
【转】iOS 宏(define)与常量(const)的正确使用-- 不错
查看>>
【转】iOS开发UI篇—iPad和iPhone开发的比较
查看>>
【转】Android底层库和程序
查看>>
Comparación para 2019 Nueva Lonsdor K518S y K518ISE
查看>>
论文笔记——MobileNets(Efficient Convolutional Neural Networks for Mobile Vision Applications)
查看>>
从今天开始
查看>>
Attribute(特性)与AOP
查看>>
第三次作业
查看>>
Matrix快速幂 模板
查看>>
tomcat7.0.27的bio,nio.apr高级运行模式
查看>>
C#预处理器命令
查看>>
苹果手表:大方向和谷歌一样,硬件分道扬镳
查看>>
Competing Consumers Pattern (竞争消费者模式)
查看>>
HDUOJ ------1398
查看>>
cf--------(div1)1A. Theatre Square
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>