Android根據可顯示寬度調整字體大小


 

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" />

最終會字體大小會隨着文字數量的增加和減小,以保證文字可以全部顯示


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章