Android-da Paint: nima, sozlash metodlari va qanday ishlaydi

Muallif: IT Sectr Nashr etilgan: 2026-07-21 O'qish vaqti: 9 daq

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 — Canvas uchun barcha vizual chizish sozlamalarini o'z ichiga olgan stilizatsiya obyekti.
  • setColor va setAlpha chiziqlar va to'ldirishlarning rangi va shaffofligini boshqaradi.
  • Style kontur, to'ldirish yoki ikkala variant bir vaqtda chizilishini belgilaydi.
  • Shader gradientlar, bitmap teksturalari va kompozitlarni qo'llash imkonini beradi.
  • Typeface barcha Android tizim shriftlarini qo'llab-quvvatlagan holda matn uchun shrift o'rnatadi.

Android-da Paint nima?

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.

Paint-da rang va shaffoflik

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.

Alfa kanalini boshqarish

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.

Rang tuzatish uchun ColorFilter

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.

MetodTavsifUnumdorlik
setColorARGB rang o'rnatadiO(1) — qo'shimcha yuk yo'q
setAlphaShaffoflikni sozlaydi (0-255)O(1) — yengil operatsiya
setColorFilterRang tuzatishni qo'llaydiO(n) — tez-tez chaqirishlarda FPS ga ta'sir qiladi

Chiziq uslubi va qalinligi

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.

Chiziq qalinligi va ulanishlar

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.

Chiziq naqshlari (DashPathEffect)

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.

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

Shriftlar va matn chizish

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.

Matn o'lchami va qatorlararo masofa

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.

Tag chiziq va ustidan chizish

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.

MetodMaqsadO'lchov birliklari
setTextSizeShrift o'lchamipx (piksellar)
setTextAlignGorizontal tekislashLEFT, CENTER, RIGHT
setTypefaceShriftTypeface object
setUnderlineTextTag chiziqBoolean

Gradientlar va ilg'or effektlar

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.

Chiziqli va radial gradientlar

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.

Xiralik va soyalar (BlurMaskFilter)

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.

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

Paint-ni Canvas bilan ishlatish misoli

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.

kotlin
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

Paint Canvas dan qanday farq qiladi?

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.

Turli shakllar uchun bitta Paint ishlatish mumkinmi?

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.

Paint-ni standart sozlamalarga qanday qaytarish mumkin?

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 onDraw da unumdorlikka ta'sir qiladimi?

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.

Paint-da matnning shaffof fonini qanday qilish mumkin?

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

  • Paint — Canvas-da grafikani stilizatsiya qilish uchun konfiguratsiya sinfi, rang, qalinlik, shrift va effektlarni belgilaydi.
  • setColor va setAlpha minimal qo'shimcha yuk bilan rang va shaffoflikni boshqaradi.
  • Style (FILL, STROKE, FILL_AND_STROKE) kontur, to'ldirish yoki ikkala variant chizilishini belgilaydi.
  • Typeface va setTextSize Downloadable Fonts qo'llab-quvvatlash va ekran moslashuvi bilan shriftlar uchun javobgardir.
  • Shader — LinearGradient, RadialGradient, BitmapShader — gradientlar va teksturalar qo'shadi.
  • GC muzlashlarini oldini olish uchun Paint-ni onDraw da emas, View konstruktorida yarating.
  • Paint-ni element turlari bo'yicha ajrating: to'ldirish, kontur, matn — moslashuvchan sozlash va kod o'qilishi uchun.

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.

Loyihani muhokama qilish

Shuningdek o'qing