简体   繁体   English

使TextView中的文本适合屏幕

[英]Make text inside TextView fit the screen

I want the text inside my TextView to fit the screen. 我希望TextView中的文本适合屏幕大小。 I need to implement something like this: 我需要实现这样的事情:

在此处输入图片说明

The letter 'A' needs to be at the center of the screen with height equal to the height of the device screen. 字母“ A”必须位于屏幕中央,并且高度等于设备屏幕的高度。 I have created a Custom TextView for this as follows but that doesn't seem to work. 我为此创建了一个自定义TextView,如下所示,但这似乎不起作用。 What I mean by this is that my text (letter A) isn't fitting the height of the screen. 我的意思是我的文字(字母A)不适合屏幕的高度。 I tried manually adjusting the text font size but that isn't the right way I guess. 我尝试手动调整文本字体大小,但是我猜这不是正确的方法。 Can someone point out a better solution for this? 有人可以为此指出更好的解决方案吗?

 package com.example;

 import android.content.Context;
 import android.content.res.TypedArray;

 import android.graphics.Paint;
 import android.graphics.Rect; 
 import android.util.AttributeSet; 
 import android.util.TypedValue;
 import android.widget.TextView;

 public class FontFitTextView extends TextView
  {
    private Paint mTestPaint;
    private float maxFontSize;
    private static final float MAX_FONT_SIZE_DEFAULT_VALUE = 20f;

   public FontFitTextView(Context context)
   {
      super(context);
      initialise(context, null);
   }

   public FontFitTextView(Context context, AttributeSet attributeSet)
   {
    super(context, attributeSet);
    initialise(context, attributeSet);
   }

public FontFitTextView(Context context, AttributeSet attributeSet, int defStyle)
{
    super(context, attributeSet, defStyle);
    initialise(context, attributeSet);
}

private void initialise(Context context, AttributeSet attributeSet)
{
    if(attributeSet!=null)
    {
        TypedArray styledAttributes = context.obtainStyledAttributes(attributeSet, R.styleable.FontFitTextView);
        maxFontSize = styledAttributes.getDimension(R.styleable.FontFitTextView_maxFontSize, MAX_FONT_SIZE_DEFAULT_VALUE);
        styledAttributes.recycle();
    }
    else
    {
        maxFontSize = MAX_FONT_SIZE_DEFAULT_VALUE;
    }

    mTestPaint = new Paint();
    mTestPaint.set(this.getPaint());
    //max size defaults to the initially specified text size unless it is too small
}

private void refitText(String text, int textWidth, int textHeight)
{
    if (textWidth <= 0)
        return;
    int targetWidth = textWidth - this.getPaddingLeft() - this.getPaddingRight();
    int targetHeight = textHeight - this.getPaddingTop() - this.getPaddingBottom();
    float hi = maxFontSize;
    float lo = 2;
    final float threshold = 1f; // How close we have to be

    mTestPaint.set(this.getPaint());

    Rect bounds = new Rect();

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

        mTestPaint.getTextBounds(text, 0, text.length(), bounds);

        if (bounds.width() >= targetWidth || bounds.height() >= targetHeight)
            hi = size; // too big
        else
            lo = size; // too small

    }
    // Use lo so that we undershoot rather than overshoot
    this.setTextSize(TypedValue.COMPLEX_UNIT_PX, lo);
}

@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, height);
    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(), this.getHeight());
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
    if (w != oldw)
    {
        refitText(this.getText().toString(), w, h);
     }
   }
}

XML file XML文件

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:res-auto="http://schemas.android.com/apk/res-auto"
  android:id="@+id/home_Layout"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" >

<LinearLayout
    android:id="@+id/linear1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_vertical">

    <com.example.FontFitTextView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:text="1"
        android:textSize="80sp"
        res-auto:maxFontSize="55sp" />

</LinearLayout>

</RelativeLayout>

尝试在onMeasure()方法的末尾使用更新的宽度和高度(parentWidth,height)调用super.onMeasure()方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM