canvas

canvas基础学习笔记(二)

2017-04-26  本文已影响167人  开心糖果的夏天

基于canvas基础学习笔记(一)的学习,首先从绘制一片星空开始:

一、星空绘制

<script type="text/javascript">
       window.onload=function(){
       var canvas=document.getElementById('canvas');
       canvas.width=800;
       canvas.height=800;
       var context=canvas.getContext('2d');

       //*******************************星空绘制
       context.fillStyle="black";
       context.fillRect(0,0,canvas.width,canvas.height);

       //************************************绘制多个不同的星星
       for(var i=0;i<200;i++){
        var R=Math.random()*10+10;
        var x=Math.random()*canvas.width;
        var y=Math.random()*canvas.height;
        var a=Math.random()*360;
        drawStar(context,R/2.0,R,x,y,a);
       }
   }
      //rot为旋转的角度  -rot是顺时针转
      function drawStar(cxt,r,R,X,Y,rot){
       cxt.beginPath();
       for(var i=0;i<5;i++){
            cxt.lineTo(Math.cos((18+i*72-rot)/180*Math.PI)*R+X,-Math.sin((18+i*72-rot)/180*Math.PI)*R+Y);
            cxt.lineTo(Math.cos((54+i*72-rot)/180*Math.PI)*r+X,-Math.sin((54+i*72-rot)/180*Math.PI)*r+Y);
       }
       cxt.closePath();
       cxt.fillStyle="#fb3";
       cxt.strokeStyle="#fd5";
       cxt.lineWidth=3;
       cxt.lineJoin="round";
       cxt.fill();
       cxt.stroke();
      }
</script>

二、图形变换

位移:translate(x,y);
旋转:rotate(deg);
缩放:scale(sx,sy);
注:1.用translate(x,y)进行位移变换时,会产生叠加,用context.save()解决。(context.save()是一种保持绘图状态的方法)
2.用scale(sx,sy)进行缩放时,会将图形的大小、边框以及位置都进行缩放,同样用context.save()解决。

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=800;
    
       var context=canvas.getContext('2d');


       /*问题:会出现translate的叠加
       context.fillStyle="red";
       context.translate(100,100),
       context.fillRect(0,0,400,400);

       context.fillStyle="green";
       context.translate(300,300),
       context.fillRect(0,0,400,400);
      */


      /* 解决办法一
       context.fillStyle="red";
       context.translate(100,100),
       context.fillRect(0,0,400,400);
       context.translate(-100,-100),

       context.fillStyle="green";
       context.translate(300,300),
       context.fillRect(0,0,400,400);
      }
      */

       /* 解决办法二*/
       context.save();
       context.fillStyle="red";
       context.translate(100,100),
       context.fillRect(0,0,400,400);
       context.restore();
       
       context.save();
       context.fillStyle="green";
       context.translate(300,300),
       context.fillRect(0,0,400,400);
       context.restore();
      }  
</script>

三、变换矩阵

变换矩阵.jpg

设置变换矩阵:transform(a,b,c,d,e,f)
注:在设置变换矩阵时,会叠加上次产生的效果,用setTransform(a,b,c,d,e,f)设置时会自动忽略掉之前设置的效果。

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=1200;
       canvas.height=800;
    
       var context=canvas.getContext('2d');
       //开始编码
       context.fillStyle="red";
       context.strokeStyle="#058";
       context.lineWidth="5";

       //a c e    
       //b d f
       //0 0 1
       //a——水平缩放 b——水平倾斜  c——垂直倾斜  d——垂直缩放 e——水平位移  f——垂直位移
       context.save();
       //context.transform(1,0,0,1,0,0);
       context.transform(2,0.2,0.2,1.5,50,100);
       context.fillRect(50,50,300,300);
       context.strokeRect(50,50,300,300);
       context.restore();
  }
</script>

四、填充样式——fillStyle

1.线性渐变(定义在两点之间)
分两步进行设置:
第一步:确定渐变方向
var grd=context.context.createLinearGradient(xstart,ystart,xend,yend);
第二步:设置关键颜色位置和渐变色
grd.addColorStop(stop,color);

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
       canvas.width=800;
       canvas.height=800;
    
       var context=canvas.getContext('2d');
       /*两个色的渐变
       var linearGrad=context.createLinearGradient(0,0,800,800);//渐变方向
       linearGrad.addColorStop(0.0,'#fff');
       linearGrad.addColorStop(1.0,'#000');
       context.fillStyle=linearGrad;
       context.fillRect(0,0,800,800);
       */
       //多个颜色渐变
       var linearGrad=context.createLinearGradient(0,0,800,0);//水平渐变方向
       linearGrad.addColorStop(0.0,'white');
       linearGrad.addColorStop(0.25,'yellow');
       linearGrad.addColorStop(0.5,'green');
       linearGrad.addColorStop(0.75,'blue');
       linearGrad.addColorStop(1.0,'black');
       context.fillStyle=linearGrad;
       context.fillRect(0,0,800,800);
  }
</script>

2.径向渐变(放射状渐变,定义在两个同心圆上)
分两步进行设置:
第一步:确定渐变的圆心,半径
var grd=context.createRadialGradient(x0,y0,r0,x1,y1,r1);
第二步:设置关键颜色位置和渐变色
grd.addColorStop(stop,color);

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
       canvas.width=800;
       canvas.height=800;

       var context=canvas.getContext('2d');
     
       //开始编码
       var radialGrad=context.createRadialGradient(400,400,0,400,400,500);
       radialGrad.addColorStop(0.0,'white');
       radialGrad.addColorStop(0.25,'yellow');
       radialGrad.addColorStop(0.5,'green');
       radialGrad.addColorStop(0.75,'blue');
       radialGrad.addColorStop(1.0,'black');
       context.fillStyle=radialGrad;
       context.fillRect(0,0,800,800);
  }
</script>

3.使用图片、画布或video填充
使用图片填充:context.createPattern(img,repeat-style);
repeat-style包含三个值:no-repeat、repeat-x、repeat-y、repeat.
使用画布填充:context.createPattern(canvas,repeat-style);
使用视频填充:context.createPattern(video,repeat-style);

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=800;
    
       var context=canvas.getContext('2d');

       //开始编码 
       var backgroundImage=new Image();
       backgroundImage.src="img/1.jpg";
       backgroundImage.onload=function(){
        var pattern=context.createPattern(backgroundImage,"repeat");
        context.fillStyle=pattern;
        context.fillRect(0,0,800,800);
       }
  }
</script>
上一篇下一篇

猜你喜欢

热点阅读