मैं दो अदृश्य टेक्स्ट व्यू और एक अदृश्य इमेज व्यू के साथ एक दृश्यमान छवि दृश्य वाले एक सापेक्ष लेआउट का बिटमैप बनाना चाहता हूं। लेकिन अदृश्य दृश्य डेटा बिटमैप में नहीं दिखाया गया था। अगर मैं उन सभी अदृश्य दृश्यों को दृश्यमान सेट करता हूं तो यह बिटमैप में दिखाया जाता है, लेकिन छुपा नहीं होता है।

मैं नीचे दिए गए कोड का उपयोग कर रहा हूं -

 private Bitmap getBitmap(View v) {
    Bitmap bmp = null, b1 = null;
    RelativeLayout targetView = (RelativeLayout) v;
    targetView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    targetView.buildDrawingCache();
    b1 = targetView.getDrawingCache();
    bmp = b1.copy(Bitmap.Config.ARGB_8888, true);
    targetView.destroyDrawingCache();
    return bmp;
}

मैंने नीचे दिए गए लिंक का भी उपयोग किया लेकिन इससे मुझे अपेक्षित परिणाम नहीं मिला।

दृश्य-अदृश्य दृश्य से बिटमैप प्राप्त करना

मैं वास्तव में एक फिक्स में हूँ।

1
Chirag Jain 31 अगस्त 2017, 08:41
आपका लिंक टूटा हुआ है, क्या आप कृपया इसे अपडेट कर सकते हैं?
 – 
cjurjiu
31 अगस्त 2017, 09:01
इसके लिए खेद है, मैंने लिंक अपडेट कर दिया है
 – 
Chirag Jain
31 अगस्त 2017, 09:06
जब तक मुझे समाधान नहीं मिल जाता, मैं इस लिंक की मदद से कैनवास का उपयोग करके बिटमैप पर अदृश्य जोड़कर इसे करने की कोशिश कर रहा हूं - stackoverflow.com/questions/7184506/…
 – 
Chirag Jain
31 अगस्त 2017, 09:12

1 उत्तर

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

ड्रॉइंग कैश वर्तमान में स्क्रीन पर खींची गई सामग्री का बिटमैप सहेजता है। स्वाभाविक रूप से, इसमें छिपे हुए दृश्य शामिल नहीं हैं।

आपके द्वारा लिंक में दिए गए लेख और आपके कोड के बीच महत्वपूर्ण अंतर यह है कि लेख में, अदृश्य दृश्य के लिए बिटमैप कैश का निर्माण किया गया है।

हालांकि, आपके पास एक दृश्यमान पेरेंट है, जिसमें अदृश्य दृश्य हैं। जब आप पैरेंट का ड्रॉइंग कैश बनाते हैं, तो अदृश्य दृश्य, निश्चित रूप से, रेंडर नहीं किए जाते हैं।

आपके लिए अदृश्य दृश्य प्रकट होने के लिए, आपको बिटमैप में विचारों को स्वयं आकर्षित करने की आवश्यकता है, फिर उस बिटमैप को बिटमैप के अंदर ड्रा करें जो माता-पिता को जारी रखता है।

कोड नमूना:

//these fields should be initialized before using
TextView invisibleTextView1;

TextView invisibleTextView2;

ImageView invisibleImageView;

private Bitmap getBitmap(View v) {
    Bitmap bmp = null;
    Bitmap b1 = null;
    RelativeLayout targetView = (RelativeLayout) v;
    targetView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    targetView.buildDrawingCache();
    b1 = targetView.getDrawingCache();
    bmp = b1.copy(Bitmap.Config.ARGB_8888, true);
    targetView.destroyDrawingCache();

    //create a canvas which will be used to draw the invisible views
    //inside the bitmap returned from the drawing cache
    Canvas fullCanvas = new Canvas(bmp);

    //create a list of invisible views
    List<View> invisibleViews = Arrays.asList(invisibleTextView1, invisibleImageView, invisibleTextView2);

    //iterate over the invisible views list
    for (View invisibleView : invisibleViews) {

        //create a bitmap the size of the current invisible view
        //in this bitmap the view will draw itself
        Bitmap invisibleViewBitmap = Bitmap.createBitmap(invisibleView.getWidth(), invisibleView.getHeight(), Bitmap.Config.ARGB_8888);

        //wrap the bitmap in a canvas. in this canvas the view will draw itself when calling "draw" 
        Canvas invisibleViewCanvas = new Canvas(invisibleViewBitmap);

        //instruct the invisible view to draw itself in the canvas we created
        invisibleView.draw(invisibleViewCanvas);

        //the view drew itself in the invisibleViewCanvas, which in term modified the invisibleViewBitmap
        //now, draw the invisibleViewBitmap in the fullCanvas, at the view's position
        fullCanvas.drawBitmap(invisibleViewBitmap, invisibleView.getLeft(), invisibleView.getTop(), null);

        //finally recycle the invisibleViewBitmap
        invisibleViewBitmap.recycle();
    }

    return bmp;
}

अंतिम उल्लेख:

  • यदि आपके अदृश्य दृश्यों में दृश्यता = View.GONE है, तो लूप में draw(...) को कॉल करने से पहले, आपको प्रत्येक पर layout(...) होना चाहिए।
  • यदि आपके अदृश्य दृश्यों का मूल दृश्य पूरी स्क्रीन पर नहीं है, तो आपके अदृश्य दृश्य सही स्थिति में नहीं खींचे जाएँगे, क्योंकि getLeft() और getTop() पिक्सेल में बाएँ और शीर्ष गुण लौटाते हैं, < मजबूत>मूल स्थान के सापेक्ष। यदि आपके अदृश्य दृश्य एक अभिभावक के भीतर हैं जो केवल स्क्रीन के हिस्से को कवर करता है, तो इसके बजाय इसका उपयोग करें:

    fullCanvas.drawBitmap(invisibleViewBitmap, invisibleView.getLeft() + parent.getLeft(), v.getTop() + v.getTop(), null);

अगर यह कार्यशील है, तो मुझे बताएं!

2
cjurjiu 31 अगस्त 2017, 14:45
आपके त्वरित उत्तर के लिए बहुत-बहुत धन्यवाद।
 – 
Chirag Jain
31 अगस्त 2017, 09:33
कृपया इन छवियों की जांच करें कि मुझे क्या चाहिए और दृश्य दृश्यों के साथ प्राप्त हो रहा है और परिणाम आपके अपडेट किए गए कोड के साथ है। मुझे लगता है कि इसे लेआउट आकार और स्थिति के लिए और अधिक गणना की आवश्यकता है। आवश्यक: mega.nz/#!Tk5yiIgC!-jGwa19s href="YDEJIvP: https://mega.nz/#!vkwBCKhI!7RcSacv8whq-vMs48FNnoDKoKWVUt1ZctETM2fVn6YE" rel="nofollow noreferrer">mega.nz/#!vkwBCKhI!7RcSacv8whq-vMs48FNnoDKo
 – 
Chirag Jain
31 अगस्त 2017, 09:39
मेरे पास उत्तर के पिछले संस्करण में लूप के लिए view.layout(...) को कॉल किया गया था। view.layout(...) को कॉल करना अनावश्यक था यदि आपके विचार गले के बजाय अदृश्य हैं, और इसके अलावा, इसमें गलत पैरामीटर थे। क्या आपने मेरे द्वारा प्रदान किए गए कोड के वर्तमान संस्करण का या layout को कॉल करने वाले कोड का उपयोग किया था? बस यह जानने के लिए कि कैसे जारी रखना है
 – 
cjurjiu
31 अगस्त 2017, 09:46
साथ ही, जब आप कहते हैं कि आपके विचार "छिपे हुए" हैं, तो क्या आपका मतलब View.INVISIBLE या View.GONE से है? मैं पूछ रहा हूँ क्योंकि View.INVISIBLE में दृश्य अभी भी मूल दृश्य द्वारा निर्धारित किए जाएंगे, जबकि View.GONE में डिफ़ॉल्ट रूप से नहीं होंगे, और आपको स्वयं measure(...) और layout(...) को कॉल करना होगा, कॉल करने से पहले draw(..)
 – 
cjurjiu
31 अगस्त 2017, 09:49
मैं View.INVISIBLE का उपयोग कर रहा हूं
 – 
Chirag Jain
31 अगस्त 2017, 09:52