2017-08-11 13 views
2

Imaginez une activité avec un pourcentage de mise en page, de sorte qu'un carré parfait soit tracé au centre de l'écran et remplisse l'écran. (Donc, si vous avez un téléphone Pixel XL avec son écran 1440x2560, ce serait une activité avec un carré parfait au centre du téléphone, 1440px par 1440px). Notez qu'il doit toujours s'agir d'un carré au centre du téléphone, quel que soit l'affichage (téléphone, tablette, montre et téléviseur).Android: Définition de la taille de la police de texte relative à PercentLayout/ConstraintLayout

Ceci est facile à accomplir en utilisant un PercentRelativeLayout (API 23) ou un ConstraintLayout en utilisant layout_constraintGuide_percent. Et cette technique peut être appliquée à presque n'importe quelle vue. C'est génial. Mais, comment devrions-nous faire la même chose avec le texte? Par exemple, si vous voulez que le mot "compote de pommes" soit centré sur la case au même pourcentage d'échelle sur n'importe quel affichage. Est-il possible de définir la taille de la police pour imiter ce comportement. Pour dire que la hauteur de la lettre devrait toujours être dis, 10% de son conteneur, ou 10% de la largeur/hauteur des pixels de l'écran?


Je pense que cela ne texte ou AutoFill AutoSize dans cette boîte pour s'adapter. (c'est-à-dire, n'essayant pas de faire https://developer.android.com/preview/features/autosizing-textview.html). Je ne pense pas que cela fonctionnerait parce que cela signifierait que mettre le mot "Salut" dans la boîte le rendrait plus grand que le mot "Applesause" dans la même case. Je veux que la taille du texte reste toujours la même par rapport à lui-même, mais à l'échelle par rapport à son conteneur. La définition d'une taille de texte à l'aide de DP/DIP/SP ne fonctionnera pas, car cela dépend de dimensions physiques, ce qui est idéal pour la plupart des cas d'utilisation normale, mais est exactement le contraire de ce que nous voulons accomplir ici. Le texte doit toujours avoir la même taille par rapport à la mise en page, même si cela va à l'encontre de toute lisibilité raisonnable, et même si cela ne respecte pas les paramètres de police des utilisateurs. À l'heure actuelle, je peux faire quelques calculs pour calculer approximativement une valeur de pixel spécifique pour la taille du texte qui devient plus ou moins proche. (c'est-à-dire qu'une police qui devrait être 30px sur un écran large de 720px, devrait être 60px sur un écran de 1440px). Mais j'ai de la difficulté à faire en sorte que cela fonctionne avec les valeurs DPI. Android essaie d'être «trop intelligent» et dessine une police de 30px sur un écran TVDPI différemment qu'une police 30PX sur un écran HDPI, même si elles ont la même largeur de pixel.


Je ne sais pas comment faire cela sur Android. Mais sur Windows UWP XAML, ceci est accompli en codant en dur une police dans une mise en page, puis en utilisant <Viewbox Stretch="Uniform">, qui redimensionnera la fenêtre enfant avec une précision parfaite. Et dans un navigateur Web utilisant CSS3, vous pouvez le faire avec Viewport Sized Typography (1vmin, 1vmax), ce qui n'est pas un comportement identique, mais est assez proche pour la plupart des utilisations.

Ma question est, quelle est la bonne façon de le faire en utilisant natifs Android TextViews?

+1

Vous mentionnez que l'utilisation de redimensionnement automatique ferait « salut » et « la compote de pommes » être de tailles différentes. Avez-vous besoin de supporter un texte très long? Comme dans, plusieurs lignes. Et alors, quel serait le comportement? –

+0

Un texte long peut être ignoré - je peux gérer cela ailleurs. Je suis juste à la recherche d'un moyen fiable pour définir une taille de police TextView, de sorte qu'il correspond toujours à son conteneur. Imaginez un titre/ticker de nouvelles sur CNN. Il est intégré au flux vidéo de la TV, donc peu importe la taille du flux vidéo CNN, ce ticker est toujours de la même taille par rapport à la vidéo. J'essaie de faire exactement la même chose, sur Android. ConstraintLayout gère cela parfaitement pour les vues, mais ne gère pas la taille de la police. J'essaie de trouver un bon moyen de gérer la taille de la police en utilisant un TextView natif. – maxsilver

+0

@maxsilver avez-vous trouvé une solution pour cela? –

Répondre

1

Il est difficile de faire quelque chose comme vous le dites.

L'unité sphttps://material.io/guidelines/layout/units-measurements.html#units-measurements-scaleable-pixels-sp, il travaille donc (comme dp). Si vous avez plus px, vous obtenez plus de px avec la même taille.

Vous pourriez obtenir vous-même, en obtenant la largeur de la vue/fenêtre et calculer votre taille de police par cette largeur.

val width = resources.displayMetrics.widthPixels 
val defaultWidth = 100 //px 
val defaultFontForDefaultWidth = 2 //px So for a window 100px you get a 2px font (it's an example) 
val fontSize = (width * defaultFontForDefaultWidth)/defaultWidth 

Mais je suis assez sûr, c'est ce que font avec androïdes dp. Vous définissez 2dp et lorsque l'écran est plus grand, il devient plus grand ou inversé lorsque vous rétrécissez.

Hope this helps