1、實現結果:
定義一個字體最大值和字體最小值
默認情況下顯示最大值,當內容排版空間不足的情況下,調整字體大小
2、分析過程:
可以通過計算指定字體大小的文字計算寬度是否能夠排下內容,不能,就減小字體大小
3、attrs添加參數:
<attr name="maxTextSize" format="dimension"/>
<attr name="minTextSize" format="dimension"/>
<declare-styleable name="AutoAlignTextView">
<attr name="maxTextSize" />
<attr name="minTextSize"/>
</declare-styleable>
設置一個maxTextSize和minTextSize,maxTextSize代表最大顯示文字大小,minTextSize設置最小顯示文字大小
4、自定義TextView
/**
* 自定義TextView,根據寬度改變大小
*/
public class AutoAlignTextView extends TextView {
private float maxTextSize, minTextSize; //最大字體和最小字體
private float maxWidth;
public AutoAlignTextView(Context context) {
this(context, null);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
maxWidth = w;
}
public AutoAlignTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AutoAlignTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
public void init(Context context, AttributeSet attrs) {
setMaxLines(1);
TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.AutoAlignTextView);
float percentWidth1px = AutoUtils.getPercentWidth1px();
maxTextSize = mTypedArray.getDimension(R.styleable.AutoAlignTextView_maxTextSize, 48) * percentWidth1px;
minTextSize = mTypedArray.getDimension(R.styleable.AutoAlignTextView_minTextSize, 24) * percentWidth1px;
}
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
adjustTvTextSize();
}
//動態修改字體大小
private void adjustTvTextSize() {
String text = getText().toString();
int avaiWidth = (int) (maxWidth - getPaddingLeft() - getPaddingRight() - DisplayUtils.dip2px(getContext(), 2));
if (avaiWidth <= 0) {
return;
}
TextPaint textPaintClone = new TextPaint(getPaint());
float trySize = maxTextSize;
textPaintClone.setTextSize(trySize);
while (textPaintClone.measureText(text) > avaiWidth && trySize > minTextSize) {
trySize--;
textPaintClone.setTextSize(trySize);
}
setTextSize(TypedValue.COMPLEX_UNIT_PX, trySize);
}
public AutoAlignTextView setMaxTextSize(float maxTextSize) {
this.maxTextSize = maxTextSize;
return this;
}
public AutoAlignTextView setMinTextSize(float minTextSize) {
this.minTextSize = minTextSize;
return this;
}
public void refresh() {
adjustTvTextSize();
}
}
自定義一個textView,如下
init(Context context, AttributeSet attrs)方法接收maxTextSize和minTextSize,percentWidth1px爲屏幕密度,在這裏自己可以調整,通過dp方式來接收轉換,因爲我這裏使用autolayout框架,percentWidth1px爲橫屏1080分辨率時,1px代表的大小,比如在720p的時候,percentWidth1px就是1.5
adjustTvTextSize()方法爲動態修改文字的方法,通過計算可顯示寬度來調整字體大小
5、使用
在佈局頭部添加xmlns:app=http://schemas.android.com/apk/res-auto ,然後傳入最大值和最小值
<com.yisanban.app.widget.AutoAlignTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50px"
android:background="@color/white"
android:paddingLeft="30px"
android:paddingRight="90px"
android:paddingTop="180px"
android:textColor="@color/black1"
app:maxTextSize="@dimen/very_font_size"
app:minTextSize="@dimen/large_font_size" />
最終會字體大小會隨着文字數量的增加和減小,以保證文字可以全部顯示