Android View.getDrawingCache gibt null, nur null zurück

Würde jemand bitte versuchen, mir zu erklären warum

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!!! } 

Protokolliert IMMER, dass der Zeichnungscache null ist, und setzt die Bitmap auf null?

Muss ich tatsächlich die Ansicht zeichnen, bevor der Cache gesetzt ist?

Vielen Dank!

Ich hatte dieses Problem auch und fand diese Antwort:

 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 

Wenn getDrawingCache immer returning null Leute getDrawingCache : benutze dies:

 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; } 

Referenz: https://stackoverflow.com/a/6272951/371749

Der Grund, warum man Nullen bekommt, ist, dass die Ansicht nicht dimensioniert ist. Alle Versuche mit view.getWidth (), view.getLayoutParams (). Width usw. einschließlich view.getDrawingCache () und view.buildDrawingCache () sind nutzlos. Sie müssen also zuerst Dimensionen für die Ansicht festlegen, z. B .:

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

(Sie haben ‘width’ und ‘height’ nach Belieben gesetzt oder mit WindowManager usw. erhalten)

Ich benutze das stattdessen.

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

Wenn die zu erfassende Ansicht wirklich auf dem Bildschirm angezeigt wird, aber null zurückgibt. Das bedeutet, dass Sie die Ansicht abfangen, bevor der Fenstermanager sie generiert. Einige Layouts sind sehr kompliziert. Wenn das Layout verschachtelte Layouts, layout_weight..etc, enthält, verursacht es mehrmals, dass relayout genau die Größe erhält. Die beste Lösung besteht darin, zu warten, bis der Fenstermanager den Job beendet und dann den Screenshot erstellt hat. Versuchen Sie, getDrawingCache () in Handler zu setzen.

Arbeite am besten 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); 

@ cV2 und @ nininhos Antworten funktionieren beide für mich.

Einer der anderen Gründe, die ich auf die harte Tour herausgefunden habe, war, dass die Ansicht, die ich hatte, eine Ansicht mit einer Breite und Höhe von 0 erzeugte ( dh ein TextView mit einem Text einer leeren Zeichenkette ). In diesem Fall gibt getDrawingCache null zurück, also achten Sie darauf, das zu überprüfen. Hoffe, das hilft einigen Leuten da draußen.

Ich versuche, die n Anzahl von Bildern dynamisch basierend auf Ansicht zu erstellen.

  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); }else{ } } catch (WriterException e) { e.printStackTrace(); } 

Ich denke dieser Code wird jemandem helfen ..

Der Fehler liegt möglicherweise daran, dass Ihre Ansicht zu groß ist, um in den Zeichnungscache zu passen .

Ich habe die Erklärung meines Problems “View.getDrawingCache gibt null” von meinen Protokollen erhalten:

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

Android-Dokumentation sagt auch : Android-Geräte können so wenig wie 16 MB Speicher für eine einzelne Anwendung zur Verfügung haben. Deshalb können Sie keine große Bitmap laden.

Dies ist die einfache und effiziente Möglichkeit, Bitmap zu erhalten

 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(); }