开发中有个简单的需求,就是在SplashActivity上显示一行免责声明,需要单行显示,并且在不同屏幕下也不能折行显示,所以就打算自定义TextView来解决这个问题。
直接上代码
/**
* 自定义TextView,文本内容自动调整字体大小以单行显示
*
*/
public class SingleLineTextView extends android.support.v7.widget.AppCompatTextView {
private Paint mTextPaint;
private float mTextSize;
public SingleLineTextView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
refitText(this.getText().toString(), this.getWidth());
}
/**
* Re size the font so the specified text fits in the text box assuming the
* text box is the specified width.
*
* @param text
* @param textViewWidth
*/
private void refitText(String text, int textViewWidth) {
if (text == null || textViewWidth <= 0)
return;
mTextPaint = getPaint();
mTextSize = getTextSize();
int availableTextViewWidth = textViewWidth - getPaddingLeft() - getPaddingRight();
float textMeausreWith = mTextPaint.measureText(text);
if (textMeausreWith > availableTextViewWidth) {
mTextSize = mTextSize * ((float) availableTextViewWidth / textMeausreWith);
}
this.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
}
}
我们知道一个view绘制过程主要是两个步骤onMeasure()和onDraw(),所以我在onDraw()中进行了textview的长度计算,进行相应的调整,原理很简单。
网友评论