android 画拟合曲线,android – 在一些指定的Rectangle中绘制文本拟合

使用画布,我想绘制一些适合某些指定矩形的短标签文本(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.

不幸的是,这仅适用于等宽字体.对于其他字体,它会更复杂,但也可能.

标签:android,text,canvas,drawing

来源: https://codeday.me/bug/20190610/1211968.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值