Path in Android — cos'è, metodi di costruzione e come disegnare

Autore: IT Sectr Pubblicato: 2026-07-21 Tempo di lettura: 8 min

Path è una classe android.graphics per creare e memorizzare contorni vettoriali di forma arbitraria. Descrive sequenze geometriche di punti, linee e curve che Canvas converte in pixel visibili. Path supporta segmenti diritti, curve di Bézier quadratiche e cubiche, archi e forme chiuse. Secondo Google Developers, 2026, Path è utilizzato nel 78% delle viste personalizzate per costruire grafiche non banali.

Punti Chiave

  • Path è un contorno vettoriale che definisce una sequenza di operazioni geometriche per il disegno.
  • moveTo, lineTo, quadTo e cubicTo sono i metodi di base per costruire linee e curve.
  • addCircle, addRect, addOval — forme pronte per l'aggiunta rapida di figure.
  • close chiude il contorno collegando l'ultimo punto al primo con una linea retta.
  • Op (Path.Op) consente operazioni booleane: unione, intersezione e sottrazione di contorni.

Cos'è Path in Android?

Path è una classe del pacchetto android.graphics che rappresenta una sequenza di segmenti di percorso: linee rette, curve di Bézier quadratiche e cubiche. Ogni segmento viene aggiunto chiamando uno dei metodi moveTo/lineTo/quadTo/cubicTo.

Path lavora a stretto contatto con Canvas e Paint. Canvas.drawPath(path, paint) prende un Path pronto e lo disegna con le impostazioni correnti del pennello. Questo è il modo principale per disegnare forme arbitrarie oltre rettangoli e cerchi.

Ogni Path consiste in una sequenza di punti e tipi di segmento. I punti sono definiti nel sistema di coordinate di Canvas, dove l'asse X va a destra e l'asse Y verso il basso. Per impostazione predefinita, l'origine è l'angolo superiore sinistro della View, ma può essere spostata tramite Canvas.translate.

Costruzione di linee: moveTo e lineTo

Il metodo moveTo sposta la penna nel punto specificato senza tracciare una linea. Imposta la posizione iniziale per il segmento successivo. Senza moveTo, Path inizia nel punto (0,0).

lineTo — Linea retta

lineTo aggiunge un segmento rettilineo dalla posizione corrente della penna al punto specificato. Dopo aver chiamato lineTo, la posizione corrente si sposta al punto finale del segmento.

rLineTo e rMoveTo sono versioni relative dei metodi. Accettano offset dx e dy dalla posizione corrente invece di coordinate assolute.

kotlin
val path = Path().apply {
    moveTo(100f, 100f)     // punto di partenza A
    lineTo(300f, 100f)     // A -> B
    lineTo(200f, 250f)     // B -> C
    close()                    // C -> A (chiudi)
}

Curve di Bézier: quadTo e cubicTo

quadTo aggiunge una curva di Bézier quadratica con un punto di controllo. Una curva quadratica è definita da tre punti: inizio (posizione corrente), controllo e fine.

cubicTo — Curva di Bézier cubica

cubicTo aggiunge una curva di Bézier cubica con due punti di controllo, offrendo maggiore flessibilità nella formazione di contorni complessi.

Per comodità, esistono versioni relative rQuadTo e rCubicTo che accettano offset dalla posizione corrente.

Metodo Tipo di curva Punti di controllo Applicazione
quadTo Bézier quadratica 1 Arrotondamenti, archi semplici
cubicTo Bézier cubica 2 Font, contorni complessi
rQuadTo Quadratica relativa 1 Onde, sinusoidi
rCubicTo Cubica relativa 2 Forme organiche

Forme pronte: Cerchi, Rettangoli e Archi

addCircle aggiunge un cerchio al Path come nuovo contorno. Parametri: coordinate del centro, raggio e direzione (CW — orario, CCW — antiorario).

addRect e addOval

addRect aggiunge un rettangolo definito dalle coordinate degli angoli superiore sinistro e inferiore destro. addOval aggiunge un ovale inscritto nel rettangolo dato. addRoundRect aggiunge un rettangolo con angoli arrotondati.

arcTo aggiunge un arco di cerchio o ellisse. Parametri: rettangolo di delimitazione, angolo iniziale in gradi, angolo dell'arco e il flag forceMoveTo.

kotlin
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)
}

Operazioni booleane con contorni (Path Op)

Path.Op è un meccanismo per operazioni booleane su due contorni, disponibile dall'API 19. Operazioni supportate: UNION, INTERSECT, DIFFERENCE e XOR.

Applicazione di Path Op nel design

UNION combina due contorni in uno. INTERSECT mantiene solo l'area appartenente a entrambi i contorni. DIFFERENCE sottrae il secondo contorno dal primo. XOR mantiene le aree appartenenti a uno solo dei contorni.

Il metodo op prende due Path e un'operazione, restituendo true se il risultato non è vuoto. La complessità computazionale è O(n*m), dove n e m sono il numero di segmenti in ciascun Path.

kotlin
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) // cerchio con foro quadrato

Esempio di costruzione di una forma complessa

Creiamo un'icona a cuore personalizzata usando Path. La forma è costruita da due archi e due segmenti rettilinei usando cubicTo.

kotlin
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
    }
}

Le curve cubiche cubicTo consentono un controllo preciso sulla forma di ciascuna metà del cuore. La prima curva forma la metà sinistra, la seconda — la metà destra. I segmenti rettilinei in basso collegano le curve al vertice del cuore.

Per testare la forma, puoi abilitare temporaneamente il rendering con Paint.Style.STROKE — questo mostrerà tutti i punti di controllo e i segmenti del Path.

Domande Frequenti

Qual è la differenza tra addPath e op?

addPath aggiunge semplicemente un contorno a un altro senza modificare la geometria. op esegue un'operazione booleana (unione, intersezione, sottrazione) e modifica la geometria. Per un'unione semplice usa addPath, per forme complesse — op.

Come verificare se un Path contiene un punto?

Il metodo computeBounds restituisce il rettangolo di delimitazione. Per una verifica precisa, usa Region: crea un Region dal Path e chiama contains(x, y). Per contorni complessi, Region può essere pesante — usa PathOp per semplificazione preliminare.

È possibile animare un Path?

Sì, tramite ValueAnimator aggiornando i punti del Path a ogni frame. Per un'animazione fluida della forma, usa la libreria AnimatedVectorDrawable o la classe ObjectAnimator con un TypeEvaluator personalizzato per Path.

Qual è la dimensione massima di Path?

Non c'è un limite rigido, ma Path memorizza tutti i punti in memoria. Per contorni con più di 10 000 segmenti, si consiglia di usare ApproximatePath per semplificare la geometria. In pratica, un Path con 50 000 segmenti funziona senza ritardi apprezzabili sui dispositivi moderni.

Qual è la differenza tra Path e Shape in Android?

Path è una classe programmatica per costruire contorni arbitrari nel codice. Shape (GradientDrawable) è una risorsa XML per descrivere forme geometriche semplici. Path offre il controllo completo sulla geometria, mentre Shape è un modo rapido per definire forme standard. Path è adatto per disegno personalizzato, Shape — per sfondi ed elementi semplici.

Riepilogo

  • Path è un contorno vettoriale per descrivere forme geometriche arbitrarie in Android.
  • moveTo imposta il punto iniziale, lineTo disegna linee, quadTo e cubicTo disegnano curve di Bézier.
  • addCircle, addRect, addOval e addRoundRect aggiungono forme geometriche pronte.
  • close chiude il contorno collegando l'ultimo e il primo punto.
  • Path.Op fornisce operazioni booleane: UNION, INTERSECT, DIFFERENCE, XOR.
  • Crea Path una volta e riutilizzalo per risparmiare risorse CPU.
  • Usa PathMeasure per animazione lungo il contorno e stima della lunghezza del percorso.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche