如何讓Android TextView(包括子類)的字體大小隨着字數的增加而變化,以顯示全部內容

在使用TextView的時候,很多情況下內容的長度是要變化的,字數多了,可能不能顯示全部的內容,那如何讓TextView在字數超了的時候,能自動縮小字體,或者直接匹配最優的字體大小,使內容全屏並全部顯示

代碼如下:

protected void autoMatchFont(final TextView view){
        view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                float vWidth = v.getWidth();
                //LogUtil.d("vWidth=" + vWidth);
                TextPaint paint = view.getPaint();
                String text = view.getText().toString();
                float textLen = paint.measureText(text);
                //LogUtil.d("textLen=" + textLen);
                float oldSize = view.getTextSize();
                //LogUtil.d("oldSize=" + oldSize);
                if (textLen != vWidth && isNeedAdapta){
                    isNeedAdapta = false;
                    float size = vWidth * oldSize / textLen;
                    //LogUtil.d("size=" + size);
                    view.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
                }
            }
        });
    }

方法已經封裝好了,傳入TextView對象即可,原理很簡單:

1.float textLen = paint.measureText(text);//計算當前顯示的內容,用當前的字體(paint是通過view.getPaint()得到的,包含了當前view的字體信息)計算全部內容的寬度
2.float vWidth = v.getWidth();//得到當前的組件寬度

3.textLen 和vWidth 比較,內容的寬度大於組件寬度,則會換行或者顯示不全,反之可推

4.view.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);設置字體大小時,必須以TypedValue.COMPLEX_UNIT_PX的類型設置,這是爲了匹配view.getTextSize(),因爲這個方法得到的字體也是以px爲單位的,而view.setTextSize(size)默認是以sp爲單位


要注意的是,組件的寬度必須在OnLayoutChangeListener裏面獲取,否則爲0

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