canvas

canvas基础学习笔记(四)

2017-05-02  本文已影响95人  开心糖果的夏天

文字渲染

文字是页面制作必不可少的一部分,漂亮的文字会使网页赏心悦目,关于文字,我们可以设置它的字型、大小、填充、渐变色等等。示例代码如下:

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=800;
    
       var context=canvas.getContext('2d');
       
       //开始编码
      context.font="bold 40px Arial";
      context.fillStyle="#058";
      context.fillText("欢迎大家多提意见!",40,100);

      context.lineWidth=1;
      context.strokeStyle="#058";
      context.strokeText("欢迎大家多提意见!",40,200);

       //可选参用于控制字符的长度
      context.fillText("欢迎大家多提意见!",40,300,100);
      context.strokeText("欢迎大家多提意见!",40,400,100);

        //渐变字体
       var linearGrad=context.createLinearGradient(0,0,800,0);//水平渐变方向
       linearGrad.addColorStop(0.0,'red');
       linearGrad.addColorStop(0.25,'yellow');
       linearGrad.addColorStop(0.5,'green');
       linearGrad.addColorStop(0.75,'blue');
       linearGrad.addColorStop(1.0,'black');
       context.fillStyle=linearGrad;
       context.fillText("欢迎大家多提意见!",40,500);

       //利用图片填充字体
       var backgroundImage=new Image();
       backgroundImage.src="img/1.jpg";
       backgroundImage.onload=function(){
        var pattern=context.createPattern(backgroundImage,"repeat");
        context.fillStyle=pattern;
        context.font="bold 80px Arial";
        context.fillText("Canvas!",40,650);
        context.strokeText("Canvas!",40,650);//描边
     }
}
</script>

一、font:字型、字号和字体

context.font="bold 80px Arial";//设置字体的样式、大小、字型
context.fillText(String,x,y);//设置所填充的文字以及位置
context.strokeText(String,x,y);//绘制一行文字,这行文字只有外边框

context.fillText(String,x,y,[maxlen]);
context.strokeText(String,x,y,[maxlen]);
[maxlen]为可选参,描述所写文字的最长宽度为多少。

font-style的属性值:normal(默认值)、italic(斜体字)、oblique(倾斜字体);
font-variant的属性值:normal(默认值)、small-caps(小写字母变为小的大写字母);
font-weight的属性值:lighter(大多数浏览器不支持)、normal(默认值)、bold、bolder(大多数浏览器不支持);
font-size的属性值:20px(默认值)、2em、150%、xx-small、x-small、medium、large、x-large、xx-large;
font-family:设置多种字体备选(各个字体之间用逗号隔开);支持@font-face。

<script type="text/javascript">
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=2000;
    
       var context=canvas.getContext('2d');
       
      //font-style的属性值
      context.fillStyle="#058";

      context.font="bold 40px sans-serif";
      context.fillText("欢迎大家多提意见!",40,100);
      
      context.font="italic bold 40px sans-serif";
      context.fillText("欢迎大家多提意见!",40,200);

      context.font="oblique bold 40px sans-serif";
      context.fillText("欢迎大家多提意见!",40,300);
      
      //font-variant的属性值
      context.font="bold 40px sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,400);
      
      context.font="small-caps bold 40px sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,500);

      //font-weight的属性值
      context.font="lighter 40px impact";
      context.fillText("欢迎大家多提意见!",40,600);
      
      context.font="normal 40px impact";
      context.fillText("欢迎大家多提意见!",40,700);

      context.font="bold 40px impact";
      context.fillText("欢迎大家多提意见!",40,800);
   
      context.font="bolder 40px impact";
      context.fillText("欢迎大家多提意见!",40,900);

      //font-size的属性值
      context.font="lighter 2em impact";
      context.fillText("欢迎大家多提意见!",40,1000);

      context.font="xx-small  sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1100);

      context.font="x-small  sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1200);

      context.font="medium sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1300);

      context.font="large sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1400);

      context.font="x-large sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1500);

      context.font="xx-large  sans-serif";
      context.fillText("欢迎大家多提意见——Canvas!",40,1600);
}
</script>

二、文本对齐

1.描述文本的横向对齐方式(基准是给定文本的初始坐标值)

context.textAlign="left";
context.textAlign="right";
context.textAlign="center";

<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="#058";
      context.font="bold 20px sans-serif";

      context.textAlign="left";
      context.fillText("textAlign=left",400,100);

      context.textAlign="center";
      context.fillText("textAlign=center",400,200);

      context.textAlign="right";
      context.fillText("textAlign=right",400,300);
      
     //辅助线
     context.strokeStyle="#888";
     context.moveTo(400,0);
     context.lineTo(400,400);
     context.stroke();     
}
</script>

2.描述文本的垂直对齐方式

context.textBaseline="top";
context.textBaseline="middle";
context.textBaseline="bottom";
context.textBaseline="alphabetic";//(默认值)基于拉丁字符的语言
context.textBaseline="ideographic";//基于汉字及日本文字来设置的垂直方向的基准线
context.textBaseline="hanging";//基于印度文的字符串来设计的垂直方向的基准线

<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="#058";
      context.font="bold 20px sans-serif";

     context.textBaseline="top";
     context.fillText("欢迎大家提意见!",40,100);
     drawBaseline(context,100);

     context.textBaseline="middle";
     context.fillText("欢迎大家提意见!",40,200);
     drawBaseline(context,200);

     context.textBaseline="bottom";
     context.fillText("欢迎大家提意见!",40,300);
     drawBaseline(context,300);
     
     function drawBaseline(cxt,b){
       var width=cxt.canvas.width;

       cxt.save();
      
       cxt.strokeStyle="#888";
       cxt.lineWidth=2;
       cxt.moveTo(0,b);
       cxt.lineTo(width,b);
       cxt.stroke();

       cxt.restore();
     }    
}
</script>

3.文本对齐小实例

<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="#058";
      context.font="bold 120px Arial";

      context.textAlign="center";
      context.textBaseline="middle";
      context.fillText("CANVAS",canvas.width/2,canvas.height/2);
    
       context.strokeStyle="#888";
       context.moveTo(0,canvas.height/2);
       context.lineTo(canvas.width,canvas.height/2);
       context.moveTo(canvas.width/2,0);
       context.lineTo(canvas.width/2,canvas.height);
       context.stroke();  
     }
</script>

三、文本的度量

context.measureText(string).width
传入字符串将返回一个对象,这个对象拥有一个.width的属性,这个属性将返回传入字符串在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="#058";
      context.font="bold 40px sans-serif";

      context.fillText("欢迎大家多提意见!",40,100);
      var textWidth=context.measureText("欢迎大家多提意见!").width;
      context.fillText("以上字符串的宽度为"+textWidth+"px",40,200);
     }
</script>

四、总结

在之前学习的基础上绘制一片星空并在合适的位置加上文字,效果图如下:

效果图.jpg

代码如下:

<body >
 <canvas id="canvas" style="border: 1px solid #aaa;display: block;margin: 50px auto">
 当前浏览器不支持canvas,请更换浏览器后再试
 </canvas>

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

       //绘制标准五角星
       var skyStyle=context.createRadialGradient(canvas.width/2,canvas.height,0,canvas.width/2,canvas.height,canvas.height);
       skyStyle.addColorStop(0.0,'#035');
       skyStyle.addColorStop(1.0,'black');
       context.fillStyle=skyStyle;
       context.fillRect(0,0,canvas.width,canvas.height);

        for(var i=0;i<200;i++){
        var R=Math.random()*5+5;//星星可以变小
        var x=Math.random()*canvas.width;
        var y=Math.random()*canvas.height*0.65;//js 中的Math.random()随机产生0-1之间的数  星星产生的竖直位置从0到画布高度的65%
        var a=Math.random()*360;
        drawStar(context,R,x,y,a);
        }
       fillMoon(context,2,900,200,50,30);
       drawLand(context);//绘制绿地,只需要传入上下文的绘图环境

       //************************************插入文字
      context.fillStyle="#eee";
      context.font="bold 30px sans-serif";

      context.fillText("开心糖果的夏天!",200,700);
      context.fillText("——zhao peirong!",600,750);
      }

      //******************************************绘制星星
      function drawStar(cxt,R,x,y,rot){
       cxt.save();

       cxt.translate(x,y);//位移
       cxt.rotate(rot/180*Math.PI);//旋转
       cxt.scale(R,R);
       starPath(cxt);//函数的作用是绘制标准的五角星的路径

       cxt.fillStyle="#fb3";
       cxt.fill();
       cxt.restore();
      }
      
      function starPath(cxt){
      cxt.beginPath();
       for(var i=0;i<5;i++){
            cxt.lineTo(Math.cos((18+i*72)/180*Math.PI),-Math.sin((18+i*72)/180*Math.PI));
            cxt.lineTo(Math.cos((54+i*72)/180*Math.PI)*0.5,-Math.sin((54+i*72)/180*Math.PI)*0.5);
       }
       cxt.closePath();
      }

      //******************************************绘制月亮
       //d为控制点横坐标的值  x,y表示弯月的位置 R表示弯月的半径
      function fillMoon(cxt,d,x,y,R,rot,fillColor){
       cxt.save();

       cxt.translate(x,y);
       cxt.rotate(rot*Math.PI/180);
       cxt.scale(R,R);
       pathMoon(cxt,d);//绘制弯月的轮廓
       cxt.fillStyle=fillColor||"#fb3";//fillColor 不给赋值时,用默认的#fb5
       cxt.fill();

       cxt.restore();
      }
      
      function pathMoon(cxt,d){
       cxt.beginPath();
       cxt.arc(0,0,1,0.5*Math.PI,1.5*Math.PI,true);
       cxt.moveTo(0,-1);
       cxt.arcTo(d,0,0,1,dis(0,-1,d,0)/d);//内弧结束的位置为0,1
       cxt.closePath();
      }

      function dis(x1,y1,x2,y2){
        return Math.sqrt((x1-x2)*(x1-x2)+(y2-y1)*(y2-y1));     
      }

      //******************************************绘制绿地
      function drawLand(cxt){
        cxt.save();
        
        cxt.beginPath();
        cxt.moveTo(0,600);
        cxt.bezierCurveTo(540,400,660,800,1200,600);
        cxt.lineTo(1200,800);
        cxt.lineTo(0,800);
        cxt.closePath();

       //填充线性渐变色
       var landStyle=cxt.createLinearGradient(0,800,0,0);
       landStyle.addColorStop(0.0,'#030');
       landStyle.addColorStop(1.0,'#580');
       cxt.fillStyle=landStyle;
       cxt.fill();

       cxt.restore();
      }
</script>
</body>
上一篇下一篇

猜你喜欢

热点阅读