मैं दृश्य पर एक नीला वर्ग दिखाने की कोशिश कर रहा हूं, फिर बाद में इसके बजाय एक लाल वर्ग दिखा रहा हूं।

समस्या यह है कि जब इसे नीला वर्ग बनाना चाहिए तो यह कुछ भी नहीं खींच रहा है, लेकिन जब इसे लाल वर्ग बनाना चाहिए, तो यह नीला नहीं खींचता है।

मुझे यहां क्या समझ नहीं आ रहा है?

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if(runCount == 1)
    {
        // Color blue and save bitmap
        blueCanvas = new Canvas();
        blueBitmap = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(),Bitmap.Config.RGB_565);
        canvas.drawRect(0, 0 , 200, 300, bgPaintBlue);
    }
    if(runCount == 2){
        // Color red
        redCanvas = new Canvas();
        redBitmap = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(),Bitmap.Config.RGB_565);
        canvas.drawRect(0, 0 , 200, 300, bgPaintRed);
    }
    runCount++;
    invalidate();
}
0
Coding Academy 9 सितंबर 2018, 19:44

2 जवाब

सबसे बढ़िया उत्तर

यदि आप कैनवास पर बिटमैप बनाना चाहते हैं, तो आपको बिटमैप को कैनवास से जोड़ना होगा और फिर जितनी जल्दी हो सके उतनी तेजी से ड्रा करना होगा।

    private Bitmap canvasBitMap = null;
    private Canvas bitmapCanvas = null;
      @Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);


    int paddingLeft = getPaddingLeft();
    int paddingTop = getPaddingTop();
    int paddingRight = getPaddingRight();
    int paddingBottom = getPaddingBottom();

    int contentWidth = getWidth() - paddingLeft - paddingRight;
    int contentHeight = getHeight() - paddingTop - paddingBottom;

    mgraphWidth     = contentWidth;
    mgraphHeight    = contentHeight;

    if(canvasBitMap == null)
    canvasBitMap = Bitmap.createBitmap(mgraphWidth, mgraphHeight, Bitmap.Config.ARGB_8888);

    if(bitmapCanvas == null)
        bitmapCanvas = new Canvas(canvasBitMap);

    canvas.drawBitmap(canvasBitMap,0,0,mgraphcolor);

    drawGraph(bitmapCanvas);
}

CustomView का उपयोग करके ग्राफ़/UI प्लॉटिंग को समझने के लिए आप इस संपूर्ण GitHub कोड का उपयोग कर सकते हैं।

इस भंडार को फोर्क करें और इसे बॉयलरप्लेट के रूप में उपयोग करें।

https://github.com/Teju068/Android_Tutotrial

0
Teju Vishwakarma 9 सितंबर 2018, 22:12

सीधे डॉक्स से:

सार्वजनिक शून्य अमान्य ()

पूरे दृश्य को अमान्य करें। यदि दृश्य दिखाई दे रहा है, तो भविष्य में किसी बिंदु पर onDraw(android.graphics.Canvas) को कॉल किया जाएगा।

https://developer.android.com/reference/android/view/View.html#invalidate()

जैसा कि पहले उल्लेख किया गया है, आप ऑनड्रा विधि के अंदर ही अमान्य को कॉल कर रहे हैं, इसलिए यह एक अनंत लूप बना रहा है। इस बीच आप वहां भी रनकाउंट अपडेट कर रहे हैं, इसलिए यह लगातार उस वेरिएबल को बढ़ा रहा है।

हालांकि मुझे यकीन नहीं है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं, मैं कम से कम कथन को हटाने का सुझाव दूंगा

invalidate();

ऑनड्रा विधि के अंदर से और अपने डिजाइन पर पुनर्विचार करें। जब तक आपके पास इस दृश्य का संदर्भ है, तब तक आप अपने प्रोग्राम में कहीं और से अमान्य कॉल कर सकते हैं, लेकिन सुनिश्चित करें कि कॉल UI (मुख्य) थ्रेड पर है।

1
SydStorm 9 सितंबर 2018, 20:36