অ্যান্ড্রয়েড ভি.জেটড্রেইনচ্যাচগুলি নাল, কেবল নਾਲ returns


97

কেউ দয়া করে কেন আমাকে তা বোঝানোর চেষ্টা করবেন

public void addView(View child) {
  child.setDrawingCacheEnabled(true);
  child.setWillNotCacheDrawing(false);
  child.setWillNotDraw(false);
  child.buildDrawingCache();
  if(child.getDrawingCache() == null) { //TODO Make this work!
    Log.w("View", "View child's drawing cache is null");
  }
  setImageBitmap(child.getDrawingCache()); //TODO MAKE THIS WORK!!!
}

সবসময় লগ হয় যে অঙ্কন ক্যাশেটি নাল, এবং বিটম্যাপটি নালায় সেট করে?

ক্যাশে সেট করার আগে আমাকে কী দৃশ্যটি আঁকতে হবে?

ধন্যবাদ!


4
stackoverflow.com/questions/9791714/... ব্যবহার করবেন না getDrawingCache()ব্যবহার View#drawকরার জন্য Canvasপদ্ধতির
Yuraj

উত্তর:


240

আমারও এই সমস্যা ছিল এবং আমি এই উত্তরটি পেয়েছি:

v.setDrawingCacheEnabled(true);

// this is the important code :)  
// Without it the view will have a dimension of 0,0 and the bitmap will be null          
v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 

v.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(v.getDrawingCache());
v.setDrawingCacheEnabled(false); // clear drawing cache

4
ওয়েবভিউ পরিমাপটি সামগ্রীর আকারের উপর নির্ভর করে, সুতরাং যদি ওয়েব পৃষ্ঠাটি লোড না করা হয় তবে আপনি 0 এর একটি পরিমাপ পাবেন Me
মারসিও কোভরে

4
তবুও মেজারস্পেক.এক্স্যাক্টলি দিয়ে নাল ফেরায়।

যথেষ্ট পরিমাণে দৃশ্যে, এটি আমার পক্ষে কার্যকর হয়নি। (সম্ভবত আমার কাছে খুব সীমাবদ্ধ স্মৃতি সংস্থান সহ একটি ফোন রয়েছে)। সিভি 2 এর নীচের উত্তরটি আমার পক্ষে ভাল কাজ করেছে।
সাইমন ফারসবার্গ

@ নিনিনহো কীভাবে গেটড্রাউচচে () পদ্ধতি ব্যবহার না করে চিত্রের ভিউ থেকে আঁকতে পারবেন?
গর্জিয়াস_ড্রয়েড ভাইরাস

এটা ভাল কাজ করে. তবে এটি ইউআইতে প্রভাবিত করে। এই সমস্যাটি সমাধান করতে দয়া করে সহায়তা করুন।
বিবেক রবি

59

যদি getDrawingCacheসবসময় returning nullছেলে হয়: এটি ব্যবহার করুন:

public static Bitmap loadBitmapFromView(View v) {
     Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
     Canvas c = new Canvas(b);
     v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
     v.draw(c);
     return b;
}

তথ্যসূত্র: https://stackoverflow.com/a/6272951/371749


4
ভাল একটা. এইটি আমার পক্ষে কাজ করেছিল অন্যরা তা করেনি। getLayoutParamsV.getWidth () এবং v.getHeight () এর পরিবর্তে মানগুলি ব্যবহার করার কোনও কারণ আছে কি ?
সাইমন ফারসবার্গ

দুঃখিত, ব্যক্তিগতভাবে, আপনার প্রশ্নে আপনাকে সহায়তা করতে পারে না: '(-> এটি কার্যকর হয়েছে :)
সিভি 2

@ সিভি 2 আমি চিত্রগুলি আঁকতে পেরেছি, তবে চলমান পৃষ্ঠদৃশ্যে আমার গেটড্রয়েচিং করা দরকার .. তাহলে আমি কী করব?
গর্জিয়াস_ড্রয়েড

4
আমি ব্যতিক্রম প্রস্থ পাচ্ছি এবং উচ্চতা অবশ্যই ০ ......... .............................. প্রাইভেট অকার্যকর স্ক্রিনশট () {এর জন্য i = 1; i <4; i ++) start // স্টার্টডায়ালগ (); ভিউ দেখুন = স্ক্রিনশটএকটিভিটি.থিস.ফাইন্ডভিউবিআইআইডি (R.id.relativelayout); বিটম্যাপ বিটম্যাপ = লোডবিটম্যাপফ্রমভিউ (দেখুন);}}
আকাশ যাদব

4
আমি মনে করি `ব্যতিক্রম প্রস্থ এবং উচ্চতা অবশ্যই> 0` এর মধ্যে আসে যখন আপনার ImageViewকোনও চিত্র এখনও পাওয়া যায় নি, তাই এটি 0 হিসাবে উপস্থিত হয় This এটি বিভিন্ন লোকের কোডের জন্য আলাদাভাবে খেলতে পারে তবে নিশ্চিত হয়ে নিন যে আপনার কলটি loadBitmapFromView()অবশ্যই পরে হবে আপনার ImageViewএকটি ইমেজ আছে।
আজুরস্পট

6

একটিকে নালার মূল কারণটি হল ভিউটি মাত্রাযুক্ত নয়। এরপরে ভিউ.ট্যাডউইচিং (), ভিউ.জিটলাউটপ্যারামস ()। প্রস্থ ইত্যাদি ব্যবহার করে সমস্ত প্রচেষ্টা অদৃশ্য। সুতরাং, আপনাকে ভিউতে মাত্রা নির্ধারণ করতে হবে প্রথমে:

view.layout(0, 0, width, height);

(উইন্ডো ম্যানেজার ইত্যাদির সাহায্যে আপনি পছন্দ মতো বা ইতোমধ্যে 'প্রস্থ' এবং 'উচ্চতা' সেট করেছেন)


রুট দেখুন = currActivity.getWindow ()। GetDecorView ()। FindViewById (android.R.id.content); root.setDrawingCacheEnabled (সত্য); root.layout (0, 0, 480, 854); mBitmap = root.getDrawingCache ();
নরেন্দ্র গুসাইন

4

আমি পরিবর্তে এটি ব্যবহার করছি।

myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            Bitmap bitmap = Bitmap.createBitmap(myView.getDrawingCache());
        }
    });

3

সেরা কাজ 4me

    Bitmap bitmap = Bitmap.createBitmap( screen.getMeasuredWidth(), screen.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    screen.layout(0, 0, screen.getMeasuredWidth(), screen.getMeasuredHeight());
    screen.draw(canvas);

2

আপনি যে দৃশ্যটি দেখতে চান তা যদি সত্যিই স্ক্রিনে দেখায় তবে এটি বাতিল হয়ে যায়। এর অর্থ উইন্ডো পরিচালক এটি তৈরি করার আগে আপনি ভিউটি ধরেন। কিছু লেআউট খুব জটিল। যদি বিন্যাসে নেস্টেড লেআউট, লেআউট_ ওয়েট..এইচসি অন্তর্ভুক্ত থাকে তবে এটি বেশ কয়েকবার রিলেআউট হুবহু আকার ধারণ করে। উইন্ডো ম্যানেজারের কাজ শেষ হওয়া এবং তারপরে স্ক্রিন শট না পাওয়া পর্যন্ত সর্বোত্তম সমাধান অপেক্ষা করা। GetDrawingCache () হ্যান্ডলারে রাখার চেষ্টা করুন।


1

@ সিভি 2 এবং @ নিনিনহোর উত্তর দুটিই আমার পক্ষে কাজ করে।

আমি যে হার্ডটি খুঁজে পেয়েছি তার মধ্যে একটি কারণ হ'ল আমার যে ভিউটি ছিল তা এমন একটি ভিউ তৈরি করছে যা প্রস্থ এবং উচ্চতা 0 ( যেমন একটি ফাঁকা স্ট্রিংয়ের স্ট্রিং টেক্সট সহ একটি টেক্সটভিউ থাকার কথা কল্পনা করুন )। এই ক্ষেত্রে, getDrawingCache নালাগুলি ফিরে আসবে, সুতরাং এটির জন্য অবশ্যই পরীক্ষা করে নেওয়া নিশ্চিত হন। আশা করি এটি কিছু লোককে সাহায্য করবে।


1

ত্রুটিটি আপনার চিত্রটি অঙ্কন ক্যাশে ফিট করার পক্ষে খুব বড় আকারের কারণ হতে পারে ।

আমি আমার লগগুলি থেকে আমার "View.getDrawingCache রিটার্ন নাল" সমস্যার ব্যাখ্যা পেয়েছি:

W/View: View too large to fit into drawing cache, needs 19324704 bytes, only 16384000 available

অ্যান্ড্রয়েড ডক্স আরও বলেছে : অ্যান্ড্রয়েড ডিভাইসগুলিতে একটি অ্যাপ্লিকেশনটিতে 16MB মেমরির পরিমাণ কম থাকতে পারে। এজন্য আপনি বড় বিটম্যাপ লোড করতে পারবেন না।


1

আমি ভিউয়ের উপর ভিত্তি করে গতিশীল চিত্রের এন সংখ্যাটি তৈরি করার চেষ্টা করছি।

LayoutInflater infalter=(LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View addview=infalter.inflate(R.layout.barcode_image_list_row_item, null);
final ImageView imv=(ImageView) addview.findViewById(R.id.imageView1);
final TextView tv=(TextView) addview.findViewById(R.id.textView1);

try {         
    final Bitmap bitmap = encodeAsBitmap(""+value, BarcodeFormat.CODE_128, 600, 300);

    if (bitmap != null) {
        // TODO Auto-generated method stub
        imv.setImageBitmap(bitmap);
        tv.setText(value);

        addview.setDrawingCacheEnabled(true);

        // this is the important code :)  
        // Without it the view will have a dimension of 0,0 and the bitmap will be null          
        addview.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
                        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        addview.layout(0, 0, addview.getMeasuredWidth(), addview.getMeasuredHeight()); 

        addview.buildDrawingCache(true);
        Bitmap b = Bitmap.createBitmap(addview.getDrawingCache());
        addview.setDrawingCacheEnabled(false); // clear drawing cache
        // saving the bitmap   
        savebarcode(b,value);
    }
} catch (WriterException e) {
    e.printStackTrace();
}

আমি মনে করি এই কোডটি কাউকে সাহায্য করবে ..


-1

এটি বিটম্যাপ পাওয়ার সহজ এবং দক্ষ উপায়

public void addView(View v) {
        v.setDrawingCacheEnabled(true);
        v.buildDrawingCache();

        Bitmap bitmap = v.getDrawingCache();

        if(bitmap == null) {
            // bitmap is null
            // do whatever you want
        } else {
            setImageBitmap(bitmap);
        }
        v.setDrawingCacheEnabled(false);
        v.destroyDrawingCache();
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.