How to auto-adjust text size on a multi-line TextView according to the view max dimensions?

前端 未结 6 1871
闹比i
闹比i 2020-12-02 16:09

I\'ve been searching for a way of auto fit a text inside a textview. Through my search I\'ve found many solutions like:

  • FontFitTextView
  • AutoResizeText
6条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-02 16:31

    Using the idea from nunofmendes, I wrote a derived class of TextView that auto resizes text and supports multiple lines.

    import android.content.Context;
    import android.os.Handler;
    import android.text.Layout;
    import android.text.TextPaint;
    import android.text.TextUtils.TruncateAt;
    import android.util.AttributeSet;
    import android.util.TypedValue;
    
    public class AutoResizeTextView extends TextView {
    
        private Handler measureHandler = new Handler();
        private Runnable requestLayout = new Runnable() {
            @Override
            public void run() {
                requestLayout();
            }
        };
    
        public AutoResizeTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public AutoResizeTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public AutoResizeTextView(Context context) {
            super(context);
        }
    
        @Override
        protected void onMeasure(final int widthMeasureSpec,
                                 final int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
            final float maxWidth = getWidth();
            final float maxHeight = getHeight();
            if (maxWidth < 1.0f || maxHeight < 1.0f) {
                return;
            }
    
            int index = 0;
            int lineCount = 0;
            CharSequence text = getText();
            final TextPaint paint = getPaint();
            while (index < text.length()) {
                index += paint.breakText(text, index, text.length(), true, maxWidth, null);
                lineCount++;
            }
            final float height = lineCount * getLineHeight() + (lineCount > 0 ?
                    (lineCount - 1) * paint.getFontSpacing() : 0);
            if (height > maxHeight) {
                final float textSize = getTextSize();
                setTextSize(TypedValue.COMPLEX_UNIT_PX, (textSize - 1));
                measureHandler.post(requestLayout);
            }
        }
    }
    

提交回复
热议问题