यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।
कस्टम ड्राइंग (onPaint)
जब कोई विजेट काम न आए, तो एक Component बनाएँ और onPaint(Paint paint) को अधिरोहित करें।
निर्देशांक स्थानीय हैं (0,0 = ऊपरी बायाँ कोना; width/height कॉम्पोनेंट का आकार हैं)।
पूरा उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)
package com.exemplo;
import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.graphics.*; // Paint, GRect, Font
import dev.crossfly.ui.style.*; // Styles
/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
/** कस्टम कंपोनेंट: एक "badge" बनाता है (संख्या वाली रंगीन गोली)। */
static class Badge extends Component
{
private int valor;
Badge(int valor) { this.valor = valor; }
@Override
public void onPaint(Paint paint) throws Exception
{
// स्थानीय निर्देशांक: (0,0) = ऊपर-बाएँ; width/height = कंपोनेंट का आकार।
GRect r = new GRect()
.bounds(0, 0, width, height)
.fill(0xFFE53935) // लाल ARGB
.radius(height / 2); // गोली / वृत्त
paint.rect(r);
Font f = Styles.font;
String s = String.valueOf(valor);
int tx = (width - (int) f.width(s)) / 2;
int ty = (height - f.scaledHeight()) / 2;
paint.text(s, tx, ty, 0xFFFFFFFF, f); // केंद्रित सफेद टेक्स्ट
}
}
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
Badge badge = new Badge(7);
add(LAY_AUTO, badge); // कस्टम कॉम्पोनेंट को स्क्रीन में जोड़ता है
}
}
नीचे दिए गए स्निपेट सिर्फ़ मूल भाग दिखाते हैं (जो
onShow()के अंदर जाता है)। चलाने के लिए, इन्हें ऊपर वालेMainWindowकंकाल में रखें।
कंकाल
public class Badge extends Component {
private int valor;
public Badge(int valor) { this.valor = valor; }
@Override public void onPaint(Paint paint) throws Exception {
// गोल भरी हुई पृष्ठभूमि
GRect r = new GRect()
.bounds(0, 0, width, height)
.fill(0xFFE53935) // लाल
.radius(height / 2); // पिल/वृत्त
paint.rect(r);
// केंद्रित टेक्स्ट
Font f = Styles.font;
String s = String.valueOf(valor);
int tx = (width - (int) f.width(s)) / 2;
int ty = (height - f.scaledHeight()) / 2;
paint.text(s, tx, ty, 0xFFFFFFFF, f);
}
}
// 'valor' बदलने के बाद फिर से बनाने के लिए: repaint();
Paint के आदिम (primitives)
| कॉल | क्या बनाता है |
|---|---|
paint.rect(GRect r) |
आयत (भरा/बॉर्डर/कोने/शैडो) — GRect कॉन्फ़िगर करें |
paint.text(String, x, y, color, Font) |
टेक्स्ट |
paint.line(x1, y1, x2, y2, color, thick) |
रेखा |
paint.image(Image, x, y[, w, h]) |
छवि |
paint.polyline(GLines) / paint.polygon(GLines) |
पॉलीलाइन / बहुभुज |
GRect — कॉन्फ़िगर करने योग्य आयत
फ़्लुएंट: .bounds(x,y,w,h) · .fill(color) · .border(color, thick) · .radius(r) /
.radius(tl,tr,br,bl)। फिर paint.rect(gr)।
GRect card = new GRect().bounds(0, 0, width, height)
.fill(0xFFFFFFFF).border(0xFFE0E0E0, 1).radius(8);
paint.rect(card);
सर्वोत्तम अभ्यास
width/heightके सापेक्ष बनाएँ (स्थिर मान नहीं) — यह उत्तरदायी बनाए रखता है।- प्रति फ़्रेम आवंटित करने के बजाय
GRect/Fontऑब्जेक्ट (फ़ील्ड) को फिर से उपयोग करें। - जब ड्राइंग को प्रभावित करने वाली स्थिति बदले, तब
repaint()कॉल करें (रेंडर माँग पर होता है)।
आम गलतियाँ
onPaintमें स्क्रीन के निरपेक्ष निर्देशांक का उपयोग करना — वे कॉम्पोनेंट के लिए स्थानीय हैं।- खींचे गए डेटा को बदलने के बाद
repaint()भूल जाना। - रंग को ऑब्जेक्ट के रूप में पास करना — रंग
intARGB हैं (Colorक्लास मौजूद नहीं है)।
यह भी देखें
- छवियाँ · Whiteboard · रंग
क्या यह पृष्ठ उपयोगी था?प्रतिक्रिया के लिए धन्यवाद!