Ich werde versuchen zu erklären, was genau ich tun muss.
Ich habe 3 separate Bildschirme, sagen A, B, C. Es gibt einen weiteren Bildschirm namens say HomeScreen, auf dem alle 3 Bildschirm-Bitmaps in der Galerieansicht angezeigt werden sollen und der Benutzer auswählen kann, in welche Ansicht er gehen möchte.
Ich konnte die Bitmaps aller 3 Bildschirme abrufen und in der Galerieansicht anzeigen, indem ich den gesamten Code nur in der HomeScreen-Aktivität platzierte. Dies hat den Code sehr kompliziert gemacht und ich möchte ihn vereinfachen.
Kann ich also eine andere Aktivität von HomeScreen aus aufrufen und nicht anzeigen und nur die Bitmap dieses Bildschirms abrufen? Angenommen, ich rufe nur HomeScreen auf und es werden die Aktivitäten A, B, C aufgerufen, und keine der Aktivitäten von A, B, C wird angezeigt. Es gibt nur die Bitmap dieses Bildschirms von getDrawingCache (). Und dann können wir diese Bitmaps in der Galerieansicht in HomeScreen anzeigen.
Ich hoffe, ich habe das Problem sehr klar erklärt.
Bitte lassen Sie mich wissen, ob dies tatsächlich möglich ist.
Antworten:
Es gibt einen Weg, dies zu tun. Sie müssen eine Bitmap und eine Leinwand erstellen und view.draw (Zeichenfläche) aufrufen.
Hier ist der Code:
Wenn die Ansicht nicht vor der Größe angezeigt wurde, ist sie Null. Es ist möglich, es so zu messen:
BEARBEITEN: Laut diesem Beitrag ist das Übergeben
WRAP_CONTENT
als Wert anmakeMeasureSpec()
nichts Gutes (obwohl es für einige Ansichtsklassen funktioniert). Die empfohlene Methode lautet:quelle
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
, damit es richtig funktioniert, aber danke für den Code :)v.measure(0, 0); v.getMeasuredWidth(); v.getMeasuredHeight();
.Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Funktioniert besserHier ist meine Lösung:
Genießen :)
quelle
Versuche dies,
quelle
Ich weiß, dass dies ein veraltetes Problem sein kann, aber ich hatte Probleme, eine dieser Lösungen für mich zum Laufen zu bringen. Insbesondere stellte ich fest, dass Änderungen an der Ansicht nach dem Aufblasen nicht in die gerenderte Bitmap übernommen werden.
Hier ist die Methode, die für meinen Fall funktioniert hat. Mit einer Einschränkung jedoch. Vor dem Anruf habe
getViewBitmap(View)
ich meine Ansicht aufgeblasen und sie gebeten, mit bekannten Abmessungen zu gestalten. Dies war erforderlich, da mein Ansichtslayout die Höhe / Breite auf Null setzen würde, bis der Inhalt darin platziert wurde.Die "magische Sauce" für mich wurde hier gefunden: https://groups.google.com/forum/#!topic/android-developers/BxIBAOeTA1Q
Prost,
Levi
quelle
measure()
undlayout()
bevor ich meine Ansicht füllte, hatte ich seltsame Ergebnisse. Das Verschieben dieser Anrufe nach oben hatcreateBitmap()
es für mich behoben!In Android KTX gibt es eine großartige Kotlin-Erweiterungsfunktion:
View.drawToBitmap(Bitmap.Config)
quelle
Hoffe das hilft
Die Aktualisierungsmethode
getDrawingCache()
ist in API-Ebene 28 veraltet. Suchen Sie daher nach einer anderen Alternative für API-Ebene> 28.quelle
getDrawingCache
ist derzeit veraltet.Ich finde das etwas besser:
Mit dem obigen Code müssen Sie die Größe der Bitmap nicht angeben (verwenden Sie 0 für Breite und Höhe), wenn Sie die der Ansicht selbst verwenden möchten.
Wenn Sie spezielle Ansichten (z. B. SurfaceView, Surface oder Window) in eine Bitmap konvertieren möchten, sollten Sie stattdessen die PixelCopy- Klasse verwenden. Es erfordert jedoch API 24 und höher. Ich weiß vorher nicht, wie ich es machen soll.
quelle
Layout oder Ansicht zur Bitmap:
Aufrufmethode:
quelle
quelle