Paint, Android Canvas'ta grafikleri şekillendirmek için kullanılan ana sınıftır. Kullanıcı arayüzündeki tüm çizim işlemleri için rengi, çizgi kalınlığını, dolgu stilini, bulanıklık efektlerini ve yazı tiplerini tanımlar. Paint olmadan Canvas, görüntülenen öğelere görsel nitelikler uygulayamaz. Google Developers, 2026 verilerine göre Paint, gradyanlar ve dokular dahil 42'ye kadar stil parametresini destekler.
Önemli Noktalar
Paint, Canvas üzerindeki çizim işlemleri için tüm stil ayarlarını saklayan android.graphics paketinden bir sınıftır. Piksellerin kendisini içermez, çizgilerin, şekillerin ve metnin tam olarak nasıl görüneceğini tanımlar. Canvas yönteminin her çağrısı — drawCircle, drawLine, drawText — görsel sunumu yorumlamak için Paint'i kullanır.
Paint, yapılandırma nesnesi ilkesine göre çalışır. Bir örnek oluşturursunuz, parametreleri bir kez ayarlarsınız ve birden çok işlem için yeniden kullanırsınız. Bu, çizim döngüsündeki ayırma sayısını en aza indirir ve her karede yeni bir nesne oluşturmaya kıyasla performansı %30'a kadar artırır. Google I/O 2024 verilerine göre Paint optimizasyonu, özel grafiklerde 60 FPS'ye ulaşmak için temel uygulamalardan biridir.
Paint'in tüm ayarları birkaç kategoriye ayrılır: renk ve şeffaflık, kontur ve dolgu stili, metin ve yazı tipleriyle çalışma, bulanıklık ve maskeleme efektleri. Her kategori, herhangi bir kombinasyonda birleştirilebilen ayrı setter yöntemleriyle kontrol edilir. Bu, Paint API'sini esnek kılar ancak parametrelerin etkileşimini anlamayı gerektirir — örneğin Style, Shader'ın kontura mı yoksa dolguya mı uygulanacağını etkiler.
setColor, sonraki tüm çizim işlemleri için rengi ayarlamanın ana yöntemidir. Renk ARGB biçiminde (32 bitlik tam sayı) iletilir; burada üst 8 bit alfa kanalı, geri kalanı kırmızı, yeşil ve mavi kanallarıdır. 0xFF0000FF değeri opak mavi rengi ayarlar.
setAlpha yöntemi, şeffaflığı 0 (tamamen şeffaf) ile 255 (tamamen opak) aralığında bağımsız olarak ayarlamayı sağlar. setColor'da alfa belirtmenin aksine bu yöntem, önceden ayarlanmış renk tonunu etkilemez — yalnızca genel şeffaflığı modüle eder. Bu, rengi değiştirmeden öğelerin görünme ve kaybolma animasyonları için kullanışlıdır.
ColorFilter, çizimden önce her pikselin rengini dönüştürmeye yarayan bir mekanizmadır. Üç mod desteklenir: kanalları çarpma ve toplama için LightingColorFilter, karıştırma modları kullanan PorterDuffColorFilter ve tam matris dönüşümü için ColorMatrixColorFilter. ColorFilter, Shader'dan sonra ancak Canvas'a çıktıdan önce uygulanır.
Çoğu görev için standart setColor veya setAlpha yeterlidir. ColorFilter esas olarak doygunluğu giderme, sepya veya ters çevirme efektleri için kullanılır. ColorFilter uygulamak GPU üzerindeki yükü artırır, bu nedenle Google onDraw döngüsel çağrılarında kullanımını en aza indirmeyi önerir.
| Yöntem | Açıklama | Performans |
|---|---|---|
| setColor | Rengi ARGB olarak ayarlar | O(1) — ek yük yok |
| setAlpha | Şeffaflığı (0-255) ayarlar | O(1) — hafif işlem |
| setColorFilter | Renk düzeltmesi uygular | O(n) — sık çağrılarda FPS'yi etkiler |
setStyle yöntemi, Paint.Style'un üç değerinden birini alır: FILL (dolgu), STROKE (kontur) veya FILL_AND_STROKE (ikisi aynı anda). Stil seçimine bağlı olarak şekil, siluet, iskelet veya iç dolgulu kontur olarak gösterilir. Paint varsayılan olarak FILL stiliyle oluşturulur.
setStrokeWidth, STROKE modu için çizgi kalınlığını piksel cinsinden ayarlar. Yuvarlatılmış şekiller ve köşeler için setStrokeCap (Cap.ROUND, BUTT, SQUARE) ve setStrokeJoin (Join.MITER, ROUND, BEVEL) kullanılır. Bu parametreler, özel View'lardaki grafiklerin, yolların ve çerçevelerin görünümünü kritik şekilde etkiler.
1 pikselden az kalınlıkta çizgi alt piksel hassasiyetiyle çizilir ancak düşük yoğunluklu ekranlarda bulanık görünebilir. Android Retina ekranlar için dp'yi piksele dönüştürmek üzere TypedValue.applyDimension kullanın. 2 dp kalınlık, çoğu cihazda net görünürlük sağlar.
DashPathEffect, kesikli ve kesikli-noktalı çizgiler oluşturur. Yapıcı, dönüşümlü kesik ve boşluk uzunluklarından oluşan bir dizi ile başlangıç faz kayması alır. Örneğin [10, 5, 3, 5] dizisi, uzun kesik, kısa boşluk, kısa kesik ve boşluktan oluşan bir çizgi oluşturur. Bu efekt, grafik düzenleyicilerde ve açıklama araçlarında aktif olarak kullanılır.
Stillerin birleştirilmesi setPathEffect ile yapılır. CornerPathEffect, DashPathEffect ve DiscretePathEffect birleştirilerek diyagramlar, etiketler ve dekoratif öğeler için karmaşık görsel çizgiler oluşturulabilir. Her PathEffect CPU'da hesaplanır, bu nedenle çok sayıda çizgi içeren animasyonlarda efektin önceden Bitmap'te rasterleştirilmesi önerilir.
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 tüm metin işlemleri için yazı ailesini tanımlayan bir nesnedir. Android, sistem yazı tiplerini (Roboto, Noto Sans), assets kaynaklarındaki özel yazı tiplerini ve Downloadable Fonts API aracılığıyla yüklenebilen yazı tiplerini destekler. Typeface kurulumu, Paint örneğinde setTypeface ile yapılır.
setTextSize yöntemi, yazı tipi boyutunu piksel cinsinden ayarlar. Farklı ekranlarda doğru görüntüleme için boyutun TypedValue.applyDimension kullanılarak sp cinsinden belirtilmesi önerilir. Satır aralığı, yatay gerilme için setTextScaleX ile ayarlanır ve Canvas.drawText üzerinden çok satırlı metnin yerleşik desteğine dahil edilir.
Metni hizalamak için LEFT, CENTER ve RIGHT değerleriyle setTextAlign kullanılır. CENTER'da drawText'e iletilen x koordinatı metnin merkez noktası olur — bu, simgelerin altındaki etiketler ve şekillerin içindeki başlıklar için özellikle kullanışlıdır. Hassas konumlandırma için metnin genişliğini ve sınırlayıcı dikdörtgenini döndüren measureText ve getTextBounds yöntemleri kullanılır.
setUnderlineText ve setStrikeThruText sırasıyla alt çizgiyi ve üstü çizili metni etkinleştirir. Bu parametreler yazı ailesi düzeyinde çalışır ve bu Paint ile çizilen tüm metne uygulanır. Aynı dizenin farklı bölümlerini esnek biçimlendirmek için farklı ayarlara sahip ayrı Paint nesneleri kullanın veya drawText çağrıları arasında parametreleri değiştirin.
| Yöntem | Amaç | Ölçü birimleri |
|---|---|---|
| setTextSize | Yazı tipi boyutu | px (piksel) |
| setTextAlign | Yatay hizalama | LEFT, CENTER, RIGHT |
| setTypeface | Yazı ailesi | Typeface object |
| setUnderlineText | Alt çizgi | Boolean |
Shader, şekilleri gradyanlar, raster dokular ve kompozitlemeyle doldurmak için temel sınıftır. setShader yöntemiyle alt sınıflardan herhangi biri atanabilir: LinearGradient, RadialGradient, SweepGradient, BitmapShader veya ComposeShader. Shader, setColor ile ayarlanan rengi değiştirir ve çizilen tüm öğelere uygulanır.
LinearGradient, düz bir çizgi boyunca iki veya daha fazla renk arasında yumuşak bir geçiş oluşturur. Yapıcı, başlangıç ve bitiş noktalarını, renk dizisini ve konumlarını (tile mode) alır. Tile mode, gradyanın dışındaki davranışı belirler: CLAMP (son rengin tekrarı), MIRROR (yansıtma) veya REPEAT (tekrar). LinearGradient, arka plan dolguları ve ilerleme çubukları için aktif olarak kullanılır.
RadialGradient, merkezden kenarlara doğru dairesel bir gradyan oluşturur. Merkez koordinatlarla belirlenir, yarıçap renk geçiş alanını tanımlar. Radyal gradyanın görünümü bir nokta kaynağından gelen ışığı andırır — bu, düğmelerin parlamasını ve aktif öğelerin vurgulanmasını simüle etmek için sıklıkla kullanılır.
BlurMaskFilter, çizilen öğelerin çevresine bulanıklık efekti ekler. Yapıcı, bulanıklık yarıçapını ve stili alır: NORMAL (her yönde bulanıklık), INNER (yalnızca şeklin içinde), OUTER (yalnızca dışta) ve SOLID (şekil + dış bulanıklık). BlurMaskFilter tüm Paint türleriyle çalışır ve genellikle gölge ve parlama efektleri oluşturmak için kullanılır.
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))
}
Gradyan dolgulu ve metin etiketli bir daire çizen özel bir View'ın tam örneğini inceleyelim. Paint ve Canvas kombinasyonu, minimum kodla karmaşık grafikler oluşturmayı sağlar. Tüm ayarlar performans için başlatmaya alınmıştı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ı Paint nesnesi kullanılır: biri daireyi radyal gradyanla doldurmak için, diğeri BlurMaskFilter üzerinden gölgeli metin için. Bu bölünme, parametreleri bağımsız olarak ayarlamayı ve farklı öğe türlerini çizme arasında Paint durumunu sıfırlamaktan kaçınmayı sağlar. Performansı artırmak için her iki Paint de onDraw'da değil kurucuda oluşturulur.
Farklı piksel yoğunluğuna sahip cihazlarda ölçeklenirken boyut değerleri TypedValue.applyDimension ile yeniden hesaplanmalıdır. Bu olmadan metin ve gradyan, mdpi ve xxxhdpi ekranlarda farklı görünür. Örnekte metin boyutu sp olarak ayarlanır ve bu, kullanıcının sistem yazı boyutu ayarlarına otomatik olarak uyum sağlar.
Sıkça sorulan sorular
Canvas çizim işlemlerini (drawCircle, drawLine) gerçekleştirir, Paint ise stili — rengi, kalınlığı, yazı tipini tanımlar. Canvas stil ayarları içermez, bu nedenle Paint olmadan hiçbir çizim işleminin görsel etkisi yoktur.
Evet, tek bir Paint nesnesi birçok şekil için yeniden kullanılabilir. Farklı öğe türleri (arka plan, metin, kontur) için ayrı Paint oluşturulması önerilir, ancak her şekil için değil — bu, çöp toplayıcı üzerindeki yükü azaltır.
reset yöntemi, Paint'i yeni bir örneğe eşdeğer bir duruma döndürür. Alternatif olarak bayraklı set kullanılabilir, ancak kodun okunabilirliği için reset tercih edilir. Sıfırlamadan sonra tüm stil parametreleri varsayılan değerleri alır.
onDraw içinde Paint oluşturmak her karede ayırma yapılmasına neden olur ve GC donmalarına yol açar. Tüm Paint nesneleri View'ın kurucusunda oluşturulmalıdır. onDraw'da setter ile parametre değiştirmek güvenlidir ve yeni nesneler oluşturmaz.
Android'de metin her zaman şeffaf arka planla çizilir. drawText yöntemi, arka plan dikdörtgeni olmadan yalnızca glifleri çıkarır. Metnin altında arka plan gerekiyorsa, önce ayrı bir Paint ile drawRoundRect üzerinden bir dikdörtgen çizin, ardından metni çizin.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun