• 技术文章 >web前端 >H5教程

    html5 canvas的绘制文本自动换行的示例代码

    青灯夜游青灯夜游2018-10-08 17:29:37转载1902
    在使用 canvas 绘制某字符串的时候,我们可能想要让该字符串在某处按要求换行。那么应该如何实现,本文就来介绍一下,有兴趣的可以了解一下。

    本文介绍怎么解决canvas绘图过程中,drawText的换行问题,先看一个大家平时在canvas绘制文本都会遇到的问题:

    一个150*100的canvas画布,加个边框明显边界

    <canvas id="canvas" style="border:solid 1px darkgoldenrod;" width="200px" height="100px"></canvas>

    我们先来看fillText()方法,strokeText()方法同理

    var c=document.getElementById("canvas"); 
    var ctx=c.getContext("2d"); 
    ctx.fillStyle="#E992B9";
    ctx.lineWidth=1;
    var str = "假如生活欺骗了你,请不要悲伤!thank you!"
    ctx.fillText(str,0,20);

    可以看到fillText()在固宽的canvas中,字数过多的时候,并不会自动换行,我们可以增加canvas本身的宽度,但这不是解决问题的根本方法。还记得之前介绍canvas基本api的时候,有一个函数,context.measureText(text) 这个函数可以测量字体的宽高度,那就好办了,我们计算好我们字符串的长度加上一个大概的宽度,基本上可以处理这种换行的问题了。

    下面看具体实现方法:

    var c=document.getElementById("canvas"); 
    var ctx=c.getContext("2d"); 
    ctx.fillStyle="#E992B9";
    ctx.lineWidth=1; 
    var str = "假如生活欺骗了你,请不要悲伤!thank you!"
    var lineWidth = 0;
    var canvasWidth = c.width;//计算canvas的宽度
    var initHeight=15;//绘制字体距离canvas顶部初始的高度
    var lastSubStrIndex= 0; //每次开始截取的字符串的索引
    for(let i=0;i<str.length;i++){ 
        lineWidth+=ctx.measureText(str[i]).width; 
        if(lineWidth>canvasWidth){  
            ctx.fillText(str.substring(lastSubStrIndex,i),0,initHeight);//绘制截取部分
            initHeight+=20;//20为字体的高度
            lineWidth=0;
            lastSubStrIndex=i;
        } 
        if(i==str.length-1){//绘制剩余部分
            ctx.fillText(str.substring(lastSubStrIndex,i+1),0,initHeight);
        }
    }

    见效果图:

    算法:计算字符串str里面每个字符的宽度的和lineWidth,如果大于canvas的宽度,就截取这部分进行绘制,然后重置lineWidth,保存开始截取的最后的索引,当循环变量i为最后一个字符的时候,直接绘制剩余部分。

    接下来:我们封装成一个方法,方便以后直接调用:

    /*
    str:要绘制的字符串
    canvas:canvas对象
    initX:绘制字符串起始x坐标
    initY:绘制字符串起始y坐标
    lineHeight:字行高,自己定义个值即可
    */
    function canvasTextAutoLine(str,canvas,initX,initY,lineHeight){
        var ctx = canvas.getContext("2d"); 
        var lineWidth = 0;
        var canvasWidth = c.width; 
        var lastSubStrIndex= 0; 
        for(let i=0;i<str.length;i++){ 
            lineWidth+=ctx.measureText(str[i]).width; 
            if(lineWidth>canvasWidth-initX){//减去initX,防止边界出现的问题
                ctx.fillText(str.substring(lastSubStrIndex,i),initX,initY);
                initY+=lineHeight;
                lineWidth=0;
                lastSubStrIndex=i;
            } 
            if(i==str.length-1){
                ctx.fillText(str.substring(lastSubStrIndex,i+1),initX,initY);
            }
        }
      }

    以上就是本文的全部内容,希望对大家的学习有所帮助!

    以上就是html5 canvas的绘制文本自动换行的示例代码的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:脚本之家,如有侵犯,请联系admin@php.cn删除
    上一篇:Canvas引入跨域的图片导致toDataURL()报错的问题的解决 下一篇:html5使用canvas压缩图片的示例代码
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)_javascript技巧• JavaScript html5 canvas绘制时钟效果_javascript技巧• 用canvas 实现个图片三角化(LOW POLY)效果_javascript技巧• JavaScript+html5 canvas实现本地截图教程_javascript技巧
    1/1

    PHP中文网