Path ist eine android.graphics-Klasse zum Erstellen und Speichern von Vektorkonturen beliebiger Form. Sie beschreibt geometrische Sequenzen von Punkten, Linien und Kurven, die Canvas in sichtbare Pixel umwandelt. Path unterstützt gerade Segmente, quadratische und kubische Bezier-Kurven, Bögen und geschlossene Formen. Laut Google Developers, 2026 wird Path in 78% der benutzerdefinierten Views für die Erstellung nicht-trivialer Grafiken verwendet.
Wichtige Punkte
Path ist eine Klasse aus dem Paket android.graphics, die eine Sequenz von Pfadsegmenten darstellt: gerade Linien, quadratische und kubische Bezier-Kurven. Jedes Segment wird durch Aufruf einer der Methoden moveTo/lineTo/quadTo/cubicTo hinzugefügt.
Path arbeitet eng mit Canvas und Paint zusammen. Canvas.drawPath(path, paint) nimmt einen fertigen Path und zeichnet ihn mit den aktuellen Pinsel-Einstellungen. Dies ist die primäre Methode zum Zeichnen beliebiger Formen über Rechtecke und Kreise hinaus.
Jeder Path besteht aus einer Sequenz von Punkten und Segmenttypen. Die Punkte werden im Canvas-Koordinatensystem definiert, wobei die X-Achse nach rechts und die Y-Achse nach unten zeigt. Standardmäßig ist der Ursprung die obere linke Ecke der View, kann aber über Canvas.translate verschoben werden.
Die moveTo-Methode bewegt den Stift zum angegebenen Punkt, ohne eine Linie zu zeichnen. Sie setzt die Startposition für das nächste Segment. Ohne moveTo beginnt Path am Punkt (0,0).
lineTo fügt ein gerades Segment von der aktuellen Stiftposition zum angegebenen Punkt hinzu. Nach dem Aufruf von lineTo bewegt sich die aktuelle Position zum Endpunkt des Segments.
rLineTo und rMoveTo sind relative Versionen der Methoden. Sie akzeptieren dx- und dy-Offsets von der aktuellen Position anstelle absoluter Koordinaten.
val path = Path().apply {
moveTo(100f, 100f) // Startpunkt A
lineTo(300f, 100f) // A -> B
lineTo(200f, 250f) // B -> C
close() // C -> A (schließen)
}
quadTo fügt eine quadratische Bezier-Kurve mit einem Kontrollpunkt hinzu. Eine quadratische Kurve wird durch drei Punkte definiert: Start (aktuelle Position), Kontrollpunkt und Ende.
cubicTo fügt eine kubische Bezier-Kurve mit zwei Kontrollpunkten hinzu, was mehr Flexibilität bei der Bildung komplexer Konturen bietet.
Der Einfachheit halber gibt es relative Versionen rQuadTo und rCubicTo, die Offsets von der aktuellen Position akzeptieren.
| Methode | Kurventyp | Kontrollpunkte | Anwendung |
|---|---|---|---|
| quadTo | Quadratische Bezier | 1 | Abrundungen, einfache Bögen |
| cubicTo | Kubische Bezier | 2 | Schriftarten, komplexe Konturen |
| rQuadTo | Relative quadratische | 1 | Wellen, Sinuskurven |
| rCubicTo | Relative kubische | 2 | Organische Formen |
addCircle fügt einen Kreis als neuen Kontur zum Path hinzu. Parameter: Mittelpunktskoordinaten, Radius und Richtung (CW — im Uhrzeigersinn, CCW — gegen den Uhrzeigersinn).
addRect fügt ein Rechteck hinzu, das durch die Koordinaten der oberen linken und unteren rechten Ecke definiert ist. addOval fügt ein Oval ein, das in das angegebene Rechteck eingeschrieben ist. addRoundRect fügt ein Rechteck mit abgerundeten Ecken hinzu.
arcTo fügt einen Bogen eines Kreises oder einer Ellipse hinzu. Parameter: Begrenzungsrechteck, Startwinkel in Grad, Bogenwinkel und das forceMoveTo-Flag.
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 ist ein Mechanismus für boolesche Operationen auf zwei Konturen, verfügbar seit API 19. Unterstützte Operationen: UNION, INTERSECT, DIFFERENCE und XOR.
UNION kombiniert zwei Konturen zu einer. INTERSECT behält nur den Bereich, der zu beiden Konturen gehört. DIFFERENCE subtrahiert die zweite Kontur von der ersten. XOR behält Bereiche, die nur zu einer der Konturen gehören.
Die op-Methode nimmt zwei Paths und eine Operation entgegen und gibt true zurück, wenn das Ergebnis nicht leer ist. Die Rechenkomplexität beträgt O(n*m), wobei n und m die Anzahl der Segmente in jedem Path sind.
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) // Kreis mit quadratischem Loch
Erstellen wir ein benutzerdefiniertes Herzsymbol mit Path. Die Form wird aus zwei Bögen und zwei geraden Segmenten mit cubicTo aufgebaut.
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
}
}
Kubische Kurven cubicTo ermöglichen eine präzise Kontrolle über die Form jeder Herzhälfte. Die erste Kurve bildet die linke Hälfte, die zweite die rechte Hälfte. Die geraden Segmente unten verbinden die Kurven mit der Spitze des Herzens.
Zum Testen der Form können Sie vorübergehend das Rendering mit Paint.Style.STROKE aktivieren — dies zeigt alle Kontrollpunkte und Path-Segmente an.
Häufig gestellte Fragen
addPath fügt einfach eine Kontur zu einer anderen hinzu, ohne die Geometrie zu ändern. op führt eine boolesche Operation (Vereinigung, Schnittmenge, Subtraktion) durch und ändert die Geometrie. Für einfache Zusammenführungen verwenden Sie addPath, für komplexe Formen — op.
Die computeBounds-Methode gibt das Begrenzungsrechteck zurück. Für eine genaue Überprüfung verwenden Sie Region: Erstellen Sie ein Region aus dem Path und rufen Sie contains(x, y) auf. Bei komplexen Konturen kann Region schwer sein — verwenden Sie PathOp zur vorherigen Vereinfachung.
Ja, durch ValueAnimator mit Aktualisierung der Path-Punkte in jedem Frame. Für eine flüssige Formanimation verwenden Sie die Bibliothek AnimatedVectorDrawable oder die Klasse ObjectAnimator mit einem benutzerdefinierten TypeEvaluator für Path.
Es gibt keine strenge Grenze, aber Path speichert alle Punkte im Speicher. Für Konturen mit mehr als 10 000 Segmenten wird empfohlen, ApproximatePath zur Vereinfachung der Geometrie zu verwenden. In der Praxis funktioniert ein Path mit 50 000 Segmenten auf modernen Geräten ohne merkliche Verzögerung.
Path ist eine programmatische Klasse zum Erstellen beliebiger Konturen im Code. Shape (GradientDrawable) ist eine XML-Ressource zur Beschreibung einfacher geometrischer Formen. Path bietet vollständige Kontrolle über die Geometrie, während Shape eine schnelle Möglichkeit zur Definition von Standardformen ist. Path eignet sich für benutzerdefiniertes Zeichnen, Shape — für Hintergründe und einfache Elemente.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch