TextView自動縮放字型-AutoTextView
阿新 • • 發佈:2019-02-06
我們在使用的時候,尤其是字型過大,又不想換行,那麼自動縮放字型大小就是比較好的選擇了。這邊貼出相關程式碼以做記錄。
/**
* 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>