我试图用字体
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,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类仍然使用几种不同的非标准字体绘制错误,我想知道原因.
解决方法
看一下
android developper页面,它看起来像是设计用于处理多行情况并且在另一个布局井旁使用,因此在文本行的顶部有空间,这样如果你将它直接放在另一个布局下面它将正确间隔.从本质上讲,它并不是为您想要实现的目标而设计的.
总的来说,从Paint.getTextBounds()获取Text边界可能更容易知道文本在Layout中的范围.