Paint — Android Canvas-da qrafikanın stilizasiyası üçün əsas sinif. O, istifadəçi interfeysindəki bütün rəsm əməliyyatları üçün rəng, xətt qalınlığı, doldurma stili, bulanıqlıq effektləri və şriftləri müəyyən edir. Paint olmadan Canvas göstərilən elementlərə vizual atributları tətbiq edə bilməz. Google Developers, 2026-ya görə, Paint qradientlər və teksturalar da daxil olmaqla 42 stil parametrini dəstəkləyir.
Əsas məqamlar
Paint — android.graphics paketindən olan, Canvas-da rəsm əməliyyatları üçün bütün stil parametrlərini saxlayan sinif. O, piksellərin özünü ehtiva etmir, lakin xətlərin, fiqurların və mətnin necə görünəcəyini müəyyən edir. Canvas metodlarının hər çağırışı — drawCircle, drawLine, drawText — vizual təqdimatın interpretasiyası üçün Paint-dən istifadə edir.
Paint konfiqurasiya obyekti prinsipi ilə işləyir. Siz nümunə yaradır, parametrləri bir dəfə təyin edir və onu çoxsaylı əməliyyatlar üçün təkrar istifadə edirsiniz. Bu, çəkmə dövrəsində ayırmaların sayını minimuma endirir və hər kadrda yeni obyekt yaratmaqla müqayisədə performansı 30%-ə qədər artırır. Google I/O 2024-ə görə, Paint optimallaşdırması xüsusi qrafikada 60 FPS-ə çatmaq üçün əsas təcrübələrdən biridir.
Bütün Paint parametrləri bir neçə kateqoriyaya bölünür: rəng və şəffaflıq, kontur və doldurma stili, mətn və şriftlərlə iş, bulanıqlıq və maskalama effektləri. Hər kateqoriya istənilən kombinasiyada birləşdirilə bilən ayrı-ayrı setter metodları ilə idarə olunur. Bu, Paint API-ni çevik edir, lakin parametrlərin qarşılıqlı təsirini başa düşməyi tələb edir — məsələn, Style Shader-in kontura və ya doldurmaya tətbiq olunmasına təsir edir.
setColor — bütün sonrakı rəsm əməliyyatları üçün rəng təyin etməyin əsas metodu. Rəng ARGB formatında (32-bit tam ədəd) ötürülür, burada yuxarı 8 bit alfa kanalı, qalanları isə qırmızı, yaşıl və mavi kanallardır. 0xFF0000FF dəyəri qeyri-şəffaf mavi rəng təyin edir.
setAlpha metodu 0 (tam şəffaf) ilə 255 (tam qeyri-şəffaf) aralığında şəffaflığı müstəqil tənzimləməyə imkan verir. setColor-da alfa təyin etməkdən fərqli olaraq, bu metod artıq təyin edilmiş rəng tonuna təsir etmir — o, yalnız ümumi şəffaflığı modullaşdırır. Bu, rəng dəyişmədən elementlərin görünmə və yox olma animasiyaları üçün əlverişlidir.
ColorFilter — çəkmədən əvvəl hər pikselin rənginin transformasiya mexanizmi. Üç rejim dəstəklənir: kanalların vurulması və toplanması üçün LightingColorFilter, qarışdırma rejimləri ilə üst-üstə qoyma üçün PorterDuffColorFilter və tam matris transformasiyası üçün ColorMatrixColorFilter. ColorFilter Shader-dən sonra, lakin Canvas-a çıxışdan əvvəl tətbiq olunur.
Əksər tapşırıqlar üçün standart setColor və ya setAlpha kifayətdir. ColorFilter əsasən rəngsizləşdirmə, sepya və ya inversiya effektləri üçün istifadə olunur. ColorFilter tətbiqi GPU yükünü artırır, buna görə Google onun onDraw dövri çağırışlarında istifadəsini minimuma endirməyi tövsiyə edir.
| Metod | Təsvir | Performans |
|---|---|---|
| setColor | ARGB-də rəng təyin edir | O(1) — əlavə yük yoxdur |
| setAlpha | Şəffaflığı tənzimləyir (0-255) | O(1) — yüngül əməliyyat |
| setColorFilter | Rəng korreksiyası tətbiq edir | O(n) — tez-tez çağırışlarda FPS-ə təsir edir |
setStyle metodu Paint.Style-in üç dəyərindən birini qəbul edir: FILL (doldurma), STROKE (kontur) və ya FILL_AND_STROKE (eyni anda). Stil seçimindən asılı olaraq, fiqurun siluet, çərçivə və ya daxili doldurma ilə kontur kimi göstəriləcəyi müəyyən olunur. Paint standart olaraq FILL stili ilə yaradılır.
setStrokeWidth STROKE rejimi üçün xətt qalınlığını piksellə təyin edir. Dairəvi fiqurlar və yuvarlaq künclər üçün setStrokeCap (Cap.ROUND, BUTT, SQUARE) və setStrokeJoin (Join.MITER, ROUND, BEVEL) istifadə olunur. Bu parametrlər xüsusi View-lərdə qrafiklərin, yolların və çərçivələrin görünüşünə kritik təsir göstərir.
1 pikseldən az qalınlıqda xətt subpiksellə dəqiqliklə çəkilir, lakin aşağı sıxlıqlı ekranlarda bulanıq görünə bilər. Android Retina displeyləri üçün dp-ni piksellərə çevirmək üçün TypedValue.applyDimension istifadə edin. 2 dp qalınlıq əksər cihazlarda aydın görünürlük təmin edir.
DashPathEffect nöqtəli və tireli xətlər yaradır. Konstruktor növbəli tire və boşluqların uzunluqları massivini və ilkin faza sürüşməsini qəbul edir. Məsələn, [10, 5, 3, 5] massivi uzun tire, qısa boşluq, qısa tire və boşluq olan xətt yaradır. Bu effekt qrafik redaktorlarda və annotasiya alətlərində fəal şəkildə istifadə olunur.
Stil birləşməsi setPathEffect vasitəsilə həyata keçirilir. CornerPathEffect, DashPathEffect və DiscretePathEffect-i birləşdirərək diaqramlar, izahlar və dekorativ elementlər üçün mürəkkəb vizual xətlər yaratmaq olar. Hər PathEffect CPU-da hesablanır, buna görə çox sayda xətti olan animasiyalarda effekti əvvəlcədən Bitmap-a rasterləşdirmək tövsiyə olunur.
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-in bütün mətn əməliyyatları üçün şrifti müəyyən edən obyekt. Android sistem şriftlərini (Roboto, Noto Sans), assets resurslarından xüsusi şriftləri və Downloadable Fonts API vasitəsilə yüklənən şriftləri dəstəkləyir. Typeface setTypeface vasitəsilə Paint nümunəsində təyin edilir.
setTextSize metodu şrift ölçüsünü piksellə təyin edir. Müxtəlif ekranlarda düzgün göstərilmə üçün TypedValue.applyDimension ilə ölçünü sp-də göstərmək tövsiyə olunur. Sətirarası məsafə üfüqi uzatma üçün setTextScaleX ilə tənzimlənir və Canvas.drawText vasitəsilə MultiLine mətnin daxili dəstəyinə daxildir.
Mətnin düzləndirilməsi üçün LEFT, CENTER və RIGHT dəyərləri ilə setTextAlign istifadə olunur. CENTER-də drawText-ə ötürülən x koordinatı mətnin mərkəz nöqtəsinə çevrilir — bu, ikonlar altındakı izahlar və fiqurlar daxilindəki başlıqlar üçün xüsusilə əlverişlidir. Dəqiq yerləşdirmə üçün mətnin enini və sərhəd düzbucaqlısını qaytaran measureText və getTextBounds metodları tətbiq olunur.
setUnderlineText və setStrikeThruText müvafiq olaraq alt xətt və üstündən xətt çəkməni aktivləşdirir. Bu parametrlər şrift səviyyəsində işləyir və verilən Paint ilə çəkilən bütün mətnə tətbiq olunur. Bir sətrin müxtəlif hissələrini çevik formatlaşdırmaq üçün fərqli parametrlərlə ayrıca Paint obyektlərindən istifadə edin və ya drawText çağırışları arasında parametrləri dəyişdirin.
| Metod | Məqsəd | Ölçü vahidləri |
|---|---|---|
| setTextSize | Şrift ölçüsü | px (piksellər) |
| setTextAlign | Üfüqi düzləndirmə | LEFT, CENTER, RIGHT |
| setTypeface | Şrift | Typeface object |
| setUnderlineText | Alt xətt | Boolean |
Shader — fiqurları qradientlər, bitmap teksturaları və kompozitlərlə doldurmaq üçün əsas sinif. setShader metodu vasitəsilə alt siniflərdən hər hansı birini təyin etmək olar: LinearGradient, RadialGradient, SweepGradient, BitmapShader və ya ComposeShader. Shader setColor ilə təyin edilmiş rəngi əvəz edir və bütün çəkilən elementlərə tətbiq olunur.
LinearGradient düz xətt boyunca iki və ya daha çox rəng arasında hamar keçid yaradır. Konstruktor başlanğıc və son nöqtələri, rənglər massivini və onların mövqelərini (kafel rejimi) qəbul edir. Kafel rejimi qradientdən kənar davranışı müəyyən edir: CLAMP (son rəngin təkrarlanması), MIRROR (əks etdirmə) və ya REPEAT (təkrarlama). LinearGradient fon doldurmaları və gedişat zolaqları üçün fəal istifadə olunur.
RadialGradient mərkəzdən kənarlara dairəvi qradient yaradır. Mərkəz koordinatlarla təyin edilir, radius rəng keçid sahəsini müəyyən edir. Radial qradientin görünüşü nöqtə işıq mənbəyindən işıqlandırmanı xatırladır — bu, düymələrin parıltısını və aktiv elementlərin işıqlandırılmasını simulyasiya etmək üçün tez-tez istifadə olunur.
BlurMaskFilter çəkilən elementlər ətrafında bulanıqlıq effekti əlavə edir. Konstruktor bulanıqlıq radiusunu və stili qəbul edir: NORMAL (bütün istiqamətlərdə bulanıqlıq), INNER (yalnız fiqurun daxilində), OUTER (yalnız xaricdə) və SOLID (fiqur + xarici bulanıqlıq). BlurMaskFilter Paint-in istənilən növləri ilə işləyir və kölgələr və parıltı effektləri yaratmaq üçün tez-tez istifadə olunur.
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))
}
Qradient doldurma və mətn izahı ilə dairə çəkən xüsusi View-in tam nümunəsini nəzərdən keçirək. Paint və Canvas birləşməsi minimal kodla mürəkkəb qrafika yaratmağa imkan verir. Bütün parametrlər performans üçün inisializasiyaya çıxarılmışdır.
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 iki ayrıca Paint obyekti istifadə olunur: biri dairəni radial qradientlə doldurmaq üçün, ikincisi BlurMaskFilter ilə kölgəli mətn üçün. Belə bölmə parametrləri müstəqil konfiqurasiya etməyə və müxtəlif element növlərinin çəkilməsi arasında Paint vəziyyətinin sıfırlanmasının qarşısını almağa imkan verir. Performansı artırmaq üçün hər iki Paint onDraw-da deyil, konstruktorda yaradılır.
Müxtəlif piksel sıxlığı olan cihazlarda miqyaslama zamanı ölçü dəyərləri TypedValue.applyDimension vasitəsilə yenidən hesablanmalıdır. Bu olmadan mətn və qradient mdpi və xxxhdpi ekranlarda fərqli görünəcək. Nümunədə mətn ölçüsü sp-də təyin edilir ki, bu da istifadəçinin sistem şrift ölçüsü parametrlərinə avtomatik uyğunlaşır.
Tez-tez verilən suallar
Canvas rəsm əməliyyatlarını (drawCircle, drawLine) yerinə yetirir, Paint isə stil — rəng, qalınlıq, şrift təyin edir. Canvas stil parametrlərini ehtiva etmir, buna görə Paint olmadan heç bir rəsm əməliyyatının vizual effekti yoxdur.
Bəli, bir Paint obyekti çoxsaylı fiqurlar üçün təkrar istifadə edilə bilər. Müxtəlif element növləri (fon, mətn, kontur) üçün ayrıca Paint yaratmaq tövsiyə olunur, lakin hər fiqur üçün yox — bu, zibil yığanın yükünü azaldır.
reset metodu Paint-i yeni nümunəyə ekvivalent vəziyyətə qaytarır. Alternativ olaraq flag ilə set istifadə etmək olar, lakin reset kodun oxunaqlılığı üçün daha üstündür. Sıfırlamadan sonra bütün stil parametrləri standart dəyərlər alır.
Paint-in onDraw daxilində yaradılması hər kadrda ayırma yaradır ki, bu da GC donmalarına səbəb olur. Bütün Paint obyektləri View konstruktorunda yaradılmalıdır. onDraw-da setterlər vasitəsilə parametrlərin dəyişdirilməsi təhlükəsizdir və yeni obyektlər yaratmır.
Android-də mətn həmişə şəffaf fonla çəkilir. drawText metodu yalnız glifləri göstərir, fon düzbucaqlısı olmadan. Mətn altında fon lazımdırsa, əvvəlcə ayrıca Paint ilə drawRoundRect vasitəsilə düzbucaqlı çəkin, sonra mətni çəkin.
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