Da der parameterlose Konstruktor BitmapDrawable
veraltet ist, müssen wir dem Konstruktor eine Ressourcen-ID geben.
Wo res
normalerweise getResources()
ist.
Warum benötigt der Konstruktor das und wie können wir diesen Wert definieren, wenn wir einen allgemeinen Image-Cache verwenden?
Warum benötigt der Konstruktor das?
Aus den Dokumenten von BitmapDrawable(Resources res, Bitmap bitmap)
:
Erstellen Sie ein Zeichen aus einer Bitmap, indem Sie die anfängliche Zieldichte basierend auf den Anzeigekennzahlen der Ressourcen festlegen.
Dies ist also erforderlich, um eine anfängliche Zieldichte unter Verwendung der Anzeigemetriken festzulegen, und DisplayMetrics
wird von der Resources
abgerufen, die Sie als Parameter für BitmapDrawable
bereitstellen.
Wie können wir diesen Wert definieren, wenn wir einen allgemeinen Image-Cache verwenden?
Entschuldigung, ich kann die Frage nicht verstehen. Können Sie umformulieren?
Wenn ich die Bitmap bereits selbst skaliert habe, warum benötigt BitmapDrawable Ressourcen?
Wie kann BitmapDrawable
wissen, dass Sie Bitmap
bereits skaliert haben? Normalerweise, wenn Sie ein BitmapDrawable
erstellen, sollten Sie nicht darauf achten, es selbst zu skalieren, deshalb ist das API so konzipiert.
Es scheint, als wäre die einzige Möglichkeit, die Skalierung beim Konvertieren einer Bitmap in eine Drawable zu vermeiden, die Verwendung des veralteten Konstruktors?
Obwohl es sich schlecht anhört, aber Sie können sehen, wie Klassen aus dem Übergangsframework diesen Konstruktor verwenden, z. ChangeBounds
, Crossfade
.
Ich habe Quellen ein wenig gegraben und habe diesen Teil des Codes in Bitmap
klasse herausgefunden:
Dies wird in der folgenden Kette aufgerufen:
%Vor% Was ist, wenn Sie die Dichte Ihres Bitmap
explizit auf DENSITY_NONE
setzen? Dann wird die if
Prüfung auf true
ausgewertet und es wird keine Skalierung durchgeführt.
Habe nicht getestet, sondern nur auf Quellen basierende Annahmen getroffen.
In diesem Konstruktor wird getResources () benötigt, um die anfängliche Zieldichte basierend auf den Anzeigemetriken der Ressource festzulegen. Ich verstehe es so - Sie nehmen die Anzeige-Metriken, die Informationen über Größe, Dichte, Schriftart Skalierung enthalten und diese Informationen an den Konstruktor übergeben. Wahrscheinlich, wenn Sie in Ihrem res/
Ordner Bild in verschiedenen Größen haben - in entsprechenden Unterordner, wie drawable-ldpi
, drawable-hdpi
- erhalten Sie verschiedene Informationen.
Um es im Image-Cache zu verwenden, müssen Sie ihm einen Kontext übergeben und dann wie folgt aufrufen: Context ctx; ctx.getResources();
Hoffe das hilft.
Betrifft den veralteten Konstruktor und den neuen Konstruktor
%Vor%Der veraltete Konstruktor erstellt ein leeres Zeichen, das sich nicht mit der Dichte befasst. Der neue Konstruktor erstellt jedoch Zeichen aus einer Bitmap, wobei die anfängliche Zieldichte basierend auf den Anzeigemetriken der Ressourcen festlegt. Mit dem neuen Konstruktor erhalten Sie alle Möglichkeiten, die Sie mit Bitmap (letzte Klasse) haben können. Ссылка
Was passiert, wenn Sie die Bitmap-Variable nicht über Konstruktor übergeben?
Wenn Sie eine Variable aus dem Parameter übergeben, müssen Sie dort, wo Sie bestanden haben, keine neue Bitmap-Variable erstellen. Sie haben eine andere Variable erstellt, die nur auf Ihre Bitmap verweist (statische Referenz). Da Bitmaps großformatige Dateien sind, sparen Sie beim Übergeben von Referenzen viel Platz und Verarbeitungsleistung, die Sie zum Laden von Bitmaps in Ihrem ImageView verwenden mussten. Es hilft also, dass Sie OutOfMemory Exception
nicht erhalten.
ZB
%Vor%Eine andere Seite:
%Vor%Eine andere Idee , die Bitmap-Variable (android.graphics.Bitmap) übergeben wurde, ist, weil Bitmap Parcelable ist (wenn Parcelable implementiert wird). Parzellierbare Objekte können in Bundle enthalten sein. Und Bundles sind das Herzstück für IPCS (Interprocess-Kommunikation) und die Kommunikation über verschiedene Android-Komponenten).
Zum allgemeinen Bild-Cache
Sie richten alle notwendigen Dichte und andere Dinge aus dem Bitmap eine Variable über neue Konstruktor übergeben. Dann können Sie eine HashMap in Least Recently Used (Lru)
cache erstellen, wo Sie Ihre String key
definieren, um auf die konfigurierte Bitmap variable
hinzuweisen. Zum Beispiel LruCache . Jetzt haben Sie im letzten Cache Ihres Prozessors Bitmap konfiguriert. Das spart Ihnen viel Rechenleistung.
Hoffe, meine Antwort hilft Ihnen!
Tags und Links android android-drawable android-bitmap android-resources bitmapdrawable