我们在使用的时候,尤其是字体过大,又不想换行,那么自动缩放字体大小就是比较好的选择了。这边贴出相关代码以做记录。
/**
* 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>