Android自動縮放字型TextView
阿新 • • 發佈:2019-02-19
自動縮放字型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);
}