Dessiner sous Android
Pour dessiner dans une surface, vous pouvez utiliser une Classe Canvas, qui est une interface qui va permettre d'accéder à cette surface et d'y effectuer des opérations graphiques.
A partir d'un canevas récupéré depuis votre classe de rendu RenderView de la méthode onDraw, vous allez pouvoir dessiner des figures 2D élémentaires via une librairie graphique de bas niveau nommée Skia:
Les opérations
graphiques ne seront pas rendues immédiatement sur l'écran. Elles
passeront d'abord par une sorte d'"écran
logique" ou "backbuffer" avant d'être effectivement
affichées.
Un canevas est initialisé avec un fond blanc. Mais il pourra aussi contenir des bitmaps.
Voir notion élémentaire de la 2D
Résolution de la surface du canevas
Pour connaître la résolution du canevas, vous avez deux méthodes à disposition:
int width = canvas.getWidth();
int height = canvas.getHeight();
Facile non ?
Dans le cas où
votre écran et en FullScreen, les informations
qui seront retournées vous indiquerons la résolution de l'écran.
La classe Paint
Avant de dessiner quelque chose, il faut d'abord voir la classe Paint. Cette classe permet de positionner via de setters différents attributs qui seront utilisés pour dessiner à l'écran. Vous pourrez aussi relire les attributs via des getters.
Définir une couleur
Pour définir la couleur d'un point, il suffit d'instancier Paint, puis de positionner les attributs de la couleur au format alpha, rouge, vert et bleu via le setter ARGB ou via color:
Paint paint = new Paint();
paint.setARGB(alpha, red, green, blue);
ou
setColor (int color)
Dans ce cas, color correspond à une valeur sur 32 bits qui se code très facilement en héxadécimal car le format sera alors AARRGGBB. Vous pourrez aussi utiliser la classe Color pour définir une couleur (par exemple Color.RED pour avoir la couleur rouge).
Exemple setColor (0xFFFF0000) : Alpha à 255 (FF), Rouge à 255 (FF), vert à 0 et bleu à 0. Ce qui donne la couleur rouge en sortie.
Alpha à FF
rend le point complètement opaque, à 00, totalement transparent.
Définir la taille d'un point
Paint.setStrokeWidth(float widthInPixels) permet d'indiquer la taille d'un point en pixel.
L'anti-aliasing
Paint.setAntiAlias(boolean) où boolean sera positionné à true pour activer ou false pour désactiver l'antialiasing (évidemment, l'antialiasing actif est plus beau, mais consomme aussi plus de temps de calcul !)
Paint.isAntiAlias() permettra de savoir si l'antialiasing est positionné ou non.
Style
Utilisé pour indiquer par exemple si l'on veut ou non une bordure autour d'un rectangle, que le rectangle doit être rempli, les deux à la fois...
Paint.setStyle(Style style); (import android.graphics.Paint.Style;)
Avec style poistionné à Style.FILL (rectangle rempli avec la couleur
définie dans Paint), Style.STROKE (Uniquement la bordure sera dessinée,
ou Style.FILL_AND_STROKE (bordure et remplissage du rectangle).
Remplir d'un couleur le fond de la cible du canevas
Pour remplir le fond (background) d'un Canvas avec une certaine couleur, vous utiliserez la méthode Canvas.drawRGB(int r, int v, int b) avec r, g et b les composantes rouge, vert et bleu de la couleur à obtenir (jusqu'à 25 niveaux par composantes, cf. la classe Color).
Pour un exemple cf. FullScreen sous android.
Mais dans certains cas (par exemple superposition d'objets graphiques qui doivent laisser transparaître l'image du canevas de l'objet en dessous), il sera nécessaire de remplir le canevas avec du vide:
Dans ce cas, vous utiliserez:
canvas.drawColor( 0, android.graphics.PorterDuff.Mode.CLEAR ); Pour effacer la surface
A associer avec un SurfaceHolder.setFormat(PixelFormat.TRANSLUCENT); pour rendre transparent la surface. Et certainement à l'affichage en avant plan forcé de la SurfaceView
Vous pouvez aussi avoir besoin de remplir le fond avec une image. Dans ce cas, vous utiliserez un bitmap.
Dessiner un Pixel
La méthode pour dessiner un pixel ou un point se nomme drawPoint(float x, float y, Paint paint)
Canvas.drawPoint(float x, float y, Paint paint);
x, y sont donc les coordonnées, en float. Dans l'immédiat, ils ne serviront pas, considérons donc uniquement les valeurs entières.
paint est une instance de la classe Paint. Cette classe contiendra la couleur du point ainsi que la taille de celui-ci (et bien d'autres choses, mais qui ne serviront pas pour dessiner un point).
Dessiner une ligne
Pour dessiner une ligne, vous utiliserez la méthode suivante du canvas:
Canvas.drawLine(float x, float y, float x1, float y1, Paint paint);
Plutôt classique, vous allez indiquer les coordonnées de départ et d'arrivée du segment...
Là encore, la classe Paint est utilisée pour définir la couleur, mais aussi la taille de la ligne ou l'antialiasing.
Dessiner un rectangle
Dans le même principe, vous dessinerez des rectangles via Canvas.drawRect(float topleftX, float topleftY, float bottomRightX, float bottomRightY, Paint paint).
N'oubliez pas le
style pour avoir un simple rectangle ou un rectangle
plein.
Vous indiquerez les coordonnées en haut à gauche et en bas à droite pour dessiner le rectangle correspondant.
Vous avez déjà suffisement d'exemples pour savoir faire celui-ci
non ?
Dessiner un rectangle aux coins arrondies
Après le rectangle, voici le rectangle avec coins arrondies. Les coordonnées passeront cette fois-ci par une instance Rect de type flottant.
drawRoundRect(RectF rect, float rx, float ry, Paint paint)
La aussi, n'oubliez
pas le style.
Dessiner un cercle
La méthode Canvas.drawCircle(float centerX, float centerY, float radius, Paint paint) vous permettra de dessiner un cercle.
Vous indiquez les coordonnées du centre du cercle ainsi que son rayon, et le tour est joué.
Vous avez peut-être
pris l'habitude depuis quelques années de dessiner une cercle à
partir des coordonnées supérieure gauche et inférieure
droit d'un carré. Hors, ici, il s'agit bien du centre du cercle. Voyez
la méthode suivante pour dessiner à partir d'un rectangle !
La aussi, n'oubliez
pas le style.
Dessiner une ovale
Voici une méthode pour dessiner une ovale/ellipse. Cette fois-ci, vous positionnerez (via Rect) un rectangle dans lequel sera dessiné votre ovale.
drawOval(RectF oval, Paint paint)
La aussi, n'oubliez
pas le style.
Annexes
Il existe une solution plus statique pour dessiner dans le background d'un widget. Il s'agit d'utiliser un fichier xml dans lequel vous definissez les shapes.