wake-up-neo.net

Android - ImageView: setImageBitmap VS setImageDrawable

Was ist der Unterschied zwischen setImageBitmap und setImageDrawable?

Ich habe ein Bild, das ich dynamisch aus einer Datei setzen möchte. In dem von mir befolgten Tutorial heißt es, meine Bitmap in eine BitmapDrawable umzuwandeln und es mit setImageDrawable zu setzen. Ich habe bemerkt, dass das Einstellen der Bitmap direkt mit setImageBitmap auch funktioniert, aber ich bemerke keinen Unterschied.

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
BitmapDrawable bitmapDrawable = new BitmapDrawable(image);
imageView.setImageDrawable(bitmapDrawable);

OR

Bitmap image = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
imageView.setImageBitmap(image);
35
meeeee

Es gibt keinen Unterschied zwischen den beiden intern setImageBitmap ruft setImageDrawable auf.

Der folgende Code wird aus ImageView.Java von AOSP ausgewählt

public void setImageBitmap(Bitmap bm) {
    // if this is used frequently, may handle bitmaps explicitly
    // to reduce the intermediate drawable object
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}
75
nandeesh

Tatsächlich sehen Sie vielleicht den Unterschied, wenn Sie manchmal null als Argument verwenden:

imageView.setImageDrawable(null);
Drawable d = imageView.getDrawable(); // d == null

imageView.setImageBitmap(null);
Drawable d = imageView.getDrawable(); // d == some BitmapDrawable, != null

wenn Sie also prüfen, ob in ImageView ein Zeichnungssatz vorhanden ist, sollten Sie darauf achten.

17
Fenix Voltres

Ich habe gerade einen Artikel dazu geschrieben. Wünschen Sie Ihre Frage beantworten zu können.

https://plus.google.com/112740367348600290235/posts/VNAfFLDcKrw

ImageView verfügt über 4 APIs, um das Image anzugeben. Welches zu benutzen? Was ist der Unterschied?

  1. setImageDrawable (Drawable drawable)
  2. setImageBitmap (Bitmap bm)
  3. setImageResource (int resId)
  4. setImageURI (URI uri)

ImageView wird anhand des Namens verwendet, um ein Bild anzuzeigen. Aber was ist ein Bild? Eine Bitmap ist-ein Bild, nicht schwer zu verstehen und wir verwenden setImageBitmap für diesen Zweck. Intern hat ImageView jedoch eine Drawable, aber keine Bitmap, und dafür gibt es setImageDrawable. Wenn Sie setImageBitmap aufrufen, wird intern zuerst die Bitmap in BitmapDrawable, die IS-A Drawable ist, umbrochen und anschließend setImageDrawable aufgerufen.

Hier ist der Code.

public void setImageBitmap(Bitmap bm) {
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}

Was ist also mit der 3 und 4 API?

Sie sollten bereits wissen, dass dies eine Reihe von Möglichkeiten zum Erstellen einer Bitmap ist: aus einem Dateipfad, aus einem Eingabestrom, aus dem Uri oder aus der Ressourcendatei.

BitmapFactory.decodeFile(String pathName)
BitmapFactory.decodeStream(Inputstream)
BitmapFactory.decodeResource(Resource res, int id)
BitmapFactory.decodeByteArray(byte[] data)

Aus diesem Grund ist es leicht zu verstehen, dass setImageResource/setImageUri genauso ist wie setImageBitmap.

Zusammenfassend ist setImageDrawable die primitive Funktion, auf die sich andere APIs verlassen. Die anderen 3 sind nur Hilfsmethoden, mit denen Sie weniger Code schreiben.

Darüber hinaus ist es sehr wichtig zu wissen, dass ImageView tatsächlich eine Drawable hat, die nicht unbedingt eine BitmapDrawable sein muss! Sie können eine beliebige Drawable für die Bildansicht festlegen.

Neben dem Festlegen der Variable Drawable über die Java-API können Sie auch die XML-Zuordnung verwenden, um die Quelle Drawable für ImageView festzulegen. Siehe Beispiel unten. Beachten Sie, dass die Form entweder eine Bilddatei (.png, .jpg, .bmp) oder eine XML-Datei sein kann.

11
pierrotlefou

Beide Methoden sind gültig und erzielen das gleiche Ergebnis. In der ersten Methode wickeln Sie Ihre Bitmap um ein Zeichenobjekt, das eine Abstraktion für alles ist, was in einer Ansicht gezeichnet werden kann.

Das Besondere an Drawables ist, dass Sie damit alle Arten von Operationen an dem grafischen Objekt ausführen können, um das sie sich wickeln (Skalierung, Übersetzung, Deckkraft usw.).

Eine Bitmap ist eine Art von Drawable. Weitere Informationen zu Drawables finden Sie hier: http://developer.Android.com/guide/topics/resources/drawable-resource.html

Bei der zweiten Methode greifen Sie direkt auf die Bitmap-Bits zu, ohne darauf bezogene Operationen zeichnen zu können, und zeichnen die Bitmap einfach so, wie sie ist.

Hoffe das hilft, Prost, Max.

4
Max Raskin
public void setImageBitmap(Bitmap bm) {
// if this is used frequently, may handle bitmaps explicitly
// to reduce the intermediate drawable object
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}

der Unterschied ist vielleicht der mContext.getResources (), der von mContext.getResources () die Dichte des divice abrufen kann, daher unterscheidet sich die Anzeige auf sceen

0
lemon