Android:在square TextView中调整字体大小

Android:在square TextView中调整字体大小,android,textview,text-size,Android,Textview,Text Size,文本视图在屏幕上有一个大正方形的形式。必须调整内部文本的大小,使其尽可能大并适合整个TextView空间 假设文本为“hello”,结果将在屏幕上显示一个大的“hello” 我想问的是,如果正方形的大小已知,如何将字体调整到合适的像素大小 我知道显示的字符串不能完全平方,但主要目标是文本在TextView区域内尽可能大。如果您希望文本正常绘制(如0度旋转),但缩放以满足视图的边界,可以使用以下方法: Override following method: @Override public voi

文本视图在屏幕上有一个大正方形的形式。必须调整内部文本的大小,使其尽可能大并适合整个TextView空间

假设文本为“hello”,结果将在屏幕上显示一个大的“hello”

我想问的是,如果正方形的大小已知,如何将字体调整到合适的像素大小


我知道显示的字符串不能完全平方,但主要目标是文本在TextView区域内尽可能大。

如果您希望文本正常绘制(如0度旋转),但缩放以满足视图的边界,可以使用以下方法:

Override following method:

@Override
public void onWindowFocusChanged (boolean hasFocus) {
        // the height will be set at this point
        int height = myEverySoTallView.getMeasuredHeight(); 
        int width = myEverySoTallView.getMeasuredWidth();

        //as per width/height you can try modifying text size
        myTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, width/SOME_CONSTANT);
}
public class ScalingTextCustomTextView extends CustomTextView {

    public ScalingTextCustomTextView(Context context) {
        super(context);
    }

    public ScalingTextCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int height = getMeasuredHeight();

        refitText(this.getText().toString(), parentWidth);

        this.setMeasuredDimension(parentWidth, height);
    }

    @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);
    }

    private void refitText(String text, int textWidth) {
        if(textWidth <= 0)
            return;

        int targetWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight();
        float hi = 200;
        float lo = 2;
        final float threshold = 0.5f;

        Paint temp = new Paint();
        temp.set(getPaint());

        while((hi - lo) > threshold){
            float size = (hi + lo) / 2;
            temp.setTextSize(size);

            if(temp.measureText(text) >= targetWidth)
                hi = size;
            else lo = size;
        }

        this.setTextSize(TypedValue.COMPLEX_UNIT_PX, lo);
    }
}`
但是,如果您想将其缩放得稍大以适应最长的距离,则必须调整文本以根据从左上到右下的距离计算目标宽度


不过,这应该会为您指出正确的方向。

我认为设置所需的文本视图大小(myTextViewSize)就足够了,然后设置文本内容(它肯定在我所需的视图尺寸内)

然后使用

Rect bounds = new Rect();
textView.getPaint().getTextBounds(textView.getText(), 0, textView.getText().length(), bounds);
int oldTextWidth=bounds.width();
float oldFontSize=textView.getTextSize();
float newFontSize=(myTextViewSize- textView.getPaddingLeft() - textView.getPaddingRight())*oldFontSize/oldTextWidth;

你有一些我们可以开始使用的代码吗?@Roman Rozenshtein我关心的只是字体大小,我不需要关于其他内容的建议正方形有一个已知的固定大小,它不会实时修改,我的问题是因为字符大小不同,所以一个单词会与另一个不同。也请忘记旋转,因为文本也会旋转。但是我编辑了我的问题。我回答中的ScalingTextCustomTextView实际上也适用于这种情况。每当文本更改或视图大小更改时,它都会重新调整textsize以适合视图。
Rect bounds = new Rect();
textView.getPaint().getTextBounds(textView.getText(), 0, textView.getText().length(), bounds);
int oldTextWidth=bounds.width();
float oldFontSize=textView.getTextSize();
float newFontSize=(myTextViewSize- textView.getPaddingLeft() - textView.getPaddingRight())*oldFontSize/oldTextWidth;