【问题标题】:StaticLayout height measurements offStaticLayout 高度测量关闭
【发布时间】:2013-11-25 22:03:12
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我创建了一个我认为您正在尝试完成的最小工作示例:创建一个足够大的位图以包含通过 StaticLayout 呈现的文本。

      您的代码似乎有一些问题:

      1. 您在位图中进行了不必要的垂直平移;
      2. 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);
      }
      

      似乎您正在翻译以逐个绘制多个纹理。我建议你在你的 draw 方法中这样做,而不是在绘制它之后在上一个纹理的高度中垂直平移

      【讨论】:

      • 你的结果是错误的,你看不到填充吗?位图必须将文本包装到像素。试试 canvas.drawtext 看看有什么不同。
      • >StaticLayout 似乎没有 height() 方法。 >这里:developer.android.com/reference/android/text/…
      • 文本上下的“填充”确实是TextPaint的边界。它扩展到字符可以显示的位置,基线上方和下方。我不确定是否可以测量单个字符,但似乎这种方法是避免这种情况的唯一方法。
      • 另请注意,在您的问题中,您引用了不存在的 height() 方法。
      • 我通过使用基于偏移量的canvas.drawText单线绘制解决了这个问题。它可以在没有填充的情况下完成。
      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      相关资源
      最近更新 更多