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 के अनुसार, कस्टम ग्राफ़िक्स में 60 FPS पाने के लिए Paint अनुकूलन प्रमुख अभ्यासों में से एक है।
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) उपयोग किए जाते हैं। ये पैरामीटर कस्टम View में ग्राफ़, पथ और फ़्रेम के स्वरूप को महत्वपूर्ण रूप से प्रभावित करते हैं।
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 object |
| setUnderlineText | रेखांकन | Boolean |
Shader आकृतियों को ग्रैडिएंट, रैस्टर टेक्सचर और कम्पोज़िटिंग से भरने के लिए आधार क्लास है। setShader विधि के माध्यम से कोई भी उपक्लास नियुक्त किया जा सकता है: LinearGradient, RadialGradient, SweepGradient, BitmapShader या ComposeShader। Shader setColor द्वारा सेट किए गए रंग को बदलता है और सभी खींचे गए तत्वों पर लागू होता है।
LinearGradient एक सीधी रेखा के साथ दो या अधिक रंगों के बीच सहज संक्रमण बनाता है। कंस्ट्रक्टर प्रारंभ और अंत बिंदु, रंगों की सरणी और उनकी स्थिति (tile mode) लेता है। Tile mode ग्रैडिएंट की सीमा से बाहर का व्यवहार निर्धारित करता है: 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("Gradient", 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें