Was ist der Unterschied zwischen Bitmap und Drawable in Android?

74

Ich habe gegoogelt, aber ich konnte keinen Artikel finden, der den Unterschied zwischen Bitmap und Drawable in Android beschreibt.

Nikhil C George
quelle
1
Diese Lösung sollte in der Lage sein, Ihre Fragen zu beantworten: Lösung
Jrom

Antworten:

72

Eine Bitmap ist eine Darstellung eines Bitmap-Bildes (so etwas wie java.awt.Image). Ein Drawable ist eine Abstraktion von "etwas, das gezeichnet werden kann". Es kann sich um eine Bitmap (als BitmapDrawable) verpackt handeln , es kann sich jedoch auch um eine Volltonfarbe, eine Sammlung anderer zeichnbarer Objekte oder eine beliebige Anzahl anderer Strukturen handeln.

Die meisten Android-UI-Frameworks arbeiten gerne mit Drawable-Objekten, nicht mit Bitmap-Objekten. Eine Ansicht kann jedes Drawable als Hintergrund akzeptieren. Eine ImageView kann ein Drawable im Vordergrund anzeigen. Als Ressourcen gespeicherte Bilder werden als zeichnbare Objekte geladen.

Ted Hopp
quelle
3
Wenn eine BitmapDrawable eine Bitmap umschließt, was würde passieren, wenn wir recycle () für die darin enthaltene Bitmap aufrufen? Was macht recycle () für API11 und höher?
Android-Entwickler
@androiddeveloper - Ich bin nicht sicher, aber es wird nichts Gutes sein. Sobald eine Bitmap von einer BitmapDrawable umschlossen ist, "besitzt" die Drawable die Bitmap und soll ihre Lebensdauer verwalten. Wenn Sie anrufen recycle(), stören Sie diese Beziehung. Bestenfalls wird der Zeichner nichts zeichnen; Wahrscheinlicher ist, dass später eine Ausnahme ausgelöst wird. Nach der Dokumentation , recycle()mit API11 + die gleiche Sache tut es immer tat: sie ermöglicht es Ihnen , die nativen Pixel so schnell zu befreien , wie Sie wissen , dass Sie mit ihnen fertig sind.
Ted Hopp
Sie sagen dort, dass es den nativen Speicher der Bitmap freigibt, aber wir wissen, dass sich ab API 11 alles, was mit der Bitmap zu tun hat (einschließlich ihrer Rohdaten), im Heap befindet, so dass das Recyceln eine seltsame Sache zu sein scheint ...
Android-Entwickler
@androiddeveloper - Wenn man sich die Quelle ansieht , scheint es immer noch eine native Bitmap zu geben. Aus Leistungsgründen wird der Rohpuffer als öffentliches Mitglied verfügbar gemacht (obwohl er immer noch vor der öffentlichen API verborgen ist). Durch das Aufrufen recycle()wird die native Bitmap weiterhin freigegeben. Außerdem wird der Elementpuffer auf gesetzt null.
Ted Hopp
Ja, ich habe es auch gelesen, aber es macht keinen Sinn, da sie auf Google IO sagten, dass die Bitmap nicht mehr im nativen Speicher gespeichert ist. Ich bin wirklich verwirrt darüber, wie es sein könnte.
Android-Entwickler
39

Drawable ist etwas, das gezeichnet werden kann. ZB Layout, Vektorbild (Linie, Kreis), Schriftart, Bild und so weiter

Bitmap - ist eine bestimmte Art von Drawable, bei der es sich um ein Bild handelt, z. B.: PNG, JPEG oder so

Barmaley
quelle
10
Eine Bitmap ( android.graphics.Bitmap) ist keine Unterklasse von Drawable ( android.graphics.drawable.Drawable).
Ted Hopp
Klar, es ist meine Schuld. Ich meinte BitmapDrawable
Barmaley
Aber sie sagen Bitmap: das einfachste Drawable, ein PNG- oder JPEG-Bild. in docs.
Mallaudin
1
Ich dachte, ich hätte von diesem Link eingefügt. developer.android.com/guide/topics/resources/…
mallaudin
31

Bitmap ist kein Bild. Bitmap ist eine Bitkarte (Notizname: Bitmap). Und diese Karte repräsentiert Pixel, auf die Sie etwas zeichnen können. Dies kann Ihre eigene benutzerdefinierte Bitmap (kein Bild) sein, z. B. Quadrat:

Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);

oder Sie können ein Bitmap-Objekt aus dem Bild erstellen:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);    

Eine Bitmap ist ein Pixelhalter. Und Canvas wird verwendet, um etwas auf Ihre Bitmap zu zeichnen (auf Bitmap-Pixeln).

Alles über Drawable ist oben gut beschrieben.

TL; DR

Einige Leute schreiben, dass Sie auf Leinwand zeichnen. Sie zeichnen nicht auf Leinwand. Sie zeichnen mit der Canvas-Hilfsmethode auf Bitmap-Pixel.

Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.RED) // now all bitmap pixels became red
Bitvale
quelle
Schöne Antwort verdient +1 :) Danke für die Erklärung durch Codezeilen.
Harshit Agrawal
perfekt erklärt
Tushar Srivastava
13

Zeichnbare Ressource

Eine DrawableRessource ist ein allgemeines Konzept für eine Grafik, die auf den Bildschirm gezeichnet werden kann und die Sie mit APIs wie getDrawable(int)oder auf eine andere XML-Ressource mit Attributen wie android:drawableund anwenden können android:icon. Es gibt verschiedene Arten von Zeichen:

  • Bitmap-Datei , Eine Bitmap-Grafikdatei (.png, .jpg oder .gif) erstellt eine BitmapDrawable.

  • Nine-Patch-Datei , Eine PNGDatei mit dehnbaren Bereichen, um die Bildgröße basierend auf dem Inhalt (.9.png) zu ändern, erstellt eine NinePatchDrawable.

  • Layer List , A Drawable, die ein Array anderer Drawables verwaltet. Diese werden in Array-Reihenfolge gezeichnet, sodass das Element mit dem größten Index oben gezeichnet wird LayerDrawable.

  • Statusliste , Eine XMLDatei, die auf verschiedene Bitmap-Grafiken für verschiedene Status verweist (z. B. um beim Drücken einer Schaltfläche ein anderes Bild zu verwenden), erstellt eine StateListDrawable.

  • Ebenenliste , Eine XMLDatei, die eine definiert Drawable, die eine Anzahl von Alternativen verwaltet Drawable, denen jeweils ein maximaler numerischer Wert zugewiesen wurde, erstellt eine LevelListDrawable.

  • Transition Drawable , Eine XMLDatei, die eine definiert Drawable, die zwischen zwei DrawableRessourcen überblenden kann , erstellt eine TransitionDrawable.

  • Inset Drawable , Eine XMLDatei, die eine definiert, die eine Drawableandere Drawableum einen bestimmten Abstand einfügt . Dies ist nützlich, wenn ein ViewHintergrund benötigt Drawblewird, der kleiner als die tatsächlichen Grenzen der Ansicht ist.

  • Clip Drawable , Eine XMLDatei, die eine definiert, die eine Drawableandere Drawableauf der Grundlage Drawabledes aktuellen Ebenenwerts schneidet , erstellt eine ClipDrawable.

  • Scale Drawable , Eine XMLDatei, die eine definiert Drawable, die die Größe einer anderen Drawablebasierend auf ihrem aktuellen Ebenenwert ändert , erstellt eine ScaleDrawable.

  • Form zeichnbar , Eine XMLDatei, die eine geometrische Form einschließlich Farben und Verläufen definiert, erstellt eine ShapeDrawable.

Informationen zum Erstellen einer finden Sie auch im Dokument Animationsressource AnimationDrawable .

Hinweis: Eine Farbressource kann auch als verwendet werden , Ddrawablein XML. Wenn Sie beispielsweise eine erstellen StateListDrawable, können Sie auf eine Farbressource für das android:drawableAttribut ( android:drawable="@color/green") verweisen .

Bitmap

Ein Bitmap-Bild. Android unterstützt Bitmap-Dateien in drei Formaten: .png (bevorzugt), .jpg (akzeptabel), .gif (nicht empfohlen).

Sie können direkt auf eine Bitmap-Datei verweisen, indem Sie den Dateinamen als Ressourcen-ID verwenden, oder eine Alias-Ressourcen-ID in XML erstellen.

Hinweis: Bitmap-Dateien können während des Erstellungsprozesses automatisch mit verlustfreier Bildkomprimierung durch das aapt-Tool optimiert werden. Beispielsweise kann ein Echtfarben-PNG, das nicht mehr als 256 Farben benötigt, in ein 8-Bit-PNG mit einer Farbpalette konvertiert werden. Dies führt zu einem Bild gleicher Qualität, das jedoch weniger Speicher benötigt. Beachten Sie daher, dass sich die in diesem Verzeichnis platzierten Image-Binärdateien während des Builds ändern können. Wenn Sie ein Bild als Bitstrom lesen möchten, um es in eine Bitmap zu konvertieren, legen Sie Ihre Bilder res/raw/stattdessen in dem Ordner ab, in dem sie nicht optimiert werden.

Misbah Farooqi
quelle