本文介绍了HTML5 Canvas API斜体字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在HTML5中使用Canvas API时遇到了一个小问题。
我有一个文本,我必须在html页面的画布上显示。

I have a small problem using Canvas API in HTML5.I have a text that I have to show on a canvas in an html page.

文本示例可以是This is a Italic words。
所以我要做的就是显示我从数据库中获取的这个文本,但是只用Italic这个句子中的一个单词。所以我必须显示如下文字:

The text example can be "This is an Italic word".So what I have to do is display this text that I take from the database, but to make just one word from the sentence Italic. So I have to display the text like this:

所以我的代码如下:

<script>
  var canvas = document.getElementById('myCanvas');
  var context = canvas.getContext('2d');

  //text
  context.fillStyle  = "#000000";
  context.font = "20px Sans-Serif";
  context.textBaseline = "top";
  context.fillText  ("This is an ", 195, 80 );

  context.font = "italic 20px Sans-Serif";
  context.fillText  ("Italic", 285, 80 );
  context.font = "20px Sans-Serif";
  context.fillText  ("text", 330, 80 );
</script>

所以这段代码实际上并不是动态的,我有时间知道正确的像素从哪里开始其余的句子。
有没有人知道我怎么能动态地解决这个问题呢?

So this code is not actually dynamic and I have all the time to know the correct pixel where to start the rest of the sentence.Does anybody have an idea how can I solve this issue dynamically and clean ?

谢谢!

推荐答案

为了获得某种灵活性,你必须决定文本中的一个约定,它会告诉你样式的变化。

还有,你会必须使用measureText才能填写文本的单独'运行',每次运行使用正确的样式, measureText(thisRun).width 将为您提供像素大小当前运行。

那么你需要的是绘制单独的文本运行,每个运行都有自己的风格,然后根据measureText的返回值移动'cursor'。

To achieve some kind of flexibility, you have to decide of a convention inside your text that will tell that the style changed.
And also, you'll have to use measureText to be able to fillText separate 'runs' of the text, each run using the right style, measureText(thisRun).width will give you the size in pixels of the current run.
Then what you need is to draw separate text runs, each in its own style, then move on the 'cursor' based on the return value of measureText.

作为一个简单的例子,我把样式约定为§r=常规文本,§i= italic,§b=粗体,§l=更轻,所以string:

For a quick example, i took as styling convention "§r" = regular text, "§i" = italic, "§b" = bold, "§l" = lighter, so the string :

var text = "This is an §iItalic§r, a §bbold§r, and a §llighter§r text";

将输出为:

小提琴在这里:

代码是:

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

// marker used in the text to mention style change
var styleMarker = '§';

// table code style --> font style
var styleCodeToStyle = {
    r: '',
    i: 'italic',
    b: 'bold',
    l: 'lighter'
};

// example text
var text = "This is an §iItalic§r, a §bbold§r, and a §llighter§r text";

// example draw
drawStyledText(text, 20, 20, 'Sans-Serif', 20);

// example text 2 :

var text2 = "This is a text that has separate styling data";
var boldedWords = [ 3, 5, 8 ];
var italicWords = [ 2, 4 , 7];

var words = text2.split(" ");
var newText ='';

for (var i=0; i<words.length; i++) {
  var thisWord = words[i];
  if (boldedWords.indexOf(i)!=-1)
      newText += '§b' + thisWord + '§r ';
   else if (italicWords.indexOf(i)!=-1)
      newText += '§i' + thisWord + '§r ';
    else
       newText += thisWord + ' ';
}

drawStyledText(newText, 20, 60, 'Sans-Serif', 20);


function drawStyledText(text, x, y, font, fontSize) {
    // start with regular style
    var fontCodeStyle = 'r';
    do {
        // set context font
        context.font = buildFont(font, fontSize, fontCodeStyle);
        // find longest run of text for current style
        var ind = text.indexOf(styleMarker);
        // take all text if no more marker
        if (ind == -1) ind = text.length;
        // fillText current run
        var run = text.substring(0, ind);
        context.fillText(run, x, y);
        // return if ended
        if (ind == text.length) return;
        // move forward
        x += context.measureText(run).width;
        // update current style
        fontCodeStyle = text[ind + 1];
        // keep only remaining part of text
        text = text.substring(ind + 2);
    } while (text.length > 0)
}


function buildFont(font, fontSize, fontCodeStyle) {
    var style = styleCodeToStyle[fontCodeStyle];
    return style + ' ' + fontSize + 'px' + ' ' + font;
}

这篇关于HTML5 Canvas API斜体字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-31 08:34