Paint — Android Canvas-da grafikani stilizatsiya qilish uchun asosiy sinf. U foydalanuvchi interfeysidagi barcha chizish operatsiyalari uchun rang, chiziq qalinligi, to'ldirish uslubi, xiralik effektlari va shriftlarni belgilaydi. Paint bo'lmasa, Canvas ko'rsatilgan elementlarga vizual atributlarni qo'llay olmaydi. Google Developers, 2026 ma'lumotlariga ko'ra, Paint gradientlar va teksturalarni o'z ichiga olgan holda 42 tagacha uslub parametrlarini qo'llab-quvvatlaydi.
Asosiy fikrlar
Paint — android.graphics paketidan Canvas-da chizish operatsiyalari uchun barcha uslub sozlamalarini saqlaydigan sinf. U piksellarning o'zini o'z ichiga olmaydi, balki chiziqlar, shakllar va matn qanday ko'rinishini belgilaydi. Canvas metodlarining har bir chaqiruvi — drawCircle, drawLine, drawText — vizual ko'rinishni talqin qilish uchun Paint-dan foydalanadi.
Paint konfiguratsiya obyekti printsipi asosida ishlaydi. Siz namuna yaratasiz, parametrlarni bir marta o'rnatasiz va uni ko'plab operatsiyalar uchun qayta ishlatasiz. Bu chizish siklidagi ajratmalar sonini kamaytiradi va har bir kadrda yangi obyekt yaratish bilan solishtirganda unumdorlikni 30% gacha oshiradi. Google I/O 2024 ma'lumotlariga ko'ra, Paint optimallashtirish maxsus grafikada 60 FPS ga erishish uchun asosiy amaliyotlardan biridir.
Paint-ning barcha sozlamalari bir necha toifalarga bo'linadi: rang va shaffoflik, kontur va to'ldirish uslubi, matn va shriftlar bilan ishlash, xiralik va maskalash effektlari. Har bir toifa alohida setter metodlari bilan boshqariladi, ular istalgan kombinatsiyada birlashtirilishi mumkin. Bu Paint API ni moslashuvchan qiladi, lekin parametrlarning o'zaro ta'sirini tushunishni talab qiladi — masalan, Style Shader konturga yoki to'ldirishga qo'llanishiga ta'sir qiladi.
setColor — barcha keyingi chizish operatsiyalari uchun rang o'rnatishning asosiy metodi. Rang ARGB formatida (32-bitli butun son) uzatiladi, bunda yuqori 8 bit alfa kanali, qolganlari esa qizil, yashil va ko'k kanallardir. 0xFF0000FF qiymati shaffof bo'lmagan ko'k rangni o'rnatadi.
setAlpha metodi 0 (to'liq shaffof) dan 255 (to'liq shaffof emas) oralig'ida shaffoflikni mustaqil ravishda sozlash imkonini beradi. setColor-da alfa ko'rsatishdan farqli o'laroq, bu metod allaqachon o'rnatilgan rang tusiga ta'sir qilmaydi — u faqat umumiy shaffoflikni modulyatsiya qiladi. Bu rangni o'zgartirmasdan elementlarning paydo bo'lishi va yo'qolishi animatsiyalari uchun qulaydir.
ColorFilter — chizishdan oldin har bir piksel rangini o'zgartirish mexanizmi. Uch rejim qo'llab-quvvatlanadi: kanallarni ko'paytirish va qo'shish uchun LightingColorFilter, aralashtirish rejimlari bilan qoplash uchun PorterDuffColorFilter va to'liq matritsali o'zgartirish uchun ColorMatrixColorFilter. ColorFilter Shader-dan keyin, lekin Canvas-ga chiqishdan oldin qo'llaniladi.
Aksariyat vazifalar uchun standart setColor yoki setAlpha yetarli. ColorFilter asosan rangsizlantirish, sepya yoki inversiya effektlari uchun ishlatiladi. ColorFilter qo'llash GPU yukini oshiradi, shuning uchun Google uni onDraw tsiklik chaqiruvlarida ishlatishni minimallashtirishni tavsiya qiladi.
| Metod | Tavsif | Unumdorlik |
|---|---|---|
| setColor | ARGB rang o'rnatadi | O(1) — qo'shimcha yuk yo'q |
| setAlpha | Shaffoflikni sozlaydi (0-255) | O(1) — yengil operatsiya |
| setColorFilter | Rang tuzatishni qo'llaydi | O(n) — tez-tez chaqirishlarda FPS ga ta'sir qiladi |
setStyle metodi Paint.Style ning uchta qiymatidan birini qabul qiladi: FILL (to'ldirish), STROKE (kontur) yoki FILL_AND_STROKE (bir vaqtda). Uslub tanloviga qarab, shakl siluet, skelet yoki ichki to'ldirish bilan kontur sifatida ko'rsatiladi. Paint standart sifatida FILL uslubi bilan yaratiladi.
setStrokeWidth STROKE rejimi uchun chiziq qalinligini piksellarda o'rnatadi. Dumaloq shakllar va yumaloq burchaklar uchun setStrokeCap (Cap.ROUND, BUTT, SQUARE) va setStrokeJoin (Join.MITER, ROUND, BEVEL) ishlatiladi. Bu parametrlar maxsus View-larda grafiklar, yo'llar va ramkalarning ko'rinishiga muhim ta'sir ko'rsatadi.
1 pikseldan kam qalinlikda chiziq subpikselli aniqlik bilan chiziladi, lekin past zichlikdagi ekranlarda xira ko'rinishi mumkin. Android Retina displeylari uchun dp ni piksellarga aylantirish uchun TypedValue.applyDimension dan foydalaning. 2 dp qalinligi ko'pchilik qurilmalarda aniq ko'rinishni ta'minlaydi.
DashPathEffect nuqtali va chiziqli chiziqlar yaratadi. Konstruktor navbatdagi chiziqcha va bo'shliqlar uzunliklari massivi va boshlang'ich faza siljishini qabul qiladi. Masalan, [10, 5, 3, 5] massivi uzun chiziqcha, qisqa bo'shliq, qisqa chiziqcha va bo'shliq bilan chiziq yaratadi. Bu effekt grafik muharrirlar va annotatsiya vositalarida faol qo'llaniladi.
Uslublarni birlashtirish setPathEffect orqali amalga oshiriladi. CornerPathEffect, DashPathEffect va DiscretePathEffect ni birlashtirib, diagrammalar, izohlar va dekorativ elementlar uchun murakkab vizual chiziqlar yaratish mumkin. Har bir PathEffect CPU da hisoblanadi, shuning uchun ko'p sonli chiziqlar bilan animatsiyalarda effektni oldindan Bitmap-ga rasterlashtirish tavsiya etiladi.
val paint = Paint().apply {
setStyle(Paint.Style.STROKE)
setStrokeWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2f, resources.displayMetrics))
setPathEffect(DashPathEffect(floatArrayOf(10f, 5f, 3f, 5f), 0f))
}
Typeface — Paint-ning barcha matn operatsiyalari uchun shriftni belgilaydigan obyekt. Android tizim shriftlarini (Roboto, Noto Sans), assets resurslaridan maxsus shriftlarni va Downloadable Fonts API orqali yuklanadigan shriftlarni qo'llab-quvvatlaydi. Typeface setTypeface orqali Paint namunasida o'rnatiladi.
setTextSize metodi shrift o'lchamini piksellarda o'rnatadi. Turli ekranlarda to'g'ri ko'rsatish uchun TypedValue.applyDimension yordamida o'lchamni sp da ko'rsatish tavsiya etiladi. Qatorlararo masofa gorizontal cho'zish uchun setTextScaleX bilan sozlanadi va Canvas.drawText orqali MultiLine matnning ichki qo'llab-quvvatlashiga kiritilgan.
Matnni tekislash uchun LEFT, CENTER va RIGHT qiymatlari bilan setTextAlign ishlatiladi. CENTER da drawText ga uzatilgan x koordinatasi matnning markaz nuqtasiga aylanadi — bu ikonkalar ostidagi izohlar va shakllar ichidagi sarlavhalar uchun ayniqsa qulay. Aniq joylashtirish uchun matn kengligi va chegara to'rtburchagini qaytaruvchi measureText va getTextBounds metodlari qo'llaniladi.
setUnderlineText va setStrikeThruText mos ravishda tag chiziq va ustidan chizishni faollashtiradi. Bu parametrlar shrift darajasida ishlaydi va berilgan Paint bilan chizilgan barcha matnga qo'llaniladi. Bitta satrning turli qismlarini moslashuvchan formatlash uchun turli sozlamalar bilan alohida Paint obyektlaridan foydalaning yoki drawText chaqiruvlari orasida parametrlarni o'zgartiring.
| Metod | Maqsad | O'lchov birliklari |
|---|---|---|
| setTextSize | Shrift o'lchami | px (piksellar) |
| setTextAlign | Gorizontal tekislash | LEFT, CENTER, RIGHT |
| setTypeface | Shrift | Typeface object |
| setUnderlineText | Tag chiziq | Boolean |
Shader — shakllarni gradientlar, bitmap teksturalari va kompozitlar bilan to'ldirish uchun asosiy sinf. setShader metodi orqali quyi sinflardan istalganini tayinlash mumkin: LinearGradient, RadialGradient, SweepGradient, BitmapShader yoki ComposeShader. Shader setColor bilan o'rnatilgan rangni almashtiradi va barcha chizilgan elementlarga qo'llaniladi.
LinearGradient to'g'ri chiziq bo'ylab ikki yoki undan ortiq ranglar o'rtasida silliq o'tish yaratadi. Konstruktor boshlang'ich va tugash nuqtalarini, ranglar massivi va ularning pozitsiyalarini (kafel rejimi) qabul qiladi. Kafel rejimi gradientdan tashqaridagi xatti-harakatni belgilaydi: CLAMP (oxirgi rangni takrorlash), MIRROR (aks ettirish) yoki REPEAT (takrorlash). LinearGradient fon to'ldirishlari va progress barlari uchun faol qo'llaniladi.
RadialGradient markazdan chekkalarga aylana gradient yaratadi. Markaz koordinatalar bilan belgilanadi, radius rang o'tish zonasini aniqlaydi. Radial gradientning ko'rinishi nuqtali yorug'lik manbasidan yoritishni eslatadi — bu tugmalarning yorqinligi va faol elementlarning yoritilishini simulyatsiya qilish uchun tez-tez ishlatiladi.
BlurMaskFilter chizilgan elementlar atrofida xiralik effekti qo'shadi. Konstruktor xiralik radiusi va uslubni qabul qiladi: NORMAL (barcha yo'nalishlarda xiralik), INNER (faqat shakl ichida), OUTER (faqat tashqarida) va SOLID (shakl + tashqi xiralik). BlurMaskFilter Paint ning istalgan turlari bilan ishlaydi va soyalar va yorqinlik effektlarini yaratish uchun tez-tez ishlatiladi.
val paint = Paint().apply {
setShader(LinearGradient(
0f, 0f, width, height,
intArrayOf(Color.RED, Color.BLUE),
null,
Shader.TileMode.CLAMP
))
setMaskFilter(BlurMaskFilter(20f, BlurMaskFilter.Blur.NORMAL))
}
Gradient to'ldirish va matn izohi bilan doira chizadigan maxsus View ning to'liq misolini ko'rib chiqaylik. Paint va Canvas kombinatsiyasi minimal kod bilan murakkab grafika yaratish imkonini beradi. Barcha sozlamalar unumdorlik uchun inisializatsiyaga chiqarilgan.
class GradientCircleView@JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : View(context, attrs) {
private val fillPaint = Paint().apply {
setShader(RadialGradient(
0f, 0f, 200f,
intArrayOf(Color.CYAN, Color.DKGRAY),
null, Shader.TileMode.CLAMP
))
}
private val textPaint = Paint().apply {
setColor(Color.WHITE)
setTextSize(TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, 24f, resources.displayMetrics
))
setTextAlign(Paint.Align.CENTER)
setMaskFilter(BlurMaskFilter(5f, BlurMaskFilter.Blur.NORMAL))
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
canvas.drawCircle(200f, 200f, 150f, fillPaint)
canvas.drawText("Gradient", 200f, 210f, textPaint)
}
}
Kodda ikkita alohida Paint obyekti ishlatiladi: biri doirani radial gradient bilan to'ldirish uchun, ikkinchisi BlurMaskFilter orqali soya bilan matn uchun. Bunday ajratish parametrlarni mustaqil sozlash va turli element turlarini chizish o'rtasida Paint holatini tiklashning oldini olish imkonini beradi. Unumdorlikni oshirish uchun ikkala Paint onDraw da emas, konstruktorda yaratiladi.
Turli piksel zichligidagi qurilmalarda masshtablashda o'lcham qiymatlari TypedValue.applyDimension orqali qayta hisoblanishi kerak. Busiz matn va gradient mdpi va xxxhdpi ekranlarda turlicha ko'rinadi. Misolda matn o'lchami sp da o'rnatilgan, bu foydalanuvchining tizim shrift o'lchami sozlamalariga avtomatik moslashadi.
Tez-tez beriladigan savollar
Canvas chizish operatsiyalarini (drawCircle, drawLine) bajaradi, Paint esa uslub — rang, qalinlik, shriftni belgilaydi. Canvas uslub sozlamalarini o'z ichiga olmaydi, shuning uchun Paint bo'lmasa, hech qanday chizish operatsiyasi vizual effektga ega emas.
Ha, bitta Paint obyekti ko'plab shakllar uchun qayta ishlatilishi mumkin. Turli element turlari (fon, matn, kontur) uchun alohida Paint yaratish tavsiya etiladi, lekin har bir shakl uchun emas — bu axlat yig'uvchining yukini kamaytiradi.
reset metodi Paint-ni yangi namunaga ekvivalent holatga qaytaradi. Shu bilan birga flag bilan set ishlatish mumkin, lekin reset kod o'qilishi uchun afzal. Qaytarishdan so'ng barcha uslub parametrlari standart qiymatlarni oladi.
Paint-ni onDraw ichida yaratish har bir kadrda ajratma hosil qiladi, bu GC muzlashiga olib keladi. Barcha Paint obyektlari View konstruktorida yaratilishi kerak. onDraw da setterlar orqali parametrlarni o'zgartirish xavfsiz va yangi obyektlar yaratmaydi.
Android-da matn har doim shaffof fon bilan chiziladi. drawText metodi faqat gliflarni ko'rsatadi, fon to'rtburchagisiz. Agar matn ostida fon kerak bo'lsa, avval alohida Paint bilan drawRoundRect orqali to'rtburchak chizing, so'ngra matnni chizing.
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.