Canvas学习总结(1)

标签:

绘制环境:
getContext(“2d”):目前支持2D的场景

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
body{ background:black;}
#c1{ background:white;}
span{ color:white;}
</style>
<script>

window.onload = function(){
    var oC = document.getElementById('c1');

    var oGC = oC.getContext('2d');  //webgl : 3D绘图

};

</script>
</head>

<body>
<canvas id="c1" width="400" height="400">
    <span>不支持canvas浏览器</span>
</canvas> <!--默认:宽300 高150-->
</body>
</html>

中间的白正方形是canvas的画布,绘制的图形都在此方块内
这里写图片描述

绘制方块:
fillRect(L,T,W,H):默认颜色是黑色
strokeRect(L,T,W,H):带边框的黑块,默认是1px的黑色边框

设置绘图:
fillStyle:填充颜色(绘制canvas是有顺序的,先填充颜色和先绘边框,得到的图形是不一样的,原因在于canvas绘制的图形是层层叠加的)
lineWidth:线宽度,是一个数值
strokeStyle:边线颜色

body和style部分与上面的代码相同,js部分如下,展现以上提到的四点特性:

window.onload = function(){
    var oC = document.getElementById('c1'); 
    var oGC = oC.getContext('2d');  
    oGC.fillStyle = 'red';
    oGC.strokeStyle = 'blue';
    oGC.lineWidth = 10; 
    oGC.fillRect(50,50,100,100);
    oGC.strokeRect(50.5,50.5,100,100);
};

这里写图片描述
此方块距离左边和上边的距离为50px,长和宽都是100px,border为10px,若换一下oGC.fillRect(50,50,100,100)和oGC.strokeRect(50.5,50.5,100,100)的位置得到的图形是不一样的。

边界绘制:
lineJoin:边界连接点的样式
meter(默认)、round(圆角)、bevel(斜角)

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');  
    oGC.fillStyle = 'red';
    oGC.strokeStyle = 'blue';
    oGC.lineWidth = 10;
    oGC.lineJoin = 'bevel';
    oGC.fillRect(50,50,100,100);
    oGC.strokeRect(50.5,50.5,100,100);

};

边界点为圆角:
这里写图片描述

lineCap:端点样式
butt(默认)、round(圆角)、square(高度多出宽度一半的值)

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');  

    oGC.lineWidth = 20;
    oGC.lineCap = 'square';
    oGC.moveTo(100,100);
    oGC.lineTo(200,200);
    oGC.stroke();
};

这里写图片描述

绘制路径
beginPath:开始绘制路径
closePath:结束绘制路径
moveTo:移动到绘制的新目标点
lineTo:新的目标点

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');  
    oGC.beginPath();//开始绘制路径
    oGC.moveTo(100,100);//绘制路径的起点,即第一点
    oGC.lineTo(200,200);//绘制路径的第二点
    oGC.lineTo(300,200);//路径的第三点
    oGC.closePath();//闭合路径
    oGC.stroke();//将路径用线段连接起来

    oGC.beginPath();//重新开始绘制路径
    oGC.moveTo(100,200);//第一点
    oGC.lineTo(200,300);//第二点
    oGC.lineTo(300,300);//第三点
    oGC.closePath();//闭合路径
    oGC.fill();//填充路径
};

绘制路径:
stroke:划线,默认黑色
fill:填充,默认黑色
rect:矩形区域
clearRect:清屏,删除一个画布的矩形区域
save:保存路径
reStore:恢复路径

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');  
    oGC.beginPath();
    oGC.rect(100,100,100,100);//矩形区域,起始点(100,100),长和宽为100px
    oGC.closePath();
    oGC.fill();
    oGC.clearRect(0,0,oC.width,oC.height); //清除整个画布所有的区域 
};

清屏后,整个画布为空白的。

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');  
    oGC.save();//保存路径,
    oGC.fillStyle = 'red';//填充的红色只能在以下的代码中运用
    oGC.beginPath();
    oGC.moveTo(100,100);
    oGC.lineTo(200,200);
    oGC.lineTo(300,200);
    oGC.closePath();
    oGC.fill();
    oGC.restore();//恢复路径,以上为填充红色的运用范围


    oGC.beginPath();
    oGC.moveTo(100,200);
    oGC.lineTo(200,300);
    oGC.lineTo(300,300);
    oGC.closePath();
    oGC.fill();//默认为黑色
};

这里写图片描述

根据以上所学,进行一些简单的小案例
实例1:
在画布中,用鼠标绘画,显示出鼠标的轨迹

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');  
    oC.onmousedown = function(ev){
        var ev = ev || window.event;
        //鼠标在画布的坐标为鼠标的坐标减去画布的margin
        oGC.moveTo(ev.clientX-oC.offsetLeft,ev.clientY-oC.offsetTop);
        document.onmousemove = function(ev){
            var ev = ev || window.event;
            oGC.lineTo(ev.clientX-oC.offsetLeft,ev.clientY-oC.offsetTop);
            oGC.stroke();
        };
        document.onmouseup = function(){
            document.onmousemove = null;
            document.onmouseup = null;
        };
    };
};

实例2:
运动的小方块

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');  
    var num = 0;
    oGC.fillRect(0,0,100,100);
    setInterval(function(){
        num++;
        //必须清屏,去掉之前的小方块的运动轨迹,要不然会重叠
        oGC.clearRect(0,0,oC.width,oC.height);
        oGC.fillRect(num,num,100,100);
    },30);
};

绘制圆
arc(x,y,半径,起始弧度,结束弧度,旋转方向)
x,y:起始位置
弧度与角度的关系:弧度=角度*Math.PI/180
旋转方向:顺时针(默认false)、逆时针(true)

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');
    oGC.moveTo(200,200);
    //弧度 = 角度*Math.PI/180
    //起始角度零度为三点钟的那条线,从3点开始画图
    oGC.arc(200,200,150,0,90*Math.PI/180,true);
    oGC.stroke();
};

这里写图片描述
实例4:
会动的表

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');

    function toDraw(){  
        var x = 200;
        var y = 200;
        var r = 150;    
        //必须清屏,去除时针分针秒针走过的痕迹
        oGC.clearRect(0,0,oC.width,oC.height);
        var oDate = new Date();
        var oHours = oDate.getHours();
        var oMin = oDate.getMinutes();
        var oSen = oDate.getSeconds();
        //因表针起始点在12点,圆绘图在3点起始,所以要逆时针转90度,将绘图起始点移到12点
        //时针每小时走过的弧度
        var oHoursValue = (-90 + oHours*30 + oMin/2) * Math.PI/180;
        var oMinValue = (-90 + oMin*6) * Math.PI/180;
        var oSenValue = (-90 + oSen*6) * Math.PI/180;

        oGC.beginPath();
        for(var i=0;i<60;i++){
            oGC.moveTo(x,y);
            oGC.arc(x,y,r,6*i*Math.PI/180,6*(i+1)*Math.PI/180,false);
        }
        oGC.closePath();
        oGC.stroke();
        //绘制秒针刻度
        oGC.fillStyle = 'white';
        oGC.beginPath();
        oGC.moveTo(x,y);
        //绘制半径为19的白色的圆,将前面绘制的刻度遮盖住19px,漏出1px,
        oGC.arc(x,y,r*19/20,0,360*Math.PI/180,false);
        oGC.closePath();
        oGC.fill();

        //绘制时针刻度
        oGC.lineWidth = 3;
        oGC.beginPath();
        for(var i=0;i<12;i++){
            oGC.moveTo(x,y);
            oGC.arc(x,y,r,30*i*Math.PI/180,30*(i+1)*Math.PI/180,false);
        }
        oGC.closePath();
        oGC.stroke();

        oGC.fillStyle = 'white';
        oGC.beginPath();
        oGC.moveTo(x,y);
        oGC.arc(x,y,r*18/20,0,360*Math.PI/180,false);
        oGC.closePath();
        oGC.fill();

        //绘制时针
        oGC.lineWidth = 5;
        oGC.beginPath();
        oGC.moveTo(x,y);
        oGC.arc(x,y,r*10/20,oHoursValue,oHoursValue,false);
        oGC.closePath();
        oGC.stroke();
        //绘制分针
        oGC.lineWidth = 3;
        oGC.beginPath();
        oGC.moveTo(x,y);
        oGC.arc(x,y,r*14/20,oMinValue,oMinValue,false);
        oGC.closePath();
        oGC.stroke();

        //绘制秒针
        oGC.lineWidth = 1;
        oGC.beginPath();
        oGC.moveTo(x,y);
        oGC.arc(x,y,r*19/20,oSenValue,oSenValue,false);
        oGC.closePath();
        oGC.stroke();
    }
    setInterval(toDraw,1000);
    toDraw();
};

这里写图片描述
绘制其它曲线:
arcTo(x1,y1,x2,y2,r)
-第一组坐标、第二组坐标、半径
guadraticCurveTo(dx,dy,x1,y1)
-贝塞尔曲线:第一组控制点、第二组结束坐标
beizierCurveTo(dx1,dy1,dx2,dy2,x1,y1)
-贝塞尔曲线:第一组控制点、第二组控制点、第三组结束坐标

变化:
translate:
平移,将画布的坐标原点向左右方向移动x,向上下方向移动y.canvas的默认位置是在(0,0)
在位置 (10,10) 处绘制一个矩形,将新的 (0,0) 位置设置为 (70,70)。再次绘制新的矩形(请注意现在矩形从位置 (80,80) 开始绘制):
rotate:参数为弧度
scale:缩放

window.onload = function(){
    var oC = document.getElementById('c1');
    var oGC = oC.getContext('2d');
    oGC.translate(100,100);
    oGC.rotate(25*Math.PI/180);
    oGC.scale(0.5,0.5);
    oGC.fillRect(0,0,100,100);
};

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值