Comment mettre à l'échelle / redimensionner le texte pour se adapter à une TextView ?

? RyanM @ | Original: StackOverFlow

Je essaie de créer une méthode pour le redimensionnement du texte multi - ligne dans un «____» telle qu'elle se inscrit dans les limites (à la fois les dimensions X et Y) de la TextView .

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

Voici ce que je ai à ce jour :

TextView

Je pense que le problème est dans l'utilisation de «____» . Il renvoie toujours un petit nombre de limites pour le texte ... petite par rapport aux "____ ____ » et « valeurs » ... même si la taille du texte est bien plus grande que la largeur ou la hauteur de la «____» .

Top 5 Répondre

1snctln @

peut-être essayer de régler http://developer.android.com/reference/android/widget/TextView.html#setHorizontallyScrolling%28boolean%29 true avant de prendre des mesures de texte afin que le textView ne cherche pas à disposition de votre texte sur plusieurs lignes

2RyanM @

Je étais en mesure de répondre à ma propre question en utilisant le code suivant ( voir ci-dessous ), mais ma solution étais très spécifique à l'application . Par exemple, ce sera probablement seulement bon et / ou travailler pour une TextView dimensionné pour env. 1/2 de l'écran ( avec aussi un 40px marge supérieure et 20px secondaires marges ... aucune marge bas) .

L' utilisation de cette approche cependant, vous pouvez créer votre propre mise en œuvre similaire. La méthode statique essentiellement regarde juste le nombre de caractères et détermine un facteur d'échelle à appliquer à la taille du texte de la TextView, puis augmente progressivement la taille du texte jusqu'à ce que la hauteur totale (une hauteur estimée - en utilisant la largeur du texte, le texte la hauteur et la largeur de la TextView ) est juste en dessous de celle de la TextView . Les paramètres nécessaires pour déterminer le facteur d'échelle ( ce est à dire l' if / else if ) ont été fixés par conjecture et - chèque. Vous aurez probablement à jouer avec les chiffres pour le faire fonctionner pour votre application particulière .

Ce ne est pas la solution la plus élégante, mais il était facile de code et ça fonctionne pour moi . Quelqu'un at-il une meilleure approche ?

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

Thanks.

3Octavian Damiean @

Si votre seule exigence est d'avoir le texte automatiquement divisés et continuer dans la ligne suivante et la hauteur ne est pas important alors juste comme ça.

tv.getPaint().getTextBounds(...)

Cette aura votre wrap TextView à son contenu verticalement en fonction de la valeur de votre maxEms .

4vsm @

Vérifiez si ma solution vous aide à:

http://stackoverflow.com/questions/5033012/auto-scale-textview-text-to-fit-within-bounds/5280436#5280436

5Chase @

Je ai eu le même problème et je ai écrit une classe qui semble fonctionner pour moi. Fondamentalement, je ai utilisé une présentation statique pour dessiner le texte dans une toile séparée et réévaluer jusqu'à ce que je trouve une taille de police qui se adapte . Vous pouvez voir la classe posté dans la rubrique ci-dessous . Je espère que ça aide.

http://stackoverflow.com/questions/5033012/auto-scale-textview-text-to-fit-within-bounds/5535672#5535672