J'ai besoin de 2 façons d'afficher une étiquette verticale dans Android:
- Étiquette horizontale tournée de 90 degrés dans le sens antihoraire (lettres sur le côté)
- Étiquette horizontale avec des lettres l'une sous l'autre (comme une enseigne de magasin)
Dois-je développer des widgets personnalisés pour les deux cas (un cas), puis-je faire en sorte que TextView soit rendu de cette façon, et quel serait un bon moyen de faire quelque chose comme ça si je dois devenir complètement personnalisé?
android
label
textview
vertical-alignment
Bostone
la source
la source
Réponses:
Voici mon implémentation de texte verticale élégante et simple, étendant TextView. Cela signifie que tous les styles standard de TextView peuvent être utilisés, car il s'agit de TextView étendu.
Par défaut, le texte pivoté est de haut en bas. Si vous définissez android: gravity = "bottom", il est dessiné de bas en haut.
Techniquement, cela trompe TextView sous-jacent de penser que c'est une rotation normale (permutation largeur / hauteur à quelques endroits), tout en le dessinant en rotation. Cela fonctionne très bien également lorsqu'il est utilisé dans une mise en page XML.
EDIT: publier une autre version, ci-dessus, a des problèmes avec les animations. Cette nouvelle version fonctionne mieux, mais perd certaines fonctionnalités de TextView, telles que le chapiteau et des spécialités similaires.
EDIT Version Kotlin:
la source
TextView
. En fait, les liens sont soulignés, mais ne répondent pas au clic.J'ai implémenté cela pour mon projet ChartDroid . Créer
VerticalLabelView.java
:Et dans
attrs.xml
:la source
Une façon d'y parvenir serait:
la source
\n
après chaque caractère ou si vous avez une police de largeur fixe, limitez la largeur de TextView à un seul caractère.J'ai essayé les deux classes VerticalTextView dans la réponse approuvée et elles ont fonctionné raisonnablement bien.
Mais peu importe ce que j'ai essayé, je n'ai pas pu positionner ces VerticalTextViews au centre de la mise en page contenant (un RelativeLayout qui fait partie d'un élément gonflé pour un RecyclerView).
FWIW, après avoir regardé autour de moi, j'ai trouvé la classe VerticalTextView de yoog568 sur GitHub:
https://github.com/yoog568/VerticalTextView/blob/master/src/com/yoog/widget/VerticalTextView.java
que j'ai pu positionner comme souhaité. Vous devez également inclure la définition d'attributs suivante dans votre projet:
https://github.com/yoog568/VerticalTextView/blob/master/res/values/attr.xml
la source
Cela a fonctionné pour moi, très bien. Quant aux lettres descendant verticalement, je ne sais pas.
la source
Il y a quelques points mineurs auxquels il faut prêter attention.
Cela dépend du jeu de caractères lors du choix de la rotation ou des chemins. par exemple, si le jeu de caractères cible est de type anglais et que l'effet attendu ressemble à,
vous pouvez obtenir cet effet en dessinant chaque caractère un par un, aucune rotation ou chemin nécessaire.
vous aurez peut-être besoin d'une rotation ou d'un chemin pour obtenir cet effet.
la partie délicate est lorsque vous essayez de rendre un jeu de caractères tel que le mongol. le glyphe dans la police de caractères doit être tourné à 90 degrés, donc drawTextOnPath () sera un bon candidat à utiliser.
la source
Suite à la réponse de Pointer Null , j'ai pu centrer le texte horizontalement en modifiant la
onDraw
méthode de cette façon:Vous devrez peut-être ajouter une partie de TextView measureWidth pour centrer un texte multiligne.
la source
Vous pouvez simplement ajouter à votre TextView ou à une autre valeur de rotation View xml. C'est le moyen le plus simple et pour moi de travailler correctement.
la source
Mon approche initiale du rendu du texte vertical dans un LinearLayout vertical était la suivante (c'est Kotlin, en utilisation Java,
setRoatation
etc.):Comme vous pouvez le voir, le problème est que le TextView va verticalement mais traite toujours sa largeur comme s'il était orienté horizontalement! = /
Ainsi, l'approche n ° 2 consistait à modifier manuellement la largeur et la hauteur supplémentaires pour en tenir compte:
Cela a cependant abouti à ce que les étiquettes s'enroulent jusqu'à la ligne suivante (ou soient rognées si vous
setSingleLine
) après la largeur relativement courte. Encore une fois, cela revient à confondre x avec y.Mon approche n ° 3 était donc d'encapsuler le TextView dans un RelativeLayout. L'idée est de permettre au TextView n'importe quelle largeur qu'il souhaite en l'étendant loin vers la gauche et la droite (ici, 200 pixels dans les deux sens). Mais ensuite, je donne les marges négatives RelativeLayout pour m'assurer qu'il est dessiné comme une colonne étroite. Voici mon code complet pour cette capture d'écran:
En guise d'astuce générale, cette stratégie consistant à avoir une vue "tenir" une autre vue m'a été vraiment utile pour positionner les choses sous Android! Par exemple, la fenêtre d'informations sous l'ActionBar utilise la même tactique!
Pour le texte apparaissant comme un signe de magasin, insérez simplement des nouvelles lignes après chaque caractère, par exemple
"N\nu\nt\ns"
sera:la source
J'ai aimé l'approche de @ kostmo. Je l'ai un peu modifié, car j'avais un problème: couper l'étiquette tournée verticalement lorsque j'ai défini ses paramètres sur
WRAP_CONTENT
. Ainsi, un texte n'était pas entièrement visible.Voici comment je l'ai résolu:
Si vous voulez avoir un texte de haut en bas, utilisez la
topToDown(true)
méthode.la source