Je veux dessiner un SpannedString
à un Canvas
.Comment dessiner une chaîne avec fractionnés Canvas.drawText dans Android
SpannableString spannableString = new SpannableString("Hello World!");
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED);
BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(foregroundSpan, 1, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundSpan, 3, spannableString.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
L'exemple ci-dessus a été dessiné à l'aide d'un TextView
, qui à son tour utilise un Layout
pour dessiner le texte avec des portées. Je sais que using a Layout
is the recommended way pour dessiner du texte sur la toile. Cependant, je suis en train de créer ma propre mise en page de texte, donc j'ai besoin de la mettre en œuvre moi-même.
Faire quelque chose comme cela ne fonctionne pas
canvas.drawText(spannableString, 0, spannableString.length(), 0, 0, mTextPaint);
parce que drawText
obtient le texte de la spannableString
, aucun des travées. Les couleurs de dessin sont gérées séparément par TextPaint
.
Comment est-ce que j'utilise canvas.drawText
(ou drawTextRun
) pour dessiner l'information d'envergure (spécifiquement la couleur de premier plan et d'arrière-plan ici)?
connexes
- How to loop through the spans in a SpannedString or SpannableString in Android
- Is it possible to display multi-color text with one call to Canvas.drawText()?
Plan pour une solution
J'allais faire directement une auto réponse mais cela se avère être plus diff icult que je pensais. Donc, je vais poster d'abord, puis ajouter une réponse chaque fois que je peux le comprendre. (Je bien sûr la bienvenue à quiconque de répondre à la première.)
Voici les pièces que j'ai jusqu'à présent:
- Draw each span range as a separate text run
- Utilisez
drawTextRun
pour dessiner le texte (examples) (mise à jour : non ajouté jusqu'à API 23) - Utilisez
getRunAdvance
pour mesurer par où commencer le prochain passage de texte (mise à jour: non ajouté jusqu'à API 23, utilisezmeasureText
à la place) - La couleur de fond devra probablement être utilisée séparément (avec
drawRect
oudrawPath
peut-être? Voir here, here et here.) - code source pour
TextView
,StaticLayout
etTextLine
alors quel est le problème avec la mise en page 'draw' en fait? – pskink
@pskink, la mise en page standard ne traite que les textes horizontaux LTR et RTL. Je suis en train de faire une mise en page verticale de texte pour [mongol traditionnel] (http://stackoverflow.com/q/29739720/3681880). J'ai essayé plusieurs [Layout hacks] (http://stackoverflow.com/a/29739721/3681880) dans le passé, mais même ceux-ci ne me permettent pas de faire tourner les emoji ou les caractères CJK. Donc je pars de zéro. [J'ai terminé la fonctionnalité de mise en page de base] (https://github.com/suragch/mongol-library/blob/master/mongol-library/src/main/java/net/studymongolian/mongollibrary/MongolLayout.java); maintenant je dois soutenir le texte étendu. – Suragch
ok, maintenant je vois que ce n'est pas un "normal" 'Hello World' que vous avez présenté dans votre image – pskink