自动缩放字体TextView算是比较简单的自定义TextView了,主要原理就是比较当前view宽度与字体宽度,来实现对字体大小的控制
思路:
重写 TextView的onDraw
1.初始化 paint
// 初始化paint
TextPaint paint = getPaint();
if (defaultTextSize == 0.0f) {
defaultTextSize = getTextSize();
}
float textSize = defaultTextSize;
paint.setTextSize(textSize);
2.计算实际TextView显示宽度
float textViewWidth = maxWidth - getPaddingLeft() - getPaddingRight();//不包含左右padding的空间宽度
3.获得当前内容的实际显示宽度
String text = getText().toString();
float textWidth = paint.measureText(text);
4.判断当前内容实际显示宽度是否大于TextView实际显示宽度,如果大于,减小size,并重新计算当前内容宽度。
注:这里用了个土方法,当两个宽度十分接近的时候,就放慢减小的节奏,使它可以得到更为准确的数值。但其实还是存在误差
while (textWidth > textViewWidth) {
if (textWidth - textViewWidth < 50) {
textSize -= 0.01;
} else {
textSize -= 0.1;
}
paint.setTextSize(textSize);
textWidth = paint.measureText(text);
}
完整代码
@Override
protected void onDraw(Canvas canvas) {
TextPaint paint = getPaint();
if (defaultTextSize == 0.0f) {
defaultTextSize = getTextSize();
}
float textSize = defaultTextSize;
paint.setTextSize(textSize);
if (isAutoZoom) {
if (maxWidth == 0)
maxWidth = getWidth();
float textViewWidth = maxWidth - getPaddingLeft() - getPaddingRight();//不包含左右padding的空间宽度
String text = getText().toString();
float textWidth = paint.measureText(text);
while (textWidth > textViewWidth) {
if (textWidth - textViewWidth < 50) {
textSize -= 0.01;
} else {
textSize -= 0.1;
}
paint.setTextSize(textSize);
textWidth = paint.measureText(text);
}
}
super.onDraw(canvas);
}