StaticLayout高度测量关闭

时间:2013-11-20 14:11:37

标签: android bitmap

我正在尝试使用字体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();

纹理在顶部和底部有填充,具体取决于字体和大小,而文本完全适合位图,这是一个浪费的大量内存空间,并使其随机关闭。

Top/bot padding wrong

我使用单线绘图测试,位图非常适合文本

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);

pixel-perfect

我尝试从StaticLayout获取所有类型的指标,并且它们似乎都不在文本中:第0行边界,第0行顶部,最后一行底部......导致相同的填充问题。

修改:     我通过使用基于偏移的单线绘图解决了这个问题。 StillLayout类仍然使用几种不同的非标准字体绘制错误,我想知道原因。

2 个答案:

答案 0 :(得分:5)

查看android developper页面,看起来它设计用于处理多行情况并在另一个Layout井旁边使用,因此在行的顶部有空间文本,以便如果您将它直接放在另一个Layout下面,它将正确间隔。从本质上讲,它并不是为你想要实现的目标而设计的。

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

答案 1 :(得分:1)

我已经创建了一个我认为你想要完成的最小工作示例:创建一个足够大的位图,以包含通过StaticLayout呈现的文本。

您的代码似乎有些问题:

  1. 你不必要地在位图内垂直翻译;
  2. 对于StaticLayout似乎没有height()方法。
  3. 这是我的结果:

    Application result

    我添加了一个绿色背景来说明位图的大小,但除此之外,我的代码与你的代码差别很小:

    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);
    }
    

    似乎你可能正在翻译以相互绘制多个纹理。我建议您在绘图方法中执行此操作,在绘制之后在上一个纹理的高度垂直平移。