Path — ixtiyari formalı vektor konturları yaratmaq və saxlamaq üçün android.graphics sinfi. O, Canvas-ın görünən piksellərə çevirdiyi nöqtələrin, xətlərin və əyrilərin həndəsi ardıcıllığını təsvir edir. Path düz xətt seqmentlərini, kvadratik və kubik Bezier əyrilərini, qövsləri və qapalı fiqurları dəstəkləyir. Google Developers, 2026 məlumatına görə, Path qeyri-adi qrafika qurmaq üçün xüsusi View-lərin 78%-də istifadə olunur.
Əsas məqamlar
Path — android.graphics paketindən olan sinif, yol seqmentlərinin ardıcıllığını təmsil edir: düz xətlər, kvadratik və kubik Bezier əyriləri, dairə və ellips qövsləri. Rastr təsvirlərdən fərqli olaraq, Path yalnız konturun riyazi təsvirini saxlayır, bu da onu keyfiyyət itkisi olmadan miqyaslamağa imkan verir. Yaddaşda Path obyektinin ölçüsü seqmentlərin sayına mütənasibdir, ekranın təsvir ölçüsünə deyil.
Path Canvas və Paint ilə sıx əlaqədə işləyir. Canvas.drawPath(path, paint) hazır konturu qəbul edir və onu Paint üslublarına uyğun göstərir. Bu bölgü bir dəfə mürəkkəb kontur qurmağa və onu müxtəlif üslublarla — rəng, xətt qalınlığı və ya gradient ilə dəfələrlə çəkməyə imkan verir. Google I/O 2023 məlumatına görə, Path-in təkrar istifadəsi xüsusi View-lərin çəkilmə müddətini 25–40% azaldır.
Hər bir Path nöqtələr və seqment növlərinin ardıcıllığından ibarətdir. Nöqtələr Canvas koordinat sistemində müəyyən edilir, burada X oxu sağa, Y oxu isə aşağıya yönəlmişdir. Konturun başlanğıc nöqtəsi moveTo metodu ilə təyin edilir, bundan sonra hər bir sonrakı seqment əvvəlki nöqtəyə nisbətən əlavə olunur. Bütün qurma əməliyyatları CPU-da yerinə yetirilir və çəkilmə anına qədər GPU tələb etmir.
moveTo metodu qələmi xətt çəkmədən göstərilən nöqtəyə aparır. O, növbəti seqment üçün başlanğıc mövqeyi təyin edir. moveTo olmadan Path-in başlanğıc nöqtəsi standart olaraq (0, 0)-dadır. Hər bir yeni davamlı kontur üçün ayrıca moveTo tələb olunur — bu, bir Path-də bir neçə müstəqil xətt çəkmək üçün standart yanaşmadır.
lineTo qələmin cari mövqeyindən göstərilən nöqtəyə qədər düz seqment əlavə edir. lineTo çağırışından sonra cari mövqe seqmentin son nöqtəsinə keçir. lineTo çağırışlarının ardıcıllığı sınıq xətt — polixətt yaradır. Konturu bağlamaq üçün close metodu istifadə olunur, o, son nöqtədən son moveTo-nun başlanğıc nöqtəsinə düz xətt çəkir.
rLineTo və rMoveTo — metodların nisbi versiyaları. Onlar mütləq koordinatları deyil, cari mövqedən dx və dy yerdəyişmələrini qəbul edirlər. rLineTo təkrarlanan addımlarla fiqurların, məsələn, şəbəkə və torların qurulması üçün əlverişlidir. Nisbi metodlar bütün kontur yerdəyişdikdə mütləq koordinatların yenidən hesablanmasını tələb etmir.
val path = Path().apply {
moveTo(100f, 100f) // başlanğıc nöqtəsi A
lineTo(300f, 100f) // A → B
lineTo(200f, 250f) // B → C
close() // C → A (bağlanma)
}
quadTo bir idarəetmə nöqtəsi ilə kvadratik Bezier əyrisi əlavə edir. Kvadratik əyri üç nöqtə ilə müəyyən edilir: başlanğıc (cari mövqe), idarəetmə (əyilməni təyin edir) və son. İdarəetmə nöqtəsi əyri üzərində deyil, lakin başlanğıc və son nöqtələrdə toxunanların istiqamətini təyin edir. Bu əyri növü sadə yuvarlaqlaşdırmalar və hamar keçidlər üçün istifadə olunur.
cubicTo iki idarəetmə nöqtəsi ilə kubik Bezier əyrisi əlavə edir, bu da əyilmələrin formalaşdırılmasında daha çox elastiklik verir. Dörd nöqtə əyrini təyin edir: başlanğıc, iki idarəetmə və son. Kubik əyrilər mürəkkəb konturların, məsələn, şriftlərdəki hərf konturlarının, funksiya qrafiklərinin və üzvi formaların qurulması üçün istifadə olunur.
Rahatlıq üçün rQuadTo və rCubicTo nisbi versiyaları mövcuddur, onlar cari mövqedən yerdəyişmələri qəbul edirlər. Bu, xüsusilə nisbi artımlara əsaslanan əyrilərin proqram yaradılmasında, məsələn, dalğaların və ya sinusoidlərin çəkilməsində faydalıdır. Bezier əyrilərinin dəqiqliyi yalnız CPU-da hesablamaların dəqiqliyindən asılıdır — çəkilmə zamanı onlar subpiksel ayırdetmə ilə rastrlaşdırılır.
| Metod | Əyri növü | İdarəetmə nöqtələri | Tətbiq |
|---|---|---|---|
| quadTo | Kvadratik Bezier | 1 | Yuvarlaqlaşdırmalar, sadə qövslər |
| cubicTo | Kubik Bezier | 2 | Şriftlər, mürəkkəb konturlar |
| rQuadTo | Nisbi kvadratik | 1 | Dalğalar, sinusoidlər |
| rCubicTo | Nisbi kubik | 2 | Üzvi formalar |
addCircle Path-ə yeni kontur olaraq dairə əlavə edir. Parametrlər: mərkəzin koordinatları, radius və dolanma istiqaməti (CW — saat əqrəbi istiqamətində, CCW — əksinə). Çağırışdan sonra qələmin cari mövqeyi dəyişmir — dairə əvvəlki seqmentlərlə əlaqəsi olmayan müstəqil qapalı kontur kimi əlavə olunur. Bu, hazır fiqurları bir Path-də ixtiyari xətlərlə birləşdirməyə imkan verir.
addRect sol yuxarı və sağ aşağı künclərin koordinatları ilə təyin olunan düzbucaqlı əlavə edir. addOval göstərilən düzbucaqlıya daxil edilmiş ellips əlavə edir. Hər iki metod Direction parametrini dəstəkləyir. Yuvarlaq künclər üçün bütün künclər üçün yuvarlaqlaşdırma radiuslarını və ya 8 radius dəyərindən ibarət massivi (hər küncə iki) qəbul edən addRoundRect istifadə olunur.
arcTo dairə və ya ellips qövsü əlavə edir. Parametrlər: məhdudlaşdırıcı düzbucaqlı, dərəcə ilə başlanğıc bucaq, açılma bucağı və forceMoveTo bayrağı. forceMoveTo true olarsa, qövsdən əvvəl qövsün başlanğıc nöqtəsinə moveTo yerinə yetirilir, əks halda qövs cari mövqeyə düz xəttlə birləşdirilir. Qövslər dairəvi diaqramlarda və gedişat göstəricilərində fəal şəkildə istifadə olunur.
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 — API 19-dan etibarən mövcud olan iki kontur üzərində boolean əməliyyatları mexanizmi. DIFFERENCE, INTERSECT, UNION, XOR və REVERSE_DIFFERENCE əməliyyatları dəstəklənir. Nəticə seçilmiş əməliyyat tətbiq edildikdən sonra əldə edilən həndəsəni ehtiva edən yeni Path-dir. Bu, kəsişmə nöqtələrini əl ilə hesablamadan sadə əsas fiqurlardan mürəkkəb formalar yaratmağa imkan verir.
UNION iki konturu birinə birləşdirir. INTERSECT yalnız hər iki kontura aid olan sahəni saxlayır. DIFFERENCE ikinci konturu birincidən çıxarır — fiqurlarda "deşiklər" kəsmək üçün əlverişlidir. XOR yalnız konturlardan birinə aid olan sahələri saxlayır. REVERSE_DIFFERENCE birinci konturu ikincidən çıxarır.
op metodu iki Path və əməliyyatı qəbul edir, nəticə boş deyilsə true qaytarır. Əməliyyatın hesablama mürəkkəbliyi hər iki konturdakı seqmentlərin sayından asılıdır. Sadə fiqurlar (100 seqmentdən az) üçün əməliyyat submillisaniyələr ərzində yerinə yetirilir. Path Op təsvir redaktorlarında, dizayn alətlərində və mürəkkəb UI elementlərinin qurulmasında fəal şəkildə istifadə olunur.
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) // kvadrat deşikli dairə
Path istifadə edərək xüsusi "ürək" ikonasının yaradılmasını nəzərdən keçirək. Fiqur simmetrik siluet yaradan iki qövs və iki düz xəttdən qurulur. Kod hamar kontur əldə etmək üçün moveTo, cubicTo və close kombinasiyasını nümayiş etdirir.
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
}
}
Kubik əyrilər cubicTo ürəyin hər yarısının formasını dəqiq idarə etməyə imkan verir. Birinci əyri sağ yuxarı qövsü, ikincisi — solunu, üçüncü və dördüncüsü — aşağı hissəni formalaşdırır. close metodu konturu aşağı nöqtədə bağlayır. Bu yanaşma tətbiqlərdə xüsusi ikonalar, loqolar və dekorativ elementlər yaratmaq üçün istifadə olunur.
Formanı sınamaq üçün müvəqqəti olaraq Paint.Style.STROKE ilə çəkməyi aktivləşdirmək olar — bu, bütün köməkçi xətləri və əyriləri göstərəcək. Kontur qeyri-bərabər görünürsə, əyrilərdəki nöqtələrin sayını artırın və ya seqmentlərin uzunluğunu və bərabərliyini qiymətləndirmək üçün PathMeasure istifadə edin. PathMeasure kontur boyunca hərəkət animasiyası üçün zəruri olan dəqiq yol metrikalarını təmin edir.
Tez-tez verilən suallar
addPath sadəcə bir konturu digərinə həndəsəni dəyişmədən əlavə edir. op boolean əməliyyatı (birləşmə, kəsişmə, çıxma) yerinə yetirir və həndəsəni dəyişir. Sadə birləşmə üçün addPath, mürəkkəb formalar üçün op istifadə edin.
computeBounds metodu məhdudlaşdırıcı düzbucaqlı qaytarır. Dəqiq yoxlama üçün Region istifadə edin: Path-dən Region yaradın və contains(x, y) çağırın. Mürəkkəb konturlar üçün Region ağır ola bilər — əvvəlcədən sadələşdirmək üçün PathOp tətbiq edin.
Bəli, hər kadrda Path nöqtələrini yeniləyən ValueAnimator vasitəsilə. Formanın hamar animasiyası üçün AnimatedVectorDrawable kitabxanasından istifadə edin — o, Bezier əyrilərinin interpolyasiyası ilə iki Path vəziyyəti arasında animasiyanı dəstəkləyir.
Sərt məhdudiyyət yoxdur, lakin Path bütün nöqtələri yaddaşda saxlayır. 10 000 seqmentdən çox olan konturlar üçün çəkmə performansı azalır. Mürəkkəb qrafika üçün konturu bir neçə Path-ə bölün və View.isHardwareAccelerated vasitəsilə Hardware Accelerator istifadə edin.
Path — kodda ixtiyari konturlar qurmaq üçün proqram sinfi. Shape (GradientDrawable) — məhdud imkanları olan sadə formalar üçün XML resursu. Path daha çevikdir və dinamik qrafika üçün uyğundur, Shape statik fonlar üçün daha əlverişlidir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun