Comment redimensionner, redimensionner le texte pour l'adapter à une TextView?

Je suis en train de créer une méthode de redimensionnement de texte multi-ligne dans un TextView tel qu'il s'inscrit dans les limites (à la fois les dimensions X et Y) de la TextView.

À l'heure actuelle, j'ai quelque chose, mais tout ce qu'il fait est de redimensionner le texte tel que juste la première lettre ou le premier caractère du texte remplit les dimensions de la TextView (c'est à dire uniquement la première lettre est visible, et c'est énorme). J'en ai besoin pour s'adapter à toutes les lignes de texte dans les limites de la TextView.

Voici ce que j'ai à ce jour:

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

Je pense que le problème est dans l'utilisation de tv.getPaint().getTextBounds(...). Il renvoie toujours en petit nombre pour les limites de texte... petite par rapport à la tv.getWidth() et tv.getHeight() valeurs... même si la taille du texte est beaucoup plus grande que la largeur ou la hauteur de la TextView.

InformationsquelleAutor RyanM | 2010-04-07