H5(2)

目录

canvas容器

save

restore

canvas实例-签名

canvas绘制曲线

arc(x,y,radius,startAngle,endAngle,anticlockwise)

arcTo(x1,y1,x2,y2,radius)

quadraticCurveTo(cp1x,cp1y,x,y)

bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)

canvas变换

translate(x,y)

rotate(angle)

scale(x,y)

变换实例

canvas实例-时钟

canvas使用图片

drawImage(image,x,y,width,height)

createPattern(image,repetition)

线性渐变

径向渐变

canvas绘制文本

fillText(text,x,y)

strokeText(text,x,y)

文本样式

font=value

textAlign=value

textBaseline=value

measureText()

canvas文本的垂直水平居中

文本阴影

shadowOffsetX=float & shadowOffsetY=float

shadowBlur=float

shadowColor=color(必须项)


canvas容器

  • 路径容器

每次调用路径api时,都会往路径容器里做登记。

调用beginPath()时,会清空整个路径容器。

  • 样式容器

每次调用样式api时,都会往样式容器里做登记。

调用save()时,将样式容器里的状态压入样式栈。

调用restore()时,将样式栈的栈顶状态弹出到样式容器里,并覆盖原来样式。

  • 样式栈

调用save()时,将样式容器里的状态压入样式栈。

调用restore()时,将样式栈的栈顶状态弹出到样式容器里,并覆盖原来样式。


save

save()是canvas 2D API通过将当前状态放入栈中,保存canvas全部状态的方法。

保存到栈中的绘制状态有下面部分组成:

  • 当前的变换矩阵
  • 当前剪切区域
  • 当前的虚线列表
  • 以下属性当前的值:

                strokeStyle

                fillStyle

                lineWidth

                lineCap

                lineJoin

restore

restore()是canvas 2D API通过在绘图状态栈中弹出顶端的状态,将canvas恢复到最近的保存状态的方法。如果没有保存状态,此方法不做改变。


canvas实例-签名

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            background-color: gray;
        }
        .test{
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            margin:auto;
            background-color: white;
        }
    </style>
    <script>
        window.onload=function(){
            var canvas=document.getElementsByTagName("canvas")[0];
            if(canvas.getContext){
                var ctx=canvas.getContext("2d");
            }
            canvas.onmousedown=function(ev){
                ev=ev||window.event;
                if(canvas.setCapture){
                    canvas.setCapture();
                }
                ctx.beginPath();
                ctx.moveTo(ev.clientX-canvas.offsetLeft,ev.clientY-canvas.offsetTop);
                document.onmousemove=function(ev){
                    ctx.lineTo(ev.clientX-canvas.offsetLeft,ev.clientY-canvas.offsetTop);
                    ctx.stroke();
                }
                document.onmouseup=function(){
                    document.onmousemove=document.onmouseup=null;
                    if(document.releaseCapture){
                        document.releaseCapture();
                    }
                }
                return false;
            }
        }
    </script>
</head>
<body>
    <canvas class="test" width="500px" height="500px"></canvas>
</body>
</html>

canvas绘制曲线

角度与弧度的JS表达式:radius=(Math.PI/180)*degrees

arc(x,y,radius,startAngle,endAngle,anticlockwise)

画一个以(x,y)为圆心,半径为radius的圆弧(圆),从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针)来生成。

anticlockwise可取两个值:

        true:逆时针

        false:顺时针

startAngle以及endAngle参数用弧度定义了开始和结束的弧度,这些都是以x轴为基准的。

arcTo(x1,y1,x2,y2,radius)

根据给定的控制点(需要三个点,即moveTo()来控制起始点)和半径画一段圆弧。

画出的弧肯定经过起始点(即moveTo()指定的点),但不一定经过(x1,y1)(x2,y2),坐标点只是控制一个方向。

quadraticCurveTo(cp1x,cp1y,x,y)

绘制二次贝塞尔曲线,(cp1x,cp1y)为一个控制点,(x,y)为结束点,起始点为moveTo()时指定的点。

画出弧的肯定经过起始点和结束点

bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y)

绘制三次贝塞尔曲线,(cp1x,cp1y)为控制点一,(cp2x,cp2y)为控制点二,(x,y)为结束点,起始点为moveTo()时指定的点。

画出弧的肯定经过起始点和结束点


canvas变换

translate(x,y)

该方法用来移动canvas的原点到一个不同的位置。

该方法接受两个参数:x为水平偏移量,y为垂直偏移量。

在canvas中translate()方法是累加之后的结果

rotate(angle)

该方法用来旋转canvas坐标轴。该方法只接受一个参数:旋转角度(angle),它是顺时针方向的,以弧度为单位的值。旋转的中心始终是canvas的原点,如果要改变它,需要调用translate()方法。

在canvas中rotate()方法是累加之后的结果

scale(x,y)

该方法接受两个参数:x,y分别是横轴和纵轴的缩放因子,其值必须为正值。

值比1.0小表示缩小,比1.0大表示放大。

缩放一般用来增减图形在canvas中的像素数目,对形状、位图进行缩小或放大。

在canvas中scale()方法是累乘的

变换实例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            background-color: gray;
        }
        .test{
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            margin:auto;
            background-color: white;
        }
    </style>
    <script>
        window.onload=function(){
            var flag=0;
            var scale=0;
            var i=1;
            var canvas=document.getElementsByTagName("canvas")[0];
            if(canvas.getContext){
                var ctx=canvas.getContext("2d");
            }
            ctx.save();
            ctx.translate(250,250);
            ctx.beginPath();
            ctx.fillRect(-75,-75,150,150);
            ctx.restore();
            setInterval(function(){
                flag++;
                ctx.clearRect(0,0,500,500);
                ctx.save();
                ctx.translate(250,250);
                ctx.rotate(flag*Math.PI/180);
                if(scale==100)
                    i=-1;
                else if(scale==0)
                    i=1;
                scale=scale+i;
                ctx.scale(scale/100,scale/100);
                ctx.beginPath();
                ctx.fillRect(-75,-75,150,150);
                ctx.restore();
            })
        }
    </script>
</head>
<body>
    <canvas class="test" width="500px" height="500px"></canvas>
</body>
</html>

canvas实例-时钟

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            background-color: gray;
        }
        .test{
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            margin:auto;
            background-color: white;
        }
    </style>
    <script>
        window.onload=function(){
            var canvas=document.getElementsByTagName("canvas")[0];
            if(canvas.getContext){
                var ctx=canvas.getContext("2d");
                setInterval(function(){
                    ctx.clearRect(0,0,canvas.width,canvas.height);
                    move();
                },1000)
            }
            function move(){
                ctx.save();
                ctx.lineWidth=8;
                ctx.lineCap="round";
                ctx.strokeStyle="black";
                ctx.translate(250,250);
                ctx.rotate(-90*Math.PI/180);
                //外盘
                ctx.save();
                ctx.strokeStyle="gray";
                ctx.lineWidth=14;
                ctx.beginPath();
                ctx.arc(0,0,140,0,360*Math.PI/180);
                ctx.stroke();
                ctx.restore();
                //时针刻度
                ctx.save();
                ctx.beginPath();
                for(var i=0;i<12;i++){
                    ctx.moveTo(100,0);
                    ctx.lineTo(120,0);
                    ctx.stroke();
                    ctx.rotate(30*Math.PI/180);
                }
                ctx.restore();
                //分针刻度
                ctx.save();
                ctx.lineWidth=4;
                ctx.beginPath();
                for(var i=0;i<60;i++){
                    if(i%5==0){
                        ctx.rotate(6*Math.PI/180);
                        continue;
                    }
                    ctx.moveTo(117,0);
                    ctx.lineTo(120,0);
                    ctx.stroke();
                    ctx.rotate(6*Math.PI/180);
                }
                ctx.restore();
                //内部
                var date=new Date();
                var s=date.getSeconds();
                var m=date.getMinutes()+s/60;
                var h=date.getHours()+m/60;
                if(h>12) h=h-12;
                //时针
                ctx.save();
                ctx.lineWidth=14;
                ctx.rotate(h*30*Math.PI/180);
                ctx.beginPath();
                ctx.moveTo(-20,0);
                ctx.lineTo(80,0);
                ctx.stroke();
                ctx.restore();
                //分针
                ctx.save();
                ctx.lineWidth=10;
                ctx.rotate(m*6*Math.PI/180);
                ctx.beginPath();
                ctx.moveTo(-28,0);
                ctx.lineTo(112,0);
                ctx.stroke();
                ctx.restore();
                //秒针
                ctx.save();
                ctx.lineWidth=6;
                ctx.strokeStyle="red";
                ctx.fillStyle="red";
                ctx.rotate(s*6*Math.PI/180);
                ctx.beginPath();
                ctx.moveTo(-30,0);
                ctx.lineTo(83,0);
                ctx.stroke();
                //表座
                ctx.beginPath();
                ctx.arc(0,0,10,0,360*Math.PI/180);
                ctx.fill();
                ctx.restore();
                ctx.restore();
            }
        }
    </script>
</head>
<body>
    <canvas class="test" width="500px" height="500px"></canvas>
</body>
</html>

canvas使用图片

canvas操作图片时,必须要等待图片加载完才能操作

drawImage(image,x,y,width,height)

其中imageimage或者canvas对象,xy是其在目标canvas里的起始坐标

这个方法多了两个参数:widthheight,这两个参数用来控制当向canvas画入时应该缩放的大小

createPattern(image,repetition)

该方法用来设置canvas背景

repetition可选值:

  • "repeat"
  • "repeat-x"
  • "repeat-y"
  • "no-repeat"

一般情况下,我们会将createPattern()返回的对象作为fillStyle()的值

线性渐变

createLinearGradient(x1,y1,x2,y2)

渐变起点(x1,y1),终点(x2,y2)

gradient.addColorStop(position,color)

gradient:createLinearGradient的返回值

addColorStop方法接受两个参数:

        position参数必须是一个0.0与1.0之间的数值,表示渐变中颜色所在的相对位置。例如,0.5表示颜色出现在正中间。

        color参数必须是一个有效的CSS颜色值

径向渐变

createRadialGradient(x1,y1,r1,x2,y2,r2)

前三个参数定义另一个以(x1,y1)为原点,半径为r1的圆

后三个参数定义另一个以(x2,y2)为原点,半径为r2的圆


canvas绘制文本

canvas中提供了两种方法来渲染文本

fillText(text,x,y)

在指定的(x,y)位置填充指定的文本

strokeText(text,x,y)

在指定的(x,y)位置绘制文本边框

文本样式

font=value

当前用来绘制文本的样式,这个字符串使用和CSS font属性相同的语法

默认字体是10px sans-serif

font属性在指定时,必须要有大小和字体。

textAlign=value

文本对齐选项,可选值有:"left"、"right"、"center"

  • "left":左对齐
  • "right":右对齐
  • "center":居中对齐

这里的textAlign="center"比较特殊,textAlign的值为center时,文本的居中是基于你在fillText时所给的x值,也就是文本一半在x的左边,一半在x的右边

textBaseline=value

描述文本时,当前文本基线的属性

  • "top":文本基线在文本块的顶部
  • "middle":文本基线在文本块的中间
  • "bottom":文本基线在文本块的底部

measureText()

该方法需要传入一个参数,返回一个TextMetrics对象,包含关于文本尺寸的信息(例如文本的宽度)

canvas文本的垂直水平居中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            background-color: gray;
        }
        .test{
            position: absolute;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            margin:auto;
            background-color: white;
        }
    </style>
    <script>
        window.onload=function(){
            var canvas=document.getElementsByTagName("canvas")[0];
            if(canvas.getContext){
                var ctx=canvas.getContext("2d");
            }
            ctx.font="60px gg";
            ctx.textBaseline="middle";
            var w=ctx.measureText("星辰").width;
            ctx.fillText("星辰",(canvas.width-w)/2,(canvas.height-60)/2);
        }
    </script>
</head>
<body>
    <canvas class="test" width="500px" height="500px"></canvas>
</body>
</html>

文本阴影

shadowOffsetX=float & shadowOffsetY=float

shadowOffsetXshadowOffsetY用来设定阴影在X和Y的延伸距离,它们都默认为0

shadowBlur=float

设定阴影的模糊程度,其数值并不跟像素的数量挂钩,也不受变换矩阵的影响,默认为0

shadowColor=color(必须项)

shadowColor是标准的CSS颜色值,用于设定阴影颜色效果,默认是全透明的黑色

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值