Path — ixtiyoriy shakldagi vektor konturlarini yaratish va saqlash uchun android.graphics sinfi. U Canvas ko‘rinadigan piksellarga aylantiradigan nuqtalar, chiziqlar va egri chiziqlarning geometrik ketma-ketligini tavsiflaydi. Path to‘g‘ri segmentlar, kvadratik va kubik Bezier egri chiziqlari, yoylar va yopiq shakllarni qo‘llab-quvvatlaydi. Google Developers, 2026 ma‘lumotiga ko‘ra, Path nostandart grafika qurish uchun maxsus View-larning 78 foizida ishlatiladi.
Asosiy fikrlar
Path — android.graphics paketidan olingan sinf, yo‘l segmentlari ketma-ketligini ifodalaydi: to‘g‘ri chiziqlar, kvadratik va kubik Bezier egri chiziqlari, doira va ellips yoylari. Rastr tasvirlardan farqli o‘laroq, Path faqat konturning matematik tavsifini saqlaydi, bu uni sifatni yo‘qotmasdan masshtablash imkonini beradi. Xotirada Path ob‘yektining hajmi segmentlar soniga mutanosib, ekran o‘lchamiga emas.
Path Canvas va Paint bilan chambarchas bog‘liq holda ishlaydi. Canvas.drawPath(path, paint) tayyor konturni qabul qiladi va uni Paint uslublariga muvofiq ko‘rsatadi. Bu bo‘linish bir marta murakkab kontur qurish va uni turli uslublar bilan — rang, chiziq qalinligi yoki gradient bilan qayta-qayta chizish imkonini beradi. Google I/O 2023 ma‘lumotiga ko‘ra, Path-dan qayta foydalanish maxsus View-larni chizish vaqtini 25–40 foizga kamaytiradi.
Har bir Path nuqtalar va segment turlarining ketma-ketligidan iborat. Nuqtalar Canvas koordinata tizimida aniqlanadi, bu yerda X o‘qi o‘ngga, Y o‘qi esa pastga yo‘nalgan. Konturning boshlang‘ich nuqtasi moveTo metodi bilan o‘rnatiladi, shundan so‘ng har bir keyingi segment oldingi nuqtaga nisbatan qo‘shiladi. Barcha qurish operatsiyalari protsessorda bajariladi va chizish vaqtigacha GPU talab qilmaydi.
moveTo metodi qalamni chiziq chizmasdan ko‘rsatilgan nuqtaga olib boradi. U keyingi segment uchun boshlang‘ich pozitsiyani o‘rnatadi. moveTo bo‘lmasa, Pathning boshlang‘ich nuqtasi standart (0, 0) da bo‘ladi. Har bir yangi uzluksiz kontur uchun alohida moveTo talab qilinadi — bu bitta Pathda bir nechta mustaqil chiziqlarni chizish uchun standart yondashuvdir.
lineTo qalamning joriy pozitsiyasidan ko‘rsatilgan nuqtagacha to‘g‘ri segment qo‘shadi. lineTo chaqirilgandan so‘ng, joriy pozitsiya segmentning oxirgi nuqtasiga o‘tadi. lineTo chaqiruvlari ketma-ketligi siniq chiziq — polichiziq hosil qiladi. Konturni yopish uchun close metodi ishlatiladi, u oxirgi nuqtadan oxirgi moveTo ning boshlang‘ich nuqtasiga to‘g‘ri chiziq chizadi.
rLineTo va rMoveTo — metodlarning nisbiy versiyalari. Ular mutlaq koordinatalarni emas, balki joriy pozitsiyadan dx va dy siljishlarini qabul qiladi. rLineTo takrorlanuvchi qadamlar bilan shakllarni, masalan, panjara va to‘rlarni qurish uchun qulaydir. Nisbiy metodlar butun kontur siljiganda mutlaq koordinatalarni qayta hisoblashni talab qilmaydi.
val path = Path().apply {
moveTo(100f, 100f) // boshlang‘ich nuqta A
lineTo(300f, 100f) // A → B
lineTo(200f, 250f) // B → C
close() // C → A (yopish)
}
quadTo bitta boshqaruv nuqtasi bilan kvadratik Bezier egri chizig‘ini qo‘shadi. Kvadratik egri chiziq uch nuqta bilan belgilanadi: boshlang‘ich (joriy pozitsiya), boshqaruv (egilishni belgilaydi) va oxirgi. Boshqaruv nuqtasi egri chiziq ustida yotmaydi, lekin boshlang‘ich va oxirgi nuqtalardagi urinmalarning yo‘nalishini belgilaydi. Bu egri chiziq turi oddiy yumaloqlashtirishlar va silliq o‘tishlar uchun ishlatiladi.
cubicTo ikkita boshqaruv nuqtasi bilan kubik Bezier egri chizig‘ini qo‘shadi, bu egilishlarni shakllantirishda ko‘proq moslashuvchanlik beradi. To‘rt nuqta egri chiziqni belgilaydi: boshlang‘ich, ikkita boshqaruv va oxirgi. Kubik egri chiziqlar murakkab konturlarni, masalan, shriftlardagi harf konturlarini, funksiya grafiklarini va organik shakllarni qurish uchun ishlatiladi.
Qulaylik uchun rQuadTo va rCubicTo nisbiy versiyalari mavjud bo‘lib, ular joriy pozitsiyadan siljishlarni qabul qiladi. Bu, ayniqsa, nisbiy o‘sishlarga asoslangan egri chiziqlarni dasturiy generatsiya qilishda, masalan, to‘lqinlar yoki sinusoidlarni chizishda foydalidir. Bezier egri chiziqlarining aniqligi faqat protsessordagi hisoblash aniqligiga bog‘liq — chizish paytida ular subpiksel o‘lchamlari bilan rastrlashtiriladi.
| Metod | Egri chiziq turi | Boshqaruv nuqtalari | Qo‘llanish |
|---|---|---|---|
| quadTo | Kvadratik Bezier | 1 | Yumaloqlashtirishlar, oddiy yoylar |
| cubicTo | Kubik Bezier | 2 | Shriftlar, murakkab konturlar |
| rQuadTo | Nisbiy kvadratik | 1 | To‘lqinlar, sinusoidlar |
| rCubicTo | Nisbiy kubik | 2 | Organik shakllar |
addCircle Path-ga yangi kontur sifatida doira qo‘shadi. Parametrlar: markaz koordinatalari, radius va aylanish yo‘nalishi (CW — soat yo‘nalishi bo‘yicha, CCW — teskari). Chaqiruvdan so‘ng qalamning joriy pozitsiyasi o‘zgarmaydi — doira oldingi segmentlar bilan bog‘liq bo‘lmagan mustaqil yopiq kontur sifatida qo‘shiladi. Bu tayyor shakllarni bitta Path-da ixtiyoriy chiziqlar bilan birlashtirish imkonini beradi.
addRect yuqori chap va pastki o‘ng burchaklarning koordinatalari bilan belgilangan to‘rtburchak qo‘shadi. addOval belgilangan to‘rtburchakka ichki chizilgan ellips qo‘shadi. Ikkala metod Direction parametrini qo‘llab-quvvatlaydi. Yumaloq burchaklar uchun barcha burchaklar uchun yumaloqlashtirish radiuslarini yoki 8 radius qiymatidan iborat massivni (har bir burchakka ikkitadan) qabul qiladigan addRoundRect ishlatiladi.
arcTo doira yoki ellips yoyi qo‘shadi. Parametrlar: chegaralovchi to‘rtburchak, darajadagi boshlang‘ich burchak, ochilish burchagi va forceMoveTo bayrog‘i. forceMoveTo true bo‘lsa, yoydan oldin yoyning boshlang‘ich nuqtasiga moveTo bajariladi, aks holda yoy joriy pozitsiyaga to‘g‘ri chiziq bilan bog‘lanadi. Yoylar doiraviy diagrammalar va taraqqiyot ko‘rsatkichlarida faol qo‘llaniladi.
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 boshlab mavjud bo‘lgan ikki kontur ustida mantiqiy operatsiyalar mexanizmi. DIFFERENCE, INTERSECT, UNION, XOR va REVERSE_DIFFERENCE operatsiyalari qo‘llab-quvvatlanadi. Natija tanlangan operatsiya qo‘llanilgandan so‘ng olingan geometriyani o‘z ichiga olgan yangi Path hisoblanadi. Bu kesishish nuqtalarini qo‘lda hisoblamasdan oddiy asosiy shakllardan murakkab shakllar yaratish imkonini beradi.
UNION ikki konturni bittaga birlashtiradi. INTERSECT faqat ikkala konturga tegishli sohani qoldiradi. DIFFERENCE ikkinchi konturni birinchidan ayiradi — shakllarda "teshiklar" kesish uchun qulay. XOR faqat konturlardan biriga tegishli sohalarni qoldiradi. REVERSE_DIFFERENCE birinchi konturni ikkinchidan ayiradi.
op metodi ikkita Path va operatsiyani qabul qiladi, natija bo‘sh bo‘lmasa true qaytaradi. Operatsiyaning hisoblash murakkabligi ikkala konturdagi segmentlar soniga bog‘liq. Oddiy shakllar (100 segmentdan kam) uchun operatsiya submillisekundlarda bajariladi. Path Op tasvir muharrirlarida, dizayn vositalarida va murakkab UI elementlarini qurishda faol qo‘llaniladi.
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 teshikli doira
Path yordamida maxsus "yurak" belgisini yaratishni ko‘rib chiqamiz. Shakl simmetrik siluet hosil qiluvchi ikki yoy va ikki to‘g‘ri chiziqdan quriladi. Kod silliq kontur olish uchun moveTo, cubicTo va close kombinatsiyasini namoyish etadi.
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 egri chiziqlar cubicTo yurakning har bir yarmining shaklini aniq boshqarish imkonini beradi. Birinchi egri chiziq o‘ng yuqori yoyni, ikkinchisi — chapni, uchinchi va to‘rtinchisi — pastki qismni hosil qiladi. close metodi konturni pastki nuqtada yopadi. Bu yondashuv ilovalarda maxsus belgilar, logotiplar va dekorativ elementlarni yaratish uchun qo‘llaniladi.
Shaklni sinash uchun vaqtincha Paint.Style.STROKE bilan chizishni faollashtirish mumkin — bu barcha yordamchi chiziqlar va egri chiziqlarni ko‘rsatadi. Kontur notekis ko‘rinsa, egri chiziqlardagi nuqtalar sonini oshiring yoki segmentlarning uzunligi va bir xilligini baholash uchun PathMeasure dan foydalaning. PathMeasure kontur bo‘ylab harakat animatsiyasi uchun zarur bo‘lgan aniq yo‘l ko‘rsatkichlarini ta‘minlaydi.
Tez-tez so‘raladigan savollar
addPath shunchaki bir konturni ikkinchisiga geometriyani o‘zgartirmasdan qo‘shadi. op mantiqiy operatsiyani (birlashtirish, kesishish, ayirish) bajaradi va geometriyani o‘zgartiradi. Oddiy birlashtirish uchun addPath, murakkab shakllar uchun op dan foydalaning.
computeBounds metodi chegaralovchi to‘rtburchakni qaytaradi. Aniq tekshirish uchun Region dan foydalaning: Path dan Region yarating va contains(x, y) ni chaqiring. Murakkab konturlar uchun Region og‘ir bo‘lishi mumkin — oldindan soddalashtirish uchun PathOp ni qo‘llang.
Ha, har bir kadrda Path nuqtalarini yangilovchi ValueAnimator orqali. Shaklning silliq animatsiyasi uchun AnimatedVectorDrawable kutubxonasidan foydalaning — u Bezier egri chiziqlarining interpolyatsiyasi bilan ikki Path holati o‘rtasida animatsiyani qo‘llab-quvvatlaydi.
Qattiq cheklov yo‘q, lekin Path barcha nuqtalarni xotirada saqlaydi. 10 000 segmentdan ko‘p bo‘lgan konturlar uchun chizish samaradorligi pasayadi. Murakkab grafikalar uchun konturni bir necha Path-ga bo‘ling va View.isHardwareAccelerated orqali Hardware Accelerator dan foydalaning.
Path — kodda ixtiyoriy konturlarni qurish uchun dasturiy sinf. Shape (GradientDrawable) — cheklangan imkoniyatlarga ega oddiy shakllar uchun XML resursi. Path yanada moslashuvchan va dinamik grafika uchun mos, Shape statik fonlar uchun qulayroq.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.