开发中经常会遇到让TextView字体大小自适应的需求,ios端可以自适应大小,Android不行,我们需要单独处理。
当然了,针对的肯定是单行的TextView,如果是多行的,还需要加入行数这个变量。
实现思路是根据tv.getPaint().measureText()
方法获取当前的宽度,跟TextView控件的长度进行对比,如果TextView的宽度大于期望宽度,就减小字体大小,直到TextView的宽度等于或小于期望宽度。代码实现如下:
/**
* 根据给定的宽度,自动缩小TextView的字体,step为1px
*
* @param tv
* @param maxWidth
* @param value
*/
public static void adaptTextSize(TextView tv, float maxWidth, String value) {
if (tv == null) {
return;
}
if (maxWidth <= 0) {
return;
}
if (TextUtils.isEmpty(value)) {
return;
}
float tvWidth = tv.getPaint().measureText(value);
// 如果超出边界,调整字体
int count = 0;
while (tvWidth > maxWidth) {
//防止无限循环导致anr等问题
if (count > 100) {
break;
}
count++;
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, tv.getTextSize() - 1);
tvWidth = tv.getPaint().measureText(value);
}
tv.setText(value);
}