Une question rapide, espérons-le, mais je n'arrive pas à trouver d'exemples ... Je voudrais écrire du texte multiligne dans une personnalisation View
via un Canvas
, et dans onDraw()
j'ai:
...
String text = "This is\nmulti-line\ntext";
canvas.drawText(text, 100, 100, mTextPaint);
...
J'espérais que cela entraînerait des sauts de ligne, mais à la place, je vois des caractères cryptiques là où \n
ils seraient.
Tous les pointeurs appréciés.
Paul
android
android-canvas
Paul Mennega
la source
la source
Layout
au lieu d'appelerCanvas.drawText
directement. Cette Q&R montre comment utiliser aStaticLayout
pour dessiner du texte multiligne.Réponses:
Malheureusement, Android ne sait pas ce que
\n
c'est. Ce que vous devez faire est de décaper le\n
, puis de décaler le Y pour obtenir votre texte sur la ligne suivante. Donc quelque chose comme ça:la source
drawText()
?J'ai trouvé un autre moyen d'utiliser des mises en page statiques. Le code est là pour que quiconque puisse s'y référer:
la source
canvas.getWidth()
devrait vraiment l'êtregetWidth() - getPaddingLeft() - getPaddingRight()
, pour tenir compte du remplissage de la vue. Notez également que vous pouvez calculer le StaticLayout uniquement lorsque votre texte ou la taille de votre vue change et le dessiner sans en construire un nouveau, ce qui est probablement mieux!Parcourez simplement chaque ligne:
la source
J'ai écrit un exemple complet
colors.xml
classe java
la source
int noOfLines = gText.split("\n").length
C'est ma solution qui est basée sur la réponse de @ Dave (merci btw ;-))
J'ai essayé d'hériter de Canvas, mais cela ne vous laisse pas vraiment. C'est donc une classe intermédiaire!
la source
Je dois ajouter ici ma version qui tient également compte de la LARGEUR DE COURSE.
la source
ça va marcher. j'ai testé
Source: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/
la source
Oui. Utilisez
canvas.getFontSpacing()
comme incrément. Je l'ai essayé moi-même par curiosité et cela fonctionne pour toutes les tailles de police.la source
essaye ça
la source
J'ai réutilisé la solution proposée par GreenBee et créé une fonction pour dessiner du texte sur plusieurs lignes dans des limites spécifiées avec le "..." à la fin si une troncature se produisait:
la source
Solution sans StaticLayout
la source
J'ai travaillé avec ce que j'avais, qui convertissait déjà des lignes simples en toiles, et j'ai travaillé sur la réponse de Lumis, et j'ai fini avec ça. Les 1.3 et 1.3f sont censés être un remplissage entre les lignes, par rapport à la taille de la police.
la source
J'ai fait face à un problème similaire. mais je devrais retourner le chemin du texte. vous pouvez dessiner ce chemin sur Canvas. c'est mon code. J'utilise Break Text. et path.op
et pour trouver du texte lié, j'ai utilisé cette fonction
la source
Pour les utilisateurs de Kotlin. Le texte multiligne peut être créé à l'aide de StaticLayout . J'ai trouvé une bonne explication et comment l'utiliser comme fonction d'extension ici. https://medium.com/over-engineering/drawing-multiline-text-to-canvas-on-android-9b98f0bfa16a
la source
En plus de dessiner du texte multiligne, on peut avoir du mal à obtenir les limites du texte multiligne (par exemple pour l'aligner sur le canevas).
Défaut
paint.getTextBounds()
ne fonctionnera pas dans ce cas car elle mesurera la seule ligne.Pour plus de commodité, j'ai créé ces 2 fonctions d'extension: l'une pour dessiner du texte multiligne et l'autre pour obtenir des limites de texte.
Maintenant, l'utiliser est aussi simple que cela: Pour dessiner du texte multiligne:
Pour mesurer du texte:
val bounds = yourPaint.getTextBoundsMultiLine (texte)
Dans ce cas, il mesurera tout le texte du début à la fin et avec l'utilisation de la valeur par défaut une fois allouée (mutable) Rect.
Vous pouvez jouer avec le passage de paramètres supplémentaires pour plus de flexibilité.
la source
Mon exemple avec le dimensionnement et l'espacement dynamiques du texte, fonctionne très bien pour moi ...
la source