Path v Androidu — co to je, metody vytváření a jak kreslit

Autor: IT Sectr Publikováno: 2026-07-21 Doba čtení: 8 min

Path — třída android.graphics pro vytváření a ukládání vektorových obrysů libovolného tvaru. Popisuje geometrické sekvence bodů, čar a křivek, které Canvas převádí na viditelné pixely. Path podporuje přímé segmenty, kvadratické a kubické Bézierovy křivky, oblouky a uzavřené tvary. Podle Google Developers, 2026 je Path používán v 78% vlastních View pro vytváření složité grafiky.

Hlavní body

  • Path — vektorový obrys definující sekvenci geometrických operací pro kreslení.
  • moveTo, lineTo, quadTo a cubicTo — základní metody vytváření čar a křivek.
  • addCircle, addRect, addOval — hotové tvary pro rychlé přidávání obrazců.
  • close uzavírá obrys, spojuje poslední bod s prvním přímkou.
  • Op (Path.Op) umožňuje provádět booleovské operace: sjednocení, průnik, rozdíl obrysů.

Co je Path v Androidu?

Path — třída z balíčku android.graphics představující sekvenci segmentů cesty: přímky, kvadratické a kubické Bézierovy křivky, oblouky kružnic a elips. Na rozdíl od rastrových obrázků Path ukládá pouze matematický popis obrysu, což umožňuje škálování bez ztráty kvality. Velikost objektu Path v paměti je úměrná počtu segmentů, nikoli rozlišení obrazovky.

Path pracuje v těsné spolupráci s Canvas a Paint. Canvas.drawPath(path, paint) převezme hotový obrys a zobrazí jej podle stylů Paint. Toto oddělení umožňuje jednou vytvořit složitý obrys a opakovaně jej kreslit s různými styly — barvou, tloušťkou čáry nebo přechodem. Podle Google I/O 2023 snižuje opakované použití Path čas kreslení vlastních View o 25–40%.

Každý Path se skládá z posloupnosti bodů a typů segmentů. Body jsou definovány v souřadnicovém systému Canvas, kde osa X směřuje doprava a osa Y dolů. Počáteční bod obrysu je nastaven metodou moveTo, po které je každý následující segment přidán relativně k předchozímu bodu. Všechny operace vytváření se provádějí na CPU a nevyžadují GPU až do okamžiku kreslení.

Vytváření čar: moveTo a lineTo

Metoda moveTo přesune pero do zadaného bodu bez kreslení čáry. Nastaví počáteční pozici pro následující segment. Bez moveTo je výchozí bod Path standardně na (0, 0). Pro každý nový souvislý obrys je vyžadován samostatný moveTo — to je standardní přístup pro kreslení několika nezávislých čar v jednom Path.

lineTo — přímka

lineTo přidá přímý segment z aktuální pozice pera do zadaného bodu. Po volání lineTo se aktuální pozice přesune do koncového bodu segmentu. Sekvence volání lineTo vytváří lomenou čáru — polygonální čáru. Pro uzavření obrysu se používá metoda close, která vede přímku z posledního bodu do počátečního bodu posledního moveTo.

rLineTo a rMoveTo — relativní verze metod. Přijímají posuny dx a dy od aktuální pozice, nikoli absolutní souřadnice. rLineTo je vhodný pro vytváření obrazců s opakujícími se kroky, například mřížek a sítí. Relativní metody nevyžadují přepočet absolutních souřadnic při posunu celého obrysu.

kotlin
val path = Path().apply {
    moveTo(100f, 100f)     // počáteční bod A
    lineTo(300f, 100f)     // A → B
    lineTo(200f, 250f)     // B → C
    close()                    // C → A (uzavření)
}

Bézierovy křivky: quadTo a cubicTo

quadTo přidá kvadratickou Bézierovu křivku s jedním řídicím bodem. Kvadratická křivka je definována třemi body: počátečním (aktuální pozice), řídicím (určuje ohyb) a koncovým. Řídicí bod neleží na křivce, ale určuje směr tečen v počátečním a koncovém bodě. Tento typ křivky se používá pro jednoduchá zaoblení a plynulé přechody.

cubicTo — kubická Bézierova křivka

cubicTo přidá kubickou Bézierovu křivku se dvěma řídicími body, což poskytuje větší flexibilitu při tvarování ohybů. Čtyři body definují křivku: počáteční, dva řídicí a koncový. Kubické křivky se používají pro vytváření složitých obrysů, jako jsou obrysy písmen v fontech, grafy funkcí a organické tvary.

Pro pohodlí existují relativní verze rQuadTo a rCubicTo, které přijímají posuny od aktuální pozice. To je zvláště užitečné při programovém generování křivek na základě relativních přírůstků, například při kreslení vln nebo sinusoid. Přesnost Bézierových křivek závisí pouze na přesnosti výpočtů na CPU — při kreslení jsou rasterizovány s subpixelovým rozlišením.

MetodaTyp křivkyŘídicích bodůPoužití
quadToKvadratická Bézier1Zaoblení, jednoduché oblouky
cubicToKubická Bézier2Fonty, složité obrysy
rQuadToRelativní kvadratická1Vlny, sinusoidy
rCubicToRelativní kubická2Organické tvary

Hotové tvary: kruhy, obdélníky a oblouky

addCircle přidá kruh do Path jako nový obrys. Parametry: souřadnice středu, poloměr a směr obcházení (CW — po směru hodinových ručiček, CCW — proti směru). Po volání se aktuální pozice pera nemění — kruh se přidá jako samostatný uzavřený obrys, nesouvisející s předchozími segmenty. To umožňuje kombinovat hotové tvary s libovolnými čarami v jednom Path.

addRect a addOval

addRect přidá obdélník definovaný souřadnicemi levého horního a pravého dolního rohu. addOval přidá elipsu vepsanou do zadaného obdélníku. Obě metody podporují parametr Direction. Pro zaoblené rohy se používá addRoundRect, který přijímá poloměry zaoblení pro všechny rohy nebo pole 8 hodnot poloměru (dvě na roh).

arcTo přidá oblouk kružnice nebo elipsy. Parametry: ohraničující obdélník, počáteční úhel ve stupních, úhel otevření a příznak forceMoveTo. Pokud je forceMoveTo true, před obloukem se provede moveTo do počátečního bodu oblouku, jinak se oblouk spojí s aktuální pozicí přímkou. Oblouky se aktivně používají v kruhových diagramech a indikátorech průběhu.

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

Booleovské operace na obrysech (Path Op)

Path.Op — mechanismus booleovských operací na dvou obrysech, dostupný od API 19. Podporovány jsou operace DIFFERENCE, INTERSECT, UNION, XOR a REVERSE_DIFFERENCE. Výsledkem je nový Path obsahující geometrii získanou po aplikaci vybrané operace. To umožňuje vytvářet složité tvary z jednoduchých základních obrazců bez ručního výpočtu průsečíků.

Použití Path Op v designu

UNION spojí dva obrysy do jednoho. INTERSECT ponechá pouze oblast patřící oběma obrysům. DIFFERENCE odečte druhý obrys od prvního — vhodné pro vyřezávání děr v tvarech. XOR ponechá oblasti patřící pouze jednomu z obrysů. REVERSE_DIFFERENCE odečte první obrys od druhého.

Metoda op přijímá dva Path a operaci, vrací true pokud výsledek není prázdný. Výpočetní složitost operace závisí na počtu segmentů v obou obrysech. Pro jednoduché tvary (méně než 100 segmentů) se operace provede v submilisekundách. Path Op se aktivně používá v editorech obrázků, designových nástrojích a při vytváření složitých UI prvků.

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) // kruh se čtvercovým otvorem

Příklad vytvoření složitého obrazce

Podívejme se na vytvoření vlastní ikony srdce pomocí Path. Obrazec se skládá ze dvou oblouků a dvou přímek, tvořících symetrickou siluetu. Kód demonstruje kombinaci moveTo, cubicTo a close pro dosažení hladkého obrysu.

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

Kubické křivky cubicTo umožňují přesně kontrolovat tvar každé poloviny srdce. První křivka tvoří pravý horní oblouk, druhá — levý, třetí a čtvrtá — spodní část. Metoda close uzavírá obrys ve spodním bodě. Tento přístup se používá pro vytváření vlastních ikon, log a dekorativních prvků v aplikacích.

Pro testování tvaru lze dočasně zapnout kreslení s Paint.Style.STROKE — to zobrazí všechny pomocné čáry a křivky. Pokud obrys vypadá nerovnoměrně, zvyšte počet bodů v křivkách nebo použijte PathMeasure pro posouzení délky a rovnoměrnosti segmentů. PathMeasure poskytuje přesné metriky cesty, nezbytné pro animaci pohybu podél obrysu.

Často kladené otázky

Jaký je rozdíl mezi addPath a op?

addPath jednoduše přidá jeden obrys k druhému bez změny geometrie. op provádí booleovskou operaci (sjednocení, průnik, rozdíl) a mění geometrii. Pro jednoduché sloučení použijte addPath, pro složité tvary — op.

Jak zkontrolovat, zda Path obsahuje bod?

Metoda computeBounds vrací ohraničující obdélník. Pro přesnou kontrolu použijte Region: vytvořte Region z Path a zavolejte contains(x, y). Pro složité obrysy může být Region těžký — použijte PathOp pro předběžné zjednodušení.

Lze Path animovat?

Ano, pomocí ValueAnimator s aktualizací bodů Path v každém snímku. Pro plynulou animaci tvaru použijte knihovnu AnimatedVectorDrawable — podporuje animaci mezi dvěma stavy Path s interpolací Bézierových křivek.

Jaká je maximální velikost Path?

Neexistuje přísné omezení, ale Path ukládá všechny body v paměti. Pro obrysy s více než 10 000 segmenty výkon kreslení klesá. Pro složitou grafiku rozdělte obrys na několik Path a použijte Hardware Accelerator přes View.isHardwareAccelerated.

Čím se liší Path od Shape v Androidu?

Path — programová třída pro vytváření libovolných obrysů v kódu. Shape (GradientDrawable) — XML zdroj pro jednoduché tvary s omezenými možnostmi. Path je flexibilnější a vhodný pro dynamickou grafiku, Shape je pohodlnější pro statická pozadí.

Shrnutí

  • Path — vektorový obrys pro popis libovolných geometrických tvarů v Androidu.
  • moveTo nastaví počáteční bod, lineTo kreslí přímky, quadTo a cubicTo — Bézierovy křivky.
  • addCircle, addRect, addOval a addRoundRect přidávají hotové tvary.
  • close uzavírá obrys, spojuje poslední a první bod.
  • Path.Op poskytuje booleovské operace: UNION, INTERSECT, DIFFERENCE, XOR.
  • Vytvořte Path jednou a opakovaně jej používejte pro úsporu CPU zdrojů.
  • Použijte PathMeasure pro animaci podél obrysu a posouzení délky cesty.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také