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 die Ansicht tatsächlich zeichnen, bevor der Cache festgelegt wird?
Vielen Dank!
getDrawingCache()
VerwendungView#draw
derCanvas
AnnäherungAntworten:
Ich hatte auch dieses Problem und fand diese Antwort:
quelle
Wenn
getDrawingCache
es immerreturning null
Jungs gibt: benutze dies:Referenz: https://stackoverflow.com/a/6272951/371749
quelle
getLayoutParams
anstelle von v.getWidth () und v.getHeight () zu verwenden?ImageView
noch kein Bild erhalten haben. Es scheint also 0 zu sein. Dies würde für den Code verschiedener Personen unterschiedlich ablaufen , aber stellen Sie sicher, dass Ihr AnrufloadBitmapFromView()
definitiv danach erfolgt IhrImageView
enthält ein Bild.Der Hauptgrund, warum man Nullen bekommt, ist, dass die Ansicht nicht verkleinert ist. Alle Versuche mit view.getWidth (), view.getLayoutParams (). Width usw., einschließlich view.getDrawingCache () und view.buildDrawingCache (), sind nutzlos. Sie müssen also zuerst die Abmessungen für die Ansicht festlegen, z.
(Sie haben bereits 'Breite' und 'Höhe' nach Ihren Wünschen eingestellt oder mit WindowManager usw. erhalten.)
quelle
Ich benutze dies stattdessen.
quelle
Arbeite am besten 4me
quelle
Wenn die Ansicht, die Sie fangen möchten, wirklich auf dem Bildschirm angezeigt wird, aber null zurückgibt. Das heißt, Sie erfassen die Ansicht, bevor der Fenstermanager sie generiert. Einige Layouts sind sehr kompliziert. Wenn das Layout verschachtelte Layouts (layout_weight..etc) enthält, erhält das Relayout mehrmals genau die richtige Größe. Die beste Lösung besteht darin, zu warten, bis der Fenstermanager den Auftrag beendet hat, und dann einen Screenshot zu erhalten. Versuchen Sie, getDrawingCache () in den Handler einzufügen.
quelle
Die Antworten von @ cV2 und @ nininho funktionieren beide für mich.
Einer der anderen Gründe, warum ich es 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 stellen Sie sich eine Textansicht mit einem Zeichenfolgentext einer leeren Zeichenfolge vor ). In diesem Fall gibt getDrawingCache null zurück. Überprüfen Sie dies daher unbedingt. Hoffe das hilft einigen Leuten da draußen.
quelle
Der Fehler kann darin liegen, dass Ihre Ansicht zu groß ist, um in den Zeichnungscache zu passen .
Ich habe die Erklärung meines Problems "View.getDrawingCache gibt null zurück" aus meinen Protokollen erhalten:
In den Android-Dokumenten heißt es außerdem : Auf Android-Geräten können nur 16 MB Speicher für eine einzelne Anwendung verfügbar sein. Deshalb können Sie keine große Bitmap laden.
quelle
Ich versuche, die n Anzahl der Bilder dynamisch basierend auf der Ansicht zu erstellen.
Ich denke, dieser Code wird jemandem helfen ..
quelle
Dies ist der einfache und effiziente Weg, um eine Bitmap zu erhalten
quelle