1. 程式人生 > >Android自動縮放字型TextView

Android自動縮放字型TextView

自動縮放字型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);
    }