我正在尝试使用字体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行顶部,最后一行底部......导致相同的填充问题。
修改: 我通过使用基于偏移的单线绘图解决了这个问题。 StillLayout类仍然使用几种不同的非标准字体绘制错误,我想知道原因。
答案 0 :(得分:5)
查看android developper页面,看起来它设计用于处理多行情况并在另一个Layout
井旁边使用,因此在行的顶部有空间文本,以便如果您将它直接放在另一个Layout
下面,它将正确间隔。从本质上讲,它并不是为你想要实现的目标而设计的。
总体而言,从Paint.getTextBounds()
获取文本边界可能更容易知道Layout
内文本的范围。
答案 1 :(得分:1)
我已经创建了一个我认为你想要完成的最小工作示例:创建一个足够大的位图,以包含通过StaticLayout呈现的文本。
您的代码似乎有些问题:
height()
方法。这是我的结果:
我添加了一个绿色背景来说明位图的大小,但除此之外,我的代码与你的代码差别很小:
public void createTexture() {
int width = textLayout.getEllipsizedWidth();
int height = textLayout.getHeight();
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas2 = new Canvas(bitmap);
Paint p2 = new Paint();
p2.setStyle(Style.FILL);
p2.setColor(Color.GREEN);
canvas2.drawRect(0, 0, width, height, p2);
textLayout.draw(canvas2);
}
我创建了一个非常简单的自定义组件来绘制位图:
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bitmap, 0, 0, paint);
}
似乎你可能正在翻译以相互绘制多个纹理。我建议您在绘图方法中执行此操作,在绘制之后在上一个纹理的高度垂直平移。