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

Image non trouvée ! 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 !

 

 

 

 

Vous manquez de fontes, voici un site qui en propose énormément:

Image non trouvée !