Was ist "Ressourcen" im BitmapDrawable Konstruktor wirklich?

9

Da der parameterlose Konstruktor BitmapDrawable veraltet ist, müssen wir dem Konstruktor eine Ressourcen-ID geben.

%Vor%

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?

    
frankish 17.02.2015, 08:05
quelle

3 Antworten

4
  

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:

%Vor%

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.

%Vor%

Habe nicht getestet, sondern nur auf Quellen basierende Annahmen getroffen.

    
azizbekian 24.07.2017 18:38
quelle
3

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.

    
Krzysztof Kacprzak 17.02.2015 09:05
quelle
0

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!

    
Uddhav Gautam 31.07.2017 16:45
quelle