How to adjust text font size to fit textview

后端 未结 22 2100
無奈伤痛
無奈伤痛 2020-11-22 05:15

Is there any way in android to adjust the textsize in a textview to fit the space it occupies?

E.g. I\'m using a TableLayout and adding several Te

22条回答
  •  栀梦
    栀梦 (楼主)
    2020-11-22 05:45

    I've written a class that extends TextView and does this. It just uses measureText as you suggest. Basically it has a maximum text size and minimum text size (which can be changed) and it just runs through the sizes between them in decrements of 1 until it finds the biggest one that will fit. Not particularly elegant, but I don't know of any other way.

    Here is the code:

    import android.content.Context;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.widget.TextView;
    
    public class FontFitTextView extends TextView {
    
        public FontFitTextView(Context context) {
            super(context);
            initialise();
        }
    
        public FontFitTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            initialise();
        }
    
        private void initialise() {
            testPaint = new Paint();
            testPaint.set(this.getPaint());
            //max size defaults to the intially specified text size unless it is too small
            maxTextSize = this.getTextSize();
            if (maxTextSize < 11) {
                maxTextSize = 20;
            }
            minTextSize = 10;
        }
    
        /* Re size the font so the specified text fits in the text box
         * assuming the text box is the specified width.
         */
        private void refitText(String text, int textWidth) { 
            if (textWidth > 0) {
                int availableWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight();
                float trySize = maxTextSize;
    
                testPaint.setTextSize(trySize);
                while ((trySize > minTextSize) && (testPaint.measureText(text) > availableWidth)) {
                    trySize -= 1;
                    if (trySize <= minTextSize) {
                        trySize = minTextSize;
                        break;
                    }
                    testPaint.setTextSize(trySize);
                }
    
                this.setTextSize(trySize);
            }
        }
    
        @Override
        protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) {
            refitText(text.toString(), this.getWidth());
        }
    
        @Override
        protected void onSizeChanged (int w, int h, int oldw, int oldh) {
            if (w != oldw) {
                refitText(this.getText().toString(), w);
            }
        }
    
        //Getters and Setters
        public float getMinTextSize() {
            return minTextSize;
        }
    
        public void setMinTextSize(int minTextSize) {
            this.minTextSize = minTextSize;
        }
    
        public float getMaxTextSize() {
            return maxTextSize;
        }
    
        public void setMaxTextSize(int minTextSize) {
            this.maxTextSize = minTextSize;
        }
    
        //Attributes
        private Paint testPaint;
        private float minTextSize;
        private float maxTextSize;
    
    }
    

提交回复
热议问题