CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Android : Dessiner un StaticLayout incluant du code HTML dans un canevas Android ?

VivreUnEldorado
VivreUnEldorado
Niveau 45
17 mars 2019 à 11:19:19

Soit un texte HTML multiligne comme celui-ci : <div style="color : rouge ;"><b>foo</b></div>. Il peut être multiligne car au moins une de ces conditions est vraie : a) le texte est très long ou b) il y a au moins un <br />.

Le but est de dessiner ce texte sur un canvevas, qui est construit à l'aide d'un Bitmap.

Le code minimal que j'ai écrit est le suivant (android.graphics.canvas, android.graphics.drawable.BitmapDrawable...) :


private BitmapDrawable addTextOnImage(BitmapDrawable bitmapDrawable bitmapDrawable) {
    Bitmap bitmap = ..... ;
    String caption = rich_editor_caption.getHtml() ;
    StaticLayout mTextLayout_caption = StaticLayout.Builder.obtain(caption, 0, caption.length(), mTextPaint, bitmap.getWidth()).build() ;
    Bitmap final_bitmap = Bitmap.createBitmap(bitmap.getWidth(), mTextLayout_caption.getHeight() + bitmap.getHeight(), Bitmap.Config.ARGB_8888) ;
    Canvas canvas = nouveau Canvas(final_bitmap) ;
    mTextLayout_caption.draw(canvas) ;
    retourne nouveau BitmapDrawable(getActivity().getResources(), final_bitmap) ;
}

Si la légende de la variable contient du code HTML, ce dernier ne sera pas interprété. En d'autres termes : les balises seront effectivement affichées dans l'image résultante.

Est-il possible de faire interpréter ce code par l'application Android ?

Message édité le 17 mars 2019 à 11:20:01 par VivreUnEldorado
lokilok
lokilok
Niveau 17
17 mars 2019 à 11:53:55
StaticLayout.Builder.obtain(caption, 0, caption.length(), mTextPaint, bitmap.getWidth()).build() ;

Dans la doc de obtain, le premier paramètre c'est « source CharSequence: The text to be laid out, optionally with spans This value must never be null. » ( https://developer.android.com/reference/kotlin/android/text/StaticLayout.Builder#obtain )

Donc il faut pas que tu lui passes un string de ton code html, mais un charsequence avec des spans qui représentes le html interprété. Pour ça utilise Html.fromHtml ( https://developer.android.com/reference/android/text/Html.html#fromHtml(java.lang.String,%20int) ).

Message édité le 17 mars 2019 à 11:55:36 par lokilok
VivreUnEldorado
VivreUnEldorado
Niveau 45
17 mars 2019 à 13:02:38

Le 17 mars 2019 à 11:53:55 lokilok a écrit :
StaticLayout.Builder.obtain(caption, 0, caption.length(), mTextPaint, bitmap.getWidth()).build() ;

Dans la doc de obtain, le premier paramètre c'est « source CharSequence: The text to be laid out, optionally with spans This value must never be null. » ( https://developer.android.com/reference/kotlin/android/text/StaticLayout.Builder#obtain )

Donc il faut pas que tu lui passes un string de ton code html, mais un charsequence avec des spans qui représentes le html interprété. Pour ça utilise Html.fromHtml ( https://developer.android.com/reference/android/text/Html.html#fromHtml(java.lang.String,%20int) ).

Super, merci ! ça marche très très bien :oui: !

J'ai utilisé le drapeau Html.FROM_HTML_OPTION_USE_CSS_COLORS mais les couleurs ne sont toujours pas affichées (exemple : <b style="color: rgb(...)">dsfdsqfsfq</b>).

Tu sais comment faire ?

Message édité le 17 mars 2019 à 13:02:49 par VivreUnEldorado
lokilok
lokilok
Niveau 17
17 mars 2019 à 13:41:14

Je sais pas si ça gère le CSS, et même le HTML supporté est assez basique et dépend aussi de la version d'Android sur laquelle ton programme tourne. Perso j'utilise « <font color="#......"></font> » pour le foreground, pour les couleurs de backgrounds j'utilise un span custom (avec du coup un custom Html.TagHandler) qui change mon tag en BackgroundColorSpan, je sais pas si c'est nécessaire sur les versions récentes d'Android mais sur 4.0 je crois que c'est le meilleur moyen que j'avais trouvé.

Message édité le 17 mars 2019 à 13:42:10 par lokilok
VivreUnEldorado
VivreUnEldorado
Niveau 45
17 mars 2019 à 13:52:40

Le 17 mars 2019 à 13:41:14 lokilok a écrit :
Je sais pas si ça gère le CSS, et même le HTML supporté est assez basique et dépend aussi de la version d'Android sur laquelle ton programme tourne. Perso j'utilise « <font color="#......"></font> » pour le foreground, pour les couleurs de backgrounds j'utilise un span custom (avec du coup un custom Html.TagHandler) qui change mon tag en BackgroundColorSpan, je sais pas si c'est nécessaire sur les versions récentes d'Android mais sur 4.0 je crois que c'est le meilleur moyen que j'avais trouvé.

Arf c'est problématique alors ! :-(

En fait j'utilise cette API : https://github.com/wasabeef/richeditor-android et c'est elle qui met des style CSS inline... Donc à part en modifiant son truc pour mettre le <font color> que tu utilises, je ne vois pas trop comment faire :-(

lokilok
lokilok
Niveau 17
17 mars 2019 à 14:06:42

Après c'est peut-être possible de faire en sorte que Html.fromHtml supporte les styles, mais bon je saurais pas comment faire et des quelques recherches que j'avais fait j'ai rien trouvé à propos de ça.

Je viens de regarder le code de ton truc et visiblement il utilise une webview pour afficher son html donc quelque chose de bien plus poussé et bien plus lourd qu'un simple Html.fromHtml.

VivreUnEldorado
VivreUnEldorado
Niveau 45
17 mars 2019 à 14:28:03

Le 17 mars 2019 à 14:06:42 lokilok a écrit :
Après c'est peut-être possible de faire en sorte que Html.fromHtml supporte les styles, mais bon je saurais pas comment faire et des quelques recherches que j'avais fait j'ai rien trouvé à propos de ça.

Je viens de regarder le code de ton truc et visiblement il utilise une webview pour afficher son html donc quelque chose de bien plus poussé et bien plus lourd qu'un simple Html.fromHtml.

Ouaip sans doute pour gérer mon cas justement. Au final j'ai fait autrement, ça marche bien et ça m'évite d'utiliser la webview.

VivreUnEldorado
VivreUnEldorado
Niveau 45
17 mars 2019 à 14:28:15

Merci pour ton aide !

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment