HTML5 canvas ctx.fillText won't do line breaks?

前端 未结 17 1106
甜味超标
甜味超标 2020-11-28 01:37

I can\'t seem to be able to add text to a canvas if the text includes \"\\n\". I mean, the line breaks do not show/work.

ctxPaint.fillText(\"s  ome \\n \\\\n         


        
17条回答
  •  天命终不由人
    2020-11-28 02:04

    Here's my solution, modifying the popular wrapText() function that is already presented here. I'm using the prototyping feature of JavaScript so that you can call the function from the canvas context.

    CanvasRenderingContext2D.prototype.wrapText = function (text, x, y, maxWidth, lineHeight) {
    
        var lines = text.split("\n");
    
        for (var i = 0; i < lines.length; i++) {
    
            var words = lines[i].split(' ');
            var line = '';
    
            for (var n = 0; n < words.length; n++) {
                var testLine = line + words[n] + ' ';
                var metrics = this.measureText(testLine);
                var testWidth = metrics.width;
                if (testWidth > maxWidth && n > 0) {
                    this.fillText(line, x, y);
                    line = words[n] + ' ';
                    y += lineHeight;
                }
                else {
                    line = testLine;
                }
            }
    
            this.fillText(line, x, y);
            y += lineHeight;
        }
    }
    

    Basic usage:

    var myCanvas = document.getElementById("myCanvas");
    var ctx = myCanvas.getContext("2d");
    ctx.fillStyle = "black";
    ctx.font = "12px sans-serif";
    ctx.textBaseline = "top";
    ctx.wrapText("Hello\nWorld!",20,20,160,16);
    

    Here's a demonstration I put together: http://jsfiddle.net/7RdbL/

提交回复
热议问题