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
.
- Double Possible de: stackoverflow.com/a/7875656/435605
- double possible de Auto Échelle TextView Texte à l'intérieur de Limites
- Cette solution est soigné: [Échelle de texte en vue de l'ajustement?][1] [1]: stackoverflow.com/a/7259136/3857562
Vous devez vous connecter pour publier un commentaire.
La AutofitTextView bibliothèque de MavenCentral gère cela très bien. La source hébergé sur Github(1k+ étoiles) à https://github.com/grantland/android-autofittextview
Ajouter les éléments suivants à votre
app/build.gradle
Permettre une Vue d'étendre TextView dans le code:
Permettre une Vue d'étendre TextView en XML:
Utiliser le construit en Widget dans le code ou XML:
TextView
s textSize attribut est maintenant utilisé comme une taille limite, de sorte que vous devez spécifier aussi grand que possible...De nouvelles depuis Android O:
https://developer.android.com/preview/features/autosizing-textview.html
J'ai été en mesure de répondre à ma propre question en utilisant le code suivant (voir ci-dessous), mais ma solution a été de très spécifique à l'application. Par exemple, ce sera probablement la seule bonne apparence et/ou de travailler pour un TextView de taille moyenne à env. 1/2 de l'écran (avec également un 40px marge supérieure et 20px marges latérales... aucune marge inférieure).
À l'utilisation de cette approche, cependant, que vous pouvez créer votre propre mise en œuvre. La méthode statique fondamentalement juste regarde le nombre de caractères et détermine un facteur d'échelle à appliquer à la TextView la taille du texte, puis augmente progressivement la taille du texte jusqu'à la hauteur de l'ensemble (une estimation de la hauteur-utilisation de la largeur du texte, la hauteur et la largeur de la TextView) est juste en dessous de la TextView. Les paramètres nécessaires pour déterminer le facteur d'échelle (c'est à dire le if/else if) ont été fixés par les deviner et vérifier. Vous aurez probablement à jouer avec les chiffres pour le faire fonctionner pour votre application particulière.
Ce n'est pas la solution la plus élégante, mais il était facile de code et cela fonctionne pour moi. Quelqu'un aurait-il une meilleure approche?
Grâce.
J'ai eu le même problème et a écrit une classe qui semble fonctionner pour moi. En gros, j'ai utilisé un statique de la mise en page de dessiner le texte dans une autre toile et réévaluer en attendant que je trouve une taille de police qui vous convient. Vous pouvez voir la classe posté dans le sujet ci-dessous. J'espère que cela aide.
Mise à l'Échelle Auto TextView Texte à l'intérieur de Limites
Suis tombé sur ce tandis que la recherche d'une solution moi-même... j'avais essayé toutes les autres solutions que j'ai pu voir sur un débordement de pile, etc, mais aucun n'a fonctionné alors j'ai écrit mon propre.
Essentiellement par emballage de l'affichage de texte personnalisé dans un linéaire de la mise en page, j'ai réussi à le mesure bien le texte en s'assurant qu'elle est mesurée avec une largeur fixe.
Puis le linéaire de la mise en page de code
Espère que cela aide quelqu'un.
J'ai joué avec pendant un certain temps, en essayant d'obtenir mes tailles de police correct sur une grande variété de tablettes 7" (kindle fire, Nexus7, et certains bon marché en Chine avec une faible résolution des écrans) et les périphériques.
L'approche qui a finalement fonctionné pour moi est comme suit. Le "32" est un facteur arbitraire que, fondamentalement, donne environ 70+ de caractères sur une tablette 7" ligne horizontale, ce qui est une taille de police que je cherchais. Ajuster en conséquence.
peut-être essayer le réglage de setHoriztonallyScrolling() à vrai avant de prendre le texte des mesures afin que le textView n'essayez pas de mise en page de votre texte sur plusieurs lignes
Une façon serait de préciser les différents sp dimensions pour chacun des généralisé tailles d'écran. Par exemple, fournir des 8sp pour les petits écrans, 12sp pour les écrans normaux, 16 sp pour les grands et 20 sp pour xlarge. Puis juste avoir vos mises en page, reportez-vous à @dimen text_size ou quoi que ce soit et vous pouvez être assuré que la densité est pris en charge par la sp de l'unité. Voir le lien suivant pour plus d'informations sur cette approche.
http://www.developer.android.com/guide/topics/resources/more-resources.html#Dimension
Je dois noter, cependant, que le soutien de plusieurs langues signifie plus de travail au cours de la phase de test, surtout si vous êtes intéressé à garder le texte sur une ligne, comme certaines langues ont beaucoup plus de mots. Dans ce cas, faire un dimens.xml fichier dans les valeurs-de-grand dossier, par exemple, et de modifier la valeur manuellement. Espérons que cette aide.
Voici une solution que j'ai créé sur la base de certains autres commentaires. Cette solution vous permet de définir la taille du texte en XML, ce qui sera le max de la taille et de régler lui-même pour s'adapter à la vue de la hauteur.
Ajustement De Taille De TextView
Si votre seule obligation est d'avoir le texte de diviser automatiquement et de continuer dans la ligne suivante, et la hauteur n'est pas important, juste comme ça.
Ce qui aura votre TextView envelopper de son contenu verticalement en fonction de votre maxEms valeur.
Vérifier si ma solution vous aide à:
Mise à l'Échelle Auto TextView Texte à l'intérieur de Limites
J'ai trouvé que cela a bien fonctionné pour moi. voir: https://play.google.com/store/apps/details?id=au.id.rupert.chauffeurs_name_board&hl=fr
Code Source à la http://www.rupert.id.au/chauffeurs_name_board/verson2.php
http://catchthecows.com/?p=72 et https://github.com/catchthecows/BigTextButton
Ceci est basé sur mattmook de réponse. Il a bien fonctionné sur certains appareils, mais pas sur toutes. J'ai déplacé le redimensionnement à la mesure de l'étape, fait que la taille maximale d'un attribut personnalisé, a pris des marges en compte, et étendu FrameLayout au lieu de LineairLayout.
Et ce dans attrs.xml:
Et enfin utilisé comme ceci:
Essayez ceci...