首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StaticLayout高度测量关闭

StaticLayout高度测量关闭
EN

Stack Overflow用户
提问于 2013-11-20 14:11:37
回答 2查看 5.9K关注 0票数 7

我试图用拉托-雷格字体将多行文本绘制到位图上,而StaticLayout似乎有问题。

代码语言:javascript
复制
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();

纹理在顶部和底部都有填充,取决于字体和大小,而文本则完全适合位图--它浪费了大量内存空间,使布局变得随意。

我使用单行绘图进行测试,并且位图非常适合文本。

代码语言:javascript
复制
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行顶部、最后一行bottom...leading都有相同的填充问题。

编辑:我用基于偏移量的单线图解决了这个问题.不过,StaticLayout类使用几种不同的非标准字体绘制得不正确,我想知道为什么.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-25 12:13:12

android开发器页面上看,它看起来既能处理多行的情况,又能很好地在另一个Layout旁边使用,因此在文本行的顶部有空间,这样如果您将它直接放在另一个Layout下面,它将被正确地间隔。本质上,它并不是为你想要达到的目标而设计的。

总的来说,从Paint.getTextBounds()获得文本边界可能更容易,以了解文本在Layout中的范围。

票数 5
EN

Stack Overflow用户

发布于 2013-11-24 21:43:41

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

您的代码似乎有一些错误:

  1. 你没有必要在位图内垂直翻译;
  2. 似乎没有用于height()的StaticLayout方法。

以下是我的结果:

我添加了一个绿色背景来说明位图的大小,但否则,我的代码与您的代码差别很小:

代码语言:javascript
复制
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);
}

我创建了一个非常简单的自定义组件来绘制位图:

代码语言:javascript
复制
@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(bitmap, 0, 0, paint);
}

似乎你是在互相转换来画多个纹理。我建议您在绘图方法中这样做,在绘制之前的纹理高度时垂直转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20098189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档