मुख्य सामग्री पर जाएँ
CrossFly 100% ओपन सोर्सGitHub पर फ़ॉलो करें
CrossFlyCrossFly
शुरू करें

यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।

कस्टम ड्राइंग (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() भूल जाना।
  • रंग को ऑब्जेक्ट के रूप में पास करना — रंग int ARGB हैं (Color क्लास मौजूद नहीं है)।

यह भी देखें

क्या यह पृष्ठ उपयोगी था?