我正在尝试使用Latto-Reg字体将多行文本绘制到位图,并且StaticLayout似乎有问题。

paint.setTextSize(label.fontSize);
paint.setTypeface(face);
StaticLayout textLayout = new StaticLayout(label.text, paint, (int)StaticLayout.getDesiredWidth(label.text, paint), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
Bitmap bitmapAux = Bitmap.createBitmap(textLayout.getEllipsizedWidth(), textLayout.getHeight(), Bitmap.Config.ALPHA_8);
canvas.setBitmap(bitmapAux);
canvas.save();
canvas.translate(0, textLayout.height());
textLayout.draw(canvas);
canvas.restore();

纹理的顶部和底部都有填充,具体取决于字体和大小,而文本恰好适合位图,这会浪费大量的内存空间,并使其随机排列。

我使用单线绘图进行了测试,位图非常适合文本
paint.getTextBounds(label.text, 0, label.text.length(), rect);
Bitmap bitmapAux = Bitmap.createBitmap(rect.width(), rect.height(), Bitmap.Config.ALPHA_8);
canvas.drawText(label.text, -rect.left, -rect.bottom, paint);

我尝试过从StaticLayout获取各种指标,但它们似乎都偏离了文本:第0行界限,第0行顶部,最后一行底部...导致相同的填充问题。

编辑:
我通过使用基于偏移的单线图解决了该问题。仍然StaticLayout类使用几种不同的非标准字体无法正确绘制,我想知道为什么。

最佳答案

看看android developper页面,它看起来像是为处理多行情况而设计的,并很好地在另一个Layout旁边使用,因此文本行上方有空格,因此,如果将其直接放在另一个Layout下它将正确地隔开。本质上,它并不是为您要达到的目的而设计的。

总体而言,从Paint.getTextBounds()获取文本边界可能更容易知道文本范围将在Layout内。

10-04 23:14