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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章