使用画布,我想绘制一些适合某些指定矩形的短标签文本(1-2个字符).
由于某些其他原因,我使用的缩放使得该重新纠缠的尺寸很小,即大约1.
我面临的问题是在绘制文本(我使用Canva.drawText()之前)计算最佳(尽可能大,使文本仍然适合)文本大小与Paint.setTextSize一起使用.
为此我可以使用Paint.Fontmetrics对象将一些通用字体尺寸作为浮点数或getTextBounds(String text,int start,int end,Rect bounds)来获取文本的边界框作为整数矩形.由于我使用的缩放,后者的整数边界框是不精确的,以便为我的目的计算最佳文本大小.
我需要的是一些方法来获得更高精度的文本边界框(例如java.awt.FontMetrics中的getStringBounds(String str,Graphics context)),但我找不到合适的方法.
解决方法:
我现在也忙于这个问题.
不幸的是我还没有设法安装原生源,但我很确定文本测量(getTextBounds()和measureText())与真正的文本输出有很大不同,特别是对于小字体(可见在Moritz’ screenshot).
我想测量方法对char使用float宽度,而实际文本输出使用int(可能是由于性能).如果您需要绝对精确的尺寸(例如自动调整大小),这当然会失败.
我用monospace字体进行了一些实验.此图显示了其中一些实验:
.
这些实验中的文本比例是通过自动缩放来设置的.
在顶行,我创建了一个整数增量的框.这些匹配android文本输出.你看,最后一个密码与屏幕不匹配!
在第2行中,使用浮点增量创建框.框更好地匹配屏幕,但它们与android文本输出不匹配!
在最后一行中,方框以浮点增量递增,文本由char以相同的增量输出char.盒子和字母都很完美.
在我的结论中,目前无法将Android文本输出设置为精确的宽度.问题似乎不是测量方法,这是足够精确的.问题似乎是,您无法通过setTextSize()设置确切的文本宽度.
请尝试以下方法重现:
float width = 100; // define a width which should be achieved
m_textPaint.setTextSize( 100 ); // set a text size surely big enough
Rect r = new Rect();
String s = new String("This is a test text");
m_textPaint.getTextBounds( s, 0, s.length(), r ); // measure the text with a random size
float fac = width / r.width(); // compute the factor, which will scale the text to our target width
Log.i( "MyTestOutput", "current text width:" + r.width() );
Log.i( "MyTestOutput", "wanted text width:" + width );
Log.i( "MyTestOutput", "factor:" + fac );
Log.i( "MyTestOutput", "expected result:" + (float) r.width() * fac );
m_textPaint.setTextSize( m_textPaint.getTextSize() * fac );
m_textPaint.getTextBounds( s, 0, s.length(), r ); // now final measurement: whats the real width?
Log.i( "MyTestOutput", "real result:" + r.width() );
我得到一个输出:
05-26 12:18:18.420: I/MyTestOutput(23607): current text width:1125
05-26 12:18:18.425: I/MyTestOutput(23607): wanted text width:100.0
05-26 12:18:18.425: I/MyTestOutput(23607): factor:0.08888889
05-26 12:18:18.425: I/MyTestOutput(23607): expected result:100.0
05-26 12:18:18.430: I/MyTestOutput(23607): real result:94
因此,在我看来,实现非常精确自动缩放文本的唯一方法是
a)通过测量和设置文本大小来自动调整它
b)通过char以自计算增量输出char.
不幸的是,这仅适用于等宽字体.对于其他字体,它会更复杂,但也可能.