TextView自動縮放字體-AutoTextView

我們在使用的時候,尤其是字體過大,又不想換行,那麼自動縮放字體大小就是比較好的選擇了。這邊貼出相關代碼以做記錄。


/**
* Created by ttarfall on 2015/10/30.
*/

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.TextView;

import com.gzns.wallete.R;

/**
* @author ttarfall
* @date 2015-10-30 09:36
*/
public class AutoZoomTextView extends TextView {

/**
 * 自動縮放
 */
private boolean isAutoZoom;
private int maxWidth;
private float defaultTextSize=0.0f;

public AutoZoomTextView(Context context) {
    this(context, null);
}

public AutoZoomTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initAttrs(attrs);

}

public AutoZoomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initAttrs(attrs);
}

private void initAttrs(AttributeSet attrs) {
    setSingleLine(true);
    TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.AutoZoomTextView);
    isAutoZoom = a.getBoolean(R.styleable.AutoZoomTextView_is_auto_zoom, true);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    if(widthMode == MeasureSpec.AT_MOST){
        maxWidth = MeasureSpec.getSize(widthMeasureSpec);
    }
}
@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的空間寬度
        float textViewWidth1 = textViewWidth - paint.getFontSpacing() * 2;//不包含左右字體空間
        String text = getText().toString();
        float textWidth = paint.measureText(text);
        while (textWidth > textViewWidth1) {
            textSize--;
            paint.setTextSize(textSize);
            textWidth = paint.measureText(text);
            textViewWidth1 = textViewWidth - paint.getFontSpacing() * 2;
        }
    }
    super.onDraw(canvas);
}

public boolean isAutoZoom() {
    return isAutoZoom;
}

public void setIsAutoZoom(boolean isAutoZAoom) {
    this.isAutoZoom = isAutoZAoom;
}

相關的attr屬性配置:

<declare-styleable name="AutoZoomTextView">
    <attr name="is_auto_zoom"  format="boolean" />
</declare-styleable>
發佈了37 篇原創文章 · 獲贊 26 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章