Les fontes en 2D
Introduction
Pas mal de choses on était vu pour pouvoir faire de la 2D sous Android. Il reste encore une chose importante à voir: Afficher du texte.
Une première solution est déjà possible en passant par les bitmaps. On pourrait alors imaginer (comme le faisait les jeux dans les années 80-90 --- 1980-1990 pour les plus jeunes !) un fichier images dans lequel serait dessiné tous les caractères. Si possible tous de la même taille pour découper ensuite dans ce fichier les caractères que l'on doit récupérer suivant le texte à afficher (cf. Canvas.drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)).
Vous avez toutes les billes pour pouvoir le faire !
Mais il existe évidemment une autre possibilité: les fontes true type (fichiers .TTF pour True Type Fonts). Il en existe en effet une quantité importante et sont couramment utilisées sous Windows par exemple en C sous Windows.
Heureusement, sous android, une API sera disponile pour les gérer. La classe permettant de gérer une fonte true type se nomme Typeface.
Une méthode static va charger une fonte depuis le répertoire assets de votre projet:
Typeface font = Typeface.createFromAsset(context.getAssets(), fichierfonte);
où fichierfonte contiendra le nom du fichier .ttf à charger
Aussi
bizarre que cela puisse paramètre, il n'y a pas de gestions des erreurs
! Si une erreur vient à se produire, vous obtiendrez un beau message
RuntimeException !
Vous pourrez aussi charger une fonte depuis un quelconque répertoire:
public static Typeface createFromFile (String path)
Où path contiendra le chemin et le nom de la fonte à charger
public static Typeface createFromFile (File path)
où cette fois-ci vous aurez un objet de type file.
Définir les attributs de la police
Maintenant, vous allez pouvoir définir la couleur, le style et la taille de votre texte avant de l'afficher:
La classe qui permet de définir la couleur, et les attributs de manière générale a déjà été vue: il s'agit de la classe Paint.
Il suffit de rattacher votre fonte à votre instance de Paint comme ceci:
paint.setTypeFace(font);
Puis définir la couleur
public void setColor (int color);
Vous pourrez indiquer la taille en utilisant
public void setTextSize (float textSize) (pixel ou autre unité ? Je suppose pixel...)
Des attributs sur le texte comme le soulignement
public void setUnderlineText (boolean underlineText) à true pour souligner, à false sinon.
Pour barrer le texte
public void setStrikeThruText (boolean strikeThruText)
Pour incliner le texte (italic)
public void setTextSkewX (float skewX)
...
Afficher le texte
Il existe plusieurs méthodes pour afficher du texte, la plus classique étant le String,
void drawText(String text, float x, float y, Paint paint)
Mais vous pouvez aussi passer par un tableau de char, définir la position de départ et de fin dans le texte, ...
Aligner le texte
Vous allez enfin pouvoir aligner votre texte par rapport à la position que vous avez défini pour votre texte.
public void setTextAlign (Paint.Align align)
Avec la méthode statique Align qui peut prendre les valeurs suivantes:
Paint.Align CENTER pour centrer votre texte par rapport à la position
d'origine de votre texte
Paint.Align LEFT pour que votre texte s'affiche sur la droite de votre position
d'origine (Valeur par défaut)
Paint.Align RIGHT pour que votre texte s'affiche sur la gauche de votre position
d'origine
Par exemple, pour afficher du texte au milieu de la ligne y sur votre écran:
Demandez un alignement CENTER
paint.setTextAlign(Paint.Align.CENTER);
Puis vous recherchez le milieu de votre écran (en passant par les informations de votre canevas). En Y, vous fixez la position en 100.
Le texte va donc s'afficher en se centrant par rapport à X, qui est lui même le centre de l'écran en X.
canvas.drawText("Mon texte !", canvas.getWidth() / 2, 100, paint);
Des informations
Hormis des informations qui peuvent être retournées sur les attributs du texte, vous pourrez avoir une information importante:
L'espacement en Y conseillé par rapport à la fonte courante:
public float getFontSpacing (). Il suffira d'ajouter cette valeur lors du prochain affichage d'une nouvelle ligne à l'écran.
Dans le même style, vous pouvez demander la largeur et la hauteur que va occuper le texte si celui-ci était compris dans un rectangle. Vous passerez donc par la classe Rect pour interpréter les valeurs.
Rect bounds = new Rect();
String texte="Mon texte à moi"; // Le texte dont on veut les
informations
paint.getTextBounds(texte, 0, texte.length(), bounds); // On veut les informations
sur la totalité du texte (0, length)
Log.i("FontTTF", "Valeur:"+bounds.width() + " "+bounds.height());
// On sort les informations dans un fichier de log
Exemple
Et enfin un exemple de code, dont une grande partie devrait être maintenant assimilée !