SKIA - measureText() 返回的值不准确
Posted
技术标签:
【中文标题】SKIA - measureText() 返回的值不准确【英文标题】:SKIA - Inaccurate value returned by measureText() 【发布时间】:2013-08-14 06:58:54 【问题描述】:我在使用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 中获得准确的文本宽度有什么想法吗?
谢谢!
【问题讨论】:
上面的n是什么意思..? 【参考方案1】:我相信您要匹配的内容将来自“边界”
SkRect bounds;
SkScalar textWidth = paint.measureText("some", 4, &bounds);
这是适合给定文本的最小矩形,而 textWidth 略大于此。
【讨论】:
【参考方案2】:我也遇到过这个问题。不知道为什么会发生这种情况,可能是因为字距差异,但我得出了这个结论:
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 设置新参数
【讨论】:
以上是关于SKIA - measureText() 返回的值不准确的主要内容,如果未能解决你的问题,请参考以下文章
LinkLabel 需要比 TextRenderer.MeasureText 更多的空间说
Xamarin 安卓。将字节数组转换为位图。 Skia 解码器返回 false
BitmapFactory.decodeStream 总是返回 null,skia 解码器显示解码返回 false