Paint Android Canvas میں گرافکس کو اسٹائل کرنے کے لیے مرکزی کلاس ہے۔ یہ یوزر انٹرفیس میں ڈرائنگ کے تمام آپریشنز کے لیے رنگ، لائن کی موٹائی، بھرنے کا اسٹائل، بلر ایفیکٹس اور فونٹس کی وضاحت کرتا ہے۔ Paint کے بغیر، Canvas ظاہر کردہ عناصر پر بصری خصوصیات لاگو نہیں کر سکتا۔ Google Developers, 2026 کے مطابق، Paint گریڈینٹ اور ٹیکسچر سمیت 42 اسٹائل پیرامیٹرز تک سپورٹ کرتا ہے۔
اہم نکات
Paint android.graphics پیکیج کی ایک کلاس ہے جو Canvas پر ڈرائنگ آپریشنز کے لیے تمام اسٹائل سیٹنگز کو ذخیرہ کرتی ہے۔ اس میں خود پکسلز نہیں ہوتے، بلکہ یہ طے کرتا ہے کہ لائنیں، اشکال اور متن کیسا نظر آئے گا۔ Canvas طریقہ کی ہر کال — drawCircle, drawLine, drawText — بصری نمائندگی کی تشریح کے لیے Paint استعمال کرتی ہے۔
Paint کنفیگریشن آبجیکٹ کے اصول پر کام کرتا ہے۔ آپ ایک مثال بناتے ہیں، پیرامیٹرز ایک بار سیٹ کرتے ہیں اور اسے متعدد آپریشنز کے لیے دوبارہ استعمال کرتے ہیں۔ یہ ڈرائنگ لوپ میں مختص کو کم سے کم کرتا ہے اور ہر فریم میں نیا آبجیکٹ بنانے کے مقابلے میں کارکردگی کو 30% تک بہتر بناتا ہے۔ Google I/O 2024 کے مطابق، Paint کی اصلاح کسٹم گرافکس میں 60 FPS حاصل کرنے کے لیے اہم طریقوں میں سے ایک ہے۔
Paint کی تمام سیٹنگز کئی زمروں میں تقسیم ہیں: رنگ اور شفافیت، اسٹروک اور بھرنے کا اسٹائل، متن اور فونٹ ہینڈلنگ، بلر اور ماسکنگ ایفیکٹس۔ ہر زمرہ علیحدہ سیٹر طریقوں سے کنٹرول کیا جاتا ہے جنہیں کسی بھی امتزاج میں ملایا جا سکتا ہے۔ یہ Paint API کو لچکدار بناتا ہے، لیکن پیرامیٹر کے تعامل کو سمجھنے کی ضرورت ہوتی ہے — مثال کے طور پر، Style متاثر کرتا ہے کہ Shader اسٹروک پر لاگو ہوتا ہے یا بھرائی پر۔
setColor بعد کی تمام ڈرائنگ آپریشنز کے لیے رنگ سیٹ کرنے کا مرکزی طریقہ ہے۔ رنگ ARGB فارمیٹ (32 بٹ عدد) میں پاس کیا جاتا ہے، جہاں اوپر والے 8 بٹ الفا چینل ہیں، اور باقی سرخ، سبز اور نیلے چینل ہیں۔ قدر 0xFF0000FF ایک مبہم نیلا رنگ سیٹ کرتی ہے۔
setAlpha طریقہ 0 (مکمل طور پر شفاف) سے 255 (مکمل طور پر مبہم) کی حد میں آزادانہ طور پر شفافیت کو ایڈجسٹ کرنے کی اجازت دیتا ہے۔ setColor میں الفا بتانے کے برعکس، یہ طریقہ پہلے سے سیٹ کردہ رنگ ٹون کو متاثر نہیں کرتا — یہ صرف مجموعی شفافیت کو ماڈیول کرتا ہے۔ یہ رنگ تبدیل کیے بغیر عناصر کے ظاہر اور غائب ہونے کی اینیمیشن کے لیے آسان ہے۔
ColorFilter رینڈرنگ سے پہلے ہر پکسل کے رنگ کو تبدیل کرنے کا ایک طریقہ کار ہے۔ تین موڈز سپورٹ ہیں: چینل ضرب اور جمع کے لیے LightingColorFilter، بلیڈ موڈز استعمال کرتے ہوئے اوورلے کے لیے PorterDuffColorFilter اور مکمل میٹرکس تبدیلی کے لیے ColorMatrixColorFilter۔ ColorFilter Shader کے بعد لیکن Canvas پر آؤٹ پٹ سے پہلے لاگو ہوتا ہے۔
زیادہ تر کاموں کے لیے، معیاری setColor یا setAlpha کافی ہے۔ ColorFilter بنیادی طور پر ڈی سیچوریشن، سیپیا یا الٹانے کے اثرات کے لیے استعمال ہوتا ہے۔ ColorFilter استعمال کرنے سے GPU لوڈ بڑھتا ہے، اس لیے Google onDraw میں چکری کالوں میں اس کے استعمال کو کم سے کم کرنے کی سفارش کرتا ہے۔
| طریقہ | تفصیل | کارکردگی |
|---|---|---|
| setColor | ARGB میں رنگ سیٹ کرتا ہے | O(1) — کوئی اوور ہیڈ نہیں |
| setAlpha | شفافیت کو ایڈجسٹ کرتا ہے (0-255) | O(1) — ہلکا آپریشن |
| setColorFilter | رنگ کی اصلاح لاگو کرتا ہے | O(n) — بار بار کال کرنے پر FPS متاثر کرتا ہے |
setStyle طریقہ تین Paint.Style اقدار میں سے ایک قبول کرتا ہے: FILL (بھرائی)، STROKE (آؤٹ لائن) یا FILL_AND_STROKE (دونوں)۔ اسٹائل کا انتخاب طے کرتا ہے کہ آیا کوئی شکل سلہوٹ، وائر فریم یا اندرونی بھرائی کے ساتھ آؤٹ لائن کے طور پر دکھائی جائے گی۔ ڈیفالٹ طور پر، Paint FILL اسٹائل کے ساتھ بنایا جاتا ہے۔
setStrokeWidth STROKE موڈ کے لیے پکسلز میں لائن کی موٹائی سیٹ کرتا ہے۔ گول شکلوں اور گول کونوں کے لیے، setStrokeCap (Cap.ROUND, BUTT, SQUARE) اور setStrokeJoin (Join.MITER, ROUND, BEVEL) استعمال ہوتے ہیں۔ یہ پیرامیٹرز کسٹم Views میں گراف، راستوں اور بارڈرز کی ظاہری شکل کو شدید متاثر کرتے ہیں۔
1 پکسل سے کم موٹائی پر، ایک لائن سب پکسل درستگی کے ساتھ کھینچی جاتی ہے لیکن کم کثافت والی اسکرینوں پر دھندلی نظر آ سکتی ہے۔ Android Retina ڈسپلے کے لیے، dp کو پکسلز میں تبدیل کرنے کے لیے TypedValue.applyDimension استعمال کریں۔ 2 dp کی موٹائی زیادہ تر آلات پر واضح نمائش فراہم کرتی ہے۔
DashPathEffect ڈیشڈ اور ڈیش ڈاٹڈ لائنیں بناتا ہے۔ کنسٹرکٹر متبادل ڈیش اور گیپ لمبائیوں کی ایک صف اور ایک ابتدائی فیز آفسیٹ قبول کرتا ہے۔ مثال کے طور پر، صف [10, 5, 3, 5] ایک لمبی ڈیش، چھوٹا گیپ، چھوٹی ڈیش اور گیپ کے ساتھ ایک لائن بناتی ہے۔ یہ اثر گرافک ایڈیٹرز اور اینوٹیشن ٹولز میں فعال طور پر استعمال ہوتا ہے۔
اسٹائلز کا امتزاج setPathEffect کے ذریعے کیا جاتا ہے۔ CornerPathEffect، DashPathEffect اور DiscretePathEffect کو ملا کر، آپ چارٹس، لیبلز اور آرائشی عناصر کے لیے پیچیدہ بصری لائنیں بنا سکتے ہیں۔ ہر PathEffect CPU پر شمار کیا جاتا ہے، اس لیے بہت سی لائنوں والی اینیمیشنز میں، اثر کو پہلے سے Bitmap میں راسٹرائز کرنے کی سفارش کی جاتی ہے۔
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 کے تمام ٹیکسٹ آپریشنز کے لیے فونٹ ٹائپ فیس کی وضاحت کرتا ہے۔ Android سسٹم فونٹس (Roboto, Noto Sans)، assets وسائل سے کسٹم فونٹس اور Downloadable Fonts API کے ذریعے ڈاؤن لوڈ کے قابل فونٹس کو سپورٹ کرتا ہے۔ Typeface Paint مثال پر setTypeface استعمال کرکے سیٹ کیا جاتا ہے۔
setTextSize طریقہ پکسلز میں فونٹ کا سائز سیٹ کرتا ہے۔ مختلف اسکرینوں پر درست ڈسپلے کے لیے، TypedValue.applyDimension استعمال کرکے سائز sp میں بتانے کی سفارش کی جاتی ہے۔ لائن کا فاصلہ افقی کھینچاؤ کے لیے setTextScaleX استعمال کرکے ایڈجسٹ کیا جاتا ہے اور Canvas.drawText کے ذریعے بلٹ ان ملٹی لائن ٹیکسٹ سے سپورٹ کیا جاتا ہے۔
متن کی سیدھ کے لیے، setTextAlign LEFT, CENTER اور RIGHT اقدار کے ساتھ استعمال ہوتا ہے۔ CENTER کے ساتھ، drawText کو دیا گیا x کوآرڈینیٹ متن کا مرکزی نقطہ بن جاتا ہے — یہ آئیکنز کے نیچے لیبلز اور شکلوں کے اندر عنوانات کے لیے خاص طور پر آسان ہے۔ درست پوزیشننگ کے لیے، measureText اور getTextBounds طریقے استعمال ہوتے ہیں، جو متن کی چوڑائی اور باؤنڈنگ مستطیل لوٹاتے ہیں۔
setUnderlineText اور setStrikeThruText بالترتیب انڈر لائن اور اسٹرائیک تھرو کو فعال کرتے ہیں۔ یہ پیرامیٹرز ٹائپ فیس کی سطح پر کام کرتے ہیں اور اس Paint کے ذریعے کھینچے گئے تمام متن پر لاگو ہوتے ہیں۔ ایک ہی سٹرنگ کے مختلف حصوں کی لچکدار فارمیٹنگ کے لیے، مختلف سیٹنگز کے ساتھ علیحدہ Paint آبجیکٹ استعمال کریں یا drawText کالوں کے درمیان پیرامیٹرز تبدیل کریں۔
| طریقہ | مقصد | اکائی |
|---|---|---|
| setTextSize | فونٹ کا سائز | px (پکسلز) |
| setTextAlign | افقی سیدھ | LEFT, CENTER, RIGHT |
| setTypeface | فونٹ ٹائپ فیس | Typeface آبجیکٹ |
| setUnderlineText | انڈر لائن | Boolean |
Shader شکلوں کو گریڈینٹ، بٹ میپ ٹیکسچر اور کمپوزٹنگ سے بھرنے کے لیے بنیادی کلاس ہے۔ setShader طریقہ کے ذریعے، آپ اس کی کسی بھی ذیلی کلاس کو تفویض کر سکتے ہیں: LinearGradient, RadialGradient, SweepGradient, BitmapShader یا ComposeShader۔ Shader setColor کے ذریعے سیٹ کردہ رنگ کو بدل دیتا ہے اور تمام کھینچے گئے عناصر پر لاگو ہوتا ہے۔
LinearGradient ایک سیدھی لکیر کے ساتھ دو یا زیادہ رنگوں کے درمیان ہموار منتقلی پیدا کرتا ہے۔ کنسٹرکٹر شروع اور اختتامی پوائنٹس، رنگوں کی ایک صف اور ان کی پوزیشنیں (ٹائل موڈ) قبول کرتا ہے۔ ٹائل موڈ گریڈینٹ سے باہر کے رویے کا تعین کرتا ہے: CLAMP (آخری رنگ دہرائیں), MIRROR (عکاسی) یا REPEAT (دہرائیں)۔ LinearGradient پس منظر بھرنے اور پیشرفت بارز کے لیے فعال طور پر استعمال ہوتا ہے۔
RadialGradient مرکز سے کناروں تک ایک دائرہ نما گریڈینٹ بناتا ہے۔ مرکز کوآرڈینیٹ سے متعین کیا جاتا ہے، رداس رنگ کی منتقلی کے علاقے کی وضاحت کرتا ہے۔ شعاعی گریڈینٹ کی ظاہری شکل ایک نقطہ ماخذ سے روشنی سے مشابہ ہے — یہ اکثر بٹنوں کی چمک کی نقل کرنے اور فعال عناصر کو اجاگر کرنے کے لیے استعمال ہوتا ہے۔
BlurMaskFilter کھینچے گئے عناصر کے ارد گرد بلر اثر شامل کرتا ہے۔ کنسٹرکٹر ایک بلر رداس اور ایک اسٹائل قبول کرتا ہے: NORMAL (تمام سمتوں میں بلر), INNER (صرف شکل کے اندر), OUTER (صرف باہر) اور SOLID (شکل + بیرونی بلر)۔ BlurMaskFilter کسی بھی Paint قسم کے ساتھ کام کرتا ہے اور اکثر شیڈوز اور چمک کے اثرات بنانے کے لیے استعمال ہوتا ہے۔
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))
}
آئیے ایک کسٹم View کی مکمل مثال دیکھیں جو گریڈینٹ بھرائی اور ٹیکسٹ لیبل کے ساتھ دائرہ کھینچتا ہے۔ Paint اور Canvas کا امتزاج کم سے کم کوڈ کے ساتھ پیچیدہ گرافکس بنانے کی اجازت دیتا ہے۔ کارکردگی کے لیے تمام سیٹنگز ابتدائیہ میں منتقل کر دی گئی ہیں۔
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("گریڈینٹ", 200f, 210f, textPaint)
}
}
کوڈ دو علیحدہ Paint آبجیکٹ استعمال کرتا ہے: ایک دائرے کو شعاعی گریڈینٹ سے بھرنے کے لیے، اور دوسرا BlurMaskFilter کے ذریعے شیڈو کے ساتھ متن کے لیے۔ یہ علیحدگی پیرامیٹرز کو آزادانہ طور پر ترتیب دینے اور مختلف اقسام کے عناصر کی ڈرائنگ کے درمیان Paint اسٹیٹ ری سیٹ سے بچنے کی اجازت دیتی ہے۔ کارکردگی بہتر بنانے کے لیے، دونوں Paint آبجیکٹ onDraw میں نہیں بلکہ کنسٹرکٹر میں بنائے جاتے ہیں۔
مختلف پکسل کثافت والے آلات پر اسکیلنگ کرتے وقت، سائز کی قدروں کا TypedValue.applyDimension استعمال کرکے دوبارہ حساب کیا جانا چاہیے۔ اس کے بغیر، متن اور گریڈینٹ mdpi اور xxxhdpi اسکرینوں پر مختلف نظر آئیں گے۔ مثال میں، متن کا سائز sp میں بتایا گیا ہے، جو خود بخود صارف کے سسٹم فونٹ سائز سیٹنگز کے مطابق ڈھل جاتا ہے۔
اکثر پوچھے گئے سوالات
Canvas ڈرائنگ آپریشنز (drawCircle, drawLine) انجام دیتا ہے، جبکہ Paint اسٹائل — رنگ، موٹائی، فونٹ — کی وضاحت کرتا ہے۔ Canvas میں اسٹائل سیٹنگز نہیں ہوتیں، اس لیے Paint کے بغیر کسی بھی ڈرائنگ آپریشن کا کوئی بصری اثر نہیں ہوتا۔
ہاں، ایک ہی Paint آبجیکٹ کو کئی شکلوں کے لیے دوبارہ استعمال کیا جا سکتا ہے۔ مختلف اقسام کے عناصر (پس منظر، متن، آؤٹ لائن) کے لیے علیحدہ Paint آبجیکٹ بنانے کی سفارش کی جاتی ہے، لیکن ہر شکل کے لیے نہیں — یہ کوڑا کرکٹ جمع کرنے والے کے بوجھ کو کم کرتا ہے۔
reset طریقہ Paint کو ایک نئی مثال کے برابر حالت میں لوٹاتا ہے۔ متبادل طور پر، آپ فلیگ کے ساتھ set استعمال کر سکتے ہیں، لیکن reset کوڈ پڑھنے کی اہلیت کے لیے بہتر ہے۔ ری سیٹ کرنے کے بعد، تمام اسٹائل پیرامیٹرز ڈیفالٹ اقدار لے لیتے ہیں۔
onDraw کے اندر Paint بنانا ہر فریم میں مختص کا سبب بنتا ہے، جس سے GC جم جاتا ہے۔ تمام Paint آبجیکٹ View کنسٹرکٹر میں بنائے جانے چاہئیں۔ سیٹرز کے ذریعے onDraw میں پیرامیٹرز تبدیل کرنا محفوظ ہے اور نئے آبجیکٹ نہیں بناتا۔
Android میں متن ہمیشہ شفاف پس منظر کے ساتھ کھینچا جاتا ہے۔ drawText طریقہ صرف گلائف آؤٹ پٹ کرتا ہے، بغیر پس منظر کے مستطیل کے۔ اگر متن کے نیچے پس منظر کی ضرورت ہو تو، پہلے علیحدہ Paint کے ساتھ drawRoundRect استعمال کرکے ایک مستطیل کھینچیں، پھر متن۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں