Wie skaliere ich Text, um ihn an eine Textansicht anzupassen?

Ich versuche, eine Methode zum Ändern der Größe von mehrzeiligem Text in einem @ zu erstelleTextView so, dass es innerhalb der Grenzen (sowohl der X- als auch der Y-Dimension) des @ pasTextView.

Zur Zeit habe ich etwas, aber alles, was es tut, ist die Größe des Texts so zu ändern, dass nur der erste Buchstabe / das erste Zeichen des Texts die Abmessungen des @ ausfüllTextView (d. h. nur der erste Buchstabe ist sichtbar und riesig). Ich brauche es, um alle Zeilen des Textes innerhalb der Grenzen des TextView zu passen.

Hier ist was ich bisher habe:

public static void autoScaleTextViewTextToHeight(TextView tv)
{
    final float initSize = tv.getTextSize();
    //get the width of the view's back image (unscaled).... 
    float minViewHeight;
    if(tv.getBackground()!=null)
    {
      minViewHeight = tv.getBackground().getIntrinsicHeight();
    }
    else
    {
      minViewHeight = 10f;//some min.
    }
    final float maxViewHeight = tv.getHeight() - (tv.getPaddingBottom()+tv.getPaddingTop())-12;// -12 just to be sure
    final String s = tv.getText().toString();

    //System.out.println(""+tv.getPaddingTop()+"/"+tv.getPaddingBottom());

    if(minViewHeight >0 && maxViewHeight >2)
    {
      Rect currentBounds = new Rect();
      tv.getPaint().getTextBounds(s, 0, s.length(), currentBounds);
      //System.out.println(""+initSize);
      //System.out.println(""+maxViewHeight);
      //System.out.println(""+(currentBounds.height()));

      float resultingSize = 1;
      while(currentBounds.height() < maxViewHeight)
      {
        resultingSize ++;
        tv.setTextSize(resultingSize);

        tv.getPaint().getTextBounds(s, 0, s.length(), currentBounds);
        //System.out.println(""+(currentBounds.height()+tv.getPaddingBottom()+tv.getPaddingTop()));
        //System.out.println("Resulting: "+resultingSize);
      }
      if(currentBounds.height()>=maxViewHeight)
      {
        //just to be sure, reduce the value
        tv.setTextSize(resultingSize-1);
      }
    }
}

Ich denke, das Problem liegt in der Verwendung vontv.getPaint().getTextBounds(...). Es werden immer kleine Zahlen für die Textgrenzen zurückgegeben ... klein im Verhältnis zumtv.getWidth() undtv.getHeight() Werte ... auch wenn die Textgröße viel größer ist als die Breite oder Höhe desTextView.

Antworten auf die Frage(14)

Ihre Antwort auf die Frage