SKIA - measureText()返回的值不准确

时间:2013-08-14 06:58:55

标签: skia

我在使用skia measureText()函数测量文本时遇到问题。 返回的值不准确。

SkPaint *skPaint = new SkPaint();

SkTypeface* myFont = SkTypeface::CreateFromName("Impact", SkTypeface::kNormal);

skPaint->setTypeface(myFont);
skPaint->setAntiAlias(true);
skPaint->setTextAlign(SkPaint::kLeft_Align);
skPaint->setTextEncoding(SkPaint::kUTF16_TextEncoding);
skPaint->setTextSize(SkIntToScalar(120));
skPaint->setColor(0xff000001);
canvas->drawText(text, length,  SkIntToScalar(x) ,  SkIntToScalar(y) , *skPaint);
SkScalar width = skPaint->measureText(text, length);

measureText()返回的宽度为451.

我通过照片编辑器应用程序检查了生成的位图文本,实际宽度仅为438。

有关在SKIA获取准确文本宽度的想法吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

我相信你想要匹配的东西将来自“界限”

SkRect bounds;
SkScalar textWidth = paint.measureText("some", 4, &bounds);

这是一个适合给定文本的最小矩形,而textWidth略大于。

答案 1 :(得分:1)

我也遇到过这个问题。不知道为什么会发生这种情况,也许是因为字距调整差异,但我来到了这个:

SizeF RenderTextAndroid::GetStringSizeF() {
    UpdateFont();
    const base::string16& text = GetLayoutText();
    std::vector<SkScalar> widths(text.length());
    paint_.getTextWidths(text.c_str(), GetStrByteLen(text), &widths[0], NULL);
    return SizeF(std::accumulate(widths.begin(), widths.end(), 0),
        font_metrics_.fBottom - font_metrics_.fTop);
}

UpdateFont只是将新参数设置为SkPaint