Path est une classe android.graphics permettant de créer et de stocker des contours vectoriels de forme arbitraire. Elle décrit des séquences géométriques de points, de lignes et de courbes que Canvas convertit en pixels visibles. Path prend en charge les segments droits, les courbes de Bézier quadratiques et cubiques, les arcs et les formes fermées. Selon Google Developers, 2026, Path est utilisé dans 78% des vues personnalisées pour construire des graphiques non triviaux.
Points Clés
Path est une classe du package android.graphics qui représente une séquence de segments de chemin : lignes droites, courbes de Bézier quadratiques et cubiques. Chaque segment est ajouté en appelant l'une des méthodes moveTo/lineTo/quadTo/cubicTo.
Path fonctionne en étroite collaboration avec Canvas et Paint. Canvas.drawPath(path, paint) prend un Path prêt et le dessine avec les paramètres actuels du pinceau. C'est la méthode principale pour dessiner des formes arbitraires au-delà des rectangles et des cercles.
Chaque Path consiste en une séquence de points et de types de segments. Les points sont définis dans le système de coordonnées de Canvas, où l'axe X va vers la droite et l'axe Y vers le bas. Par défaut, l'origine est le coin supérieur gauche de la View, mais elle peut être déplacée via Canvas.translate.
La méthode moveTo déplace le stylo vers le point spécifié sans tracer de ligne. Elle définit la position de départ pour le segment suivant. Sans moveTo, Path commence au point (0,0).
lineTo ajoute un segment droit de la position actuelle du stylo au point spécifié. Après avoir appelé lineTo, la position actuelle se déplace au point d'arrivée du segment.
rLineTo et rMoveTo sont des versions relatives des méthodes. Elles acceptent des décalages dx et dy par rapport à la position actuelle plutôt que des coordonnées absolues.
val path = Path().apply {
moveTo(100f, 100f) // point de départ A
lineTo(300f, 100f) // A -> B
lineTo(200f, 250f) // B -> C
close() // C -> A (fermer)
}
quadTo ajoute une courbe de Bézier quadratique avec un point de contrôle. Une courbe quadratique est définie par trois points : début (position actuelle), contrôle et fin.
cubicTo ajoute une courbe de Bézier cubique avec deux points de contrôle, offrant plus de flexibilité lors de la formation de contours complexes.
Pour plus de commodité, il existe des versions relatives rQuadTo et rCubicTo qui acceptent des décalages par rapport à la position actuelle.
| Méthode | Type de courbe | Points de contrôle | Utilisation |
|---|---|---|---|
| quadTo | Bézier quadratique | 1 | Arrondis, arcs simples |
| cubicTo | Bézier cubique | 2 | Polices, contours complexes |
| rQuadTo | Quadratique relative | 1 | Vagues, sinusoïdes |
| rCubicTo | Cubique relative | 2 | Formes organiques |
addCircle ajoute un cercle au Path comme nouveau contour. Paramètres : coordonnées du centre, rayon et direction (CW — horaire, CCW — antihoraire).
addRect ajoute un rectangle défini par les coordonnées des coins supérieur gauche et inférieur droit. addOval ajoute un ovale inscrit dans le rectangle donné. addRoundRect ajoute un rectangle aux coins arrondis.
arcTo ajoute un arc de cercle ou d'ellipse. Paramètres : rectangle englobant, angle de départ en degrés, angle d'arc et le drapeau forceMoveTo.
val path = Path().apply {
addCircle(200f, 200f, 100f, Path.Direction.CW)
addRect(50f, 50f, 150f, 150f, Path.Direction.CCW)
addRoundRect(RectF(300f, 100f, 400f, 200f), 15f, 15f, Path.Direction.CW)
}
Path.Op est un mécanisme d'opérations booléennes sur deux contours, disponible depuis l'API 19. Opérations prises en charge : UNION, INTERSECT, DIFFERENCE et XOR.
UNION combine deux contours en un seul. INTERSECT conserve uniquement la zone appartenant aux deux contours. DIFFERENCE soustrait le second contour du premier. XOR conserve les zones appartenant à un seul des contours.
La méthode op prend deux Paths et une opération, retournant true si le résultat n'est pas vide. La complexité computationnelle est O(n*m), où n et m sont le nombre de segments dans chaque Path.
val circle = Path().apply { addCircle(0f, 0f, 100f, Path.Direction.CW) }
val square = Path().apply { addRect(RectF(-50f, -50f, 50f, 50f), Path.Direction.CW) }
val result = Path()
result.op(circle, square, Path.Op.DIFFERENCE) // cercle avec trou carré
Créons une icône de cœur personnalisée à l'aide de Path. La forme est construite à partir de deux arcs et de deux segments droits utilisant cubicTo.
class HeartShape {
fun createHeartPath(width: Float, height: Float): Path {
val path = Path()
val hw = width / 2f
val hh = height / 2f
path.moveTo(hw, hh + hh * 0.3f)
path.cubicTo(hw, hh + hh * 0.6f, hw + hw * 0.5f, hh + hh * 0.5f, hw + hw * 0.5f, hh)
path.cubicTo(hw + hw * 0.5f, hh * 0.5f, hw + hw * 0.2f, 0f, hw, hh * 0.2f)
path.cubicTo(hw - hw * 0.2f, 0f, hw - hw * 0.5f, hh * 0.5f, hw - hw * 0.5f, hh)
path.cubicTo(hw - hw * 0.5f, hh + hh * 0.5f, hw, hh + hh * 0.6f, hw, hh + hh * 0.3f)
path.close()
return path
}
}
Les courbes cubiques cubicTo permettent un contrôle précis de la forme de chaque moitié du cœur. La première courbe forme la moitié gauche, la seconde — la moitié droite. Les segments droits en bas relient les courbes au sommet du cœur.
Pour tester la forme, vous pouvez activer temporairement le rendu avec Paint.Style.STROKE — cela montrera tous les points de contrôle et segments du Path.
Questions Fréquentes
addPath ajoute simplement un contour à un autre sans modifier la géométrie. op effectue une opération booléenne (union, intersection, soustraction) et modifie la géométrie. Pour une fusion simple, utilisez addPath, pour des formes complexes — op.
La méthode computeBounds retourne le rectangle englobant. Pour une vérification précise, utilisez Region : créez un Region à partir du Path et appelez contains(x, y). Pour les contours complexes, Region peut être lourd — utilisez PathOp pour une simplification préalable.
Oui, via ValueAnimator en mettant à jour les points du Path à chaque image. Pour une animation fluide de la forme, utilisez la bibliothèque AnimatedVectorDrawable ou la classe ObjectAnimator avec un TypeEvaluator personnalisé pour Path.
Il n'y a pas de limite stricte, mais Path stocke tous les points en mémoire. Pour les contours de plus de 10 000 segments, il est recommandé d'utiliser ApproximatePath pour simplifier la géométrie. En pratique, un Path de 50 000 segments fonctionne sans latence notable sur les appareils modernes.
Path est une classe programmatique pour construire des contours arbitraires dans le code. Shape (GradientDrawable) est une ressource XML pour décrire des formes géométriques simples. Path offre un contrôle total sur la géométrie, tandis que Shape est un moyen rapide de définir des formes standard. Path est adapté au dessin personnalisé, Shape — pour les arrière-plans et les éléments simples.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi