In meiner Anwendung muss ich ein großes Symbol für eine Benachrichtigung festlegen. LargeIcon muss eine Bitmap sein, und meine Zeichen sind Vektorgrafiken (die neue Funktion in Android, siehe diesen Link ). Das Problem ist, wenn ich versuche, eine Ressource zu dekodieren, die ein Vektorbild ist, wird eine Null zurückgegeben.
Hier ist das Codebeispiel:
if (BitmapFactory.decodeResource(arg0.getResources(), R.drawable.vector_menu_objectifs) == null)
Log.d("ISNULL", "NULL");
else
Log.d("ISNULL", "NOT NULL");
Wenn ich in diesem Beispiel R.drawable.vector_menu_objectifs durch ein "normales" Bild ersetze, beispielsweise ein PNG, ist das Ergebnis nicht null (ich erhalte die richtige Bitmap). Fehlt etwas?
Antworten:
Geprüft auf API: 17, 21, 23
AKTUALISIEREN:
Projektgradle:
Modul gradle:
quelle
AppCompatDrawableManager
ist als@RestrictTo(LIBRARY_GROUP)
intern gekennzeichnet und sollte nicht verwendet werden (die API kann ohne vorherige Ankündigung geändert werden). Verwenden SieContextCompat
stattdessen.Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
in dieser ZeileBitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Sie können die folgende Methode verwenden:
was ich manchmal kombiniere mit:
quelle
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
in dieser ZeileBitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Wenn Sie bereit sind, Android KTX für Kotlin zu verwenden, können Sie die Erweiterungsmethode verwenden
Drawable#toBitmap()
, um den gleichen Effekt wie bei den anderen Antworten zu erzielen:oder
Um diese und andere nützliche Erweiterungsmethoden hinzuzufügen, müssen Sie Ihrer Modulebene Folgendes hinzufügen
build.gradle
Sehen Sie hier für die neuesten Anleitungen zum Hinzufügen der Abhängigkeit zu Ihrem Projekt.
Beachten Sie, dass dies für jede Unterklasse von funktioniert.
Drawable
Wenn diesDrawable
eineBitmapDrawable
Verknüpfung ist, wird die zugrunde liegende Verknüpfung verwendetBitmap
.quelle
VectorDrawable
.Basierend auf den vorherigen Antworten kann es so vereinfacht werden, dass es sowohl mit VectorDrawable als auch mit BitmapDrawable übereinstimmt und mit mindestens API 15 kompatibel ist.
Dann müssen Sie in Ihre Gradle-Datei hinzufügen:
Auf Pre-Lollipop wird VectorDrawableCompat und auf Lollipop VectorDrawable verwendet.
BEARBEITEN
Ich habe die Bedingung nach dem Kommentar von @ user3109468 bearbeitet
quelle
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && drawable instanceof VectorDrawable)
Ein großes Lob an @Alexey
Hier ist die
Kotlin
Version mit Erweiterungen zuContext
Anwendungsbeispiel in
Activity
:quelle
Getestet auf API 16 - JellyBean mit Vector Drawables
quelle
Verwenden Sie den folgenden Code, um Bilder mit dem richtigen Seitenverhältnis zu konvertieren (z. B. für das Benachrichtigungssymbol):
quelle
Wenn Ihr
vector
BildintrinsicWidth
undintrinsicHeight
klein ist und Sie versuchen , die Bitmap in eine Großansicht angezeigt werden , dann werden Sie sehen das Ergebnis Unschärfe ist.In diesem Fall können Sie eine neue Breite / Höhe für Ihre Bitmap angeben, um ein besseres Bild zu erhalten (oder Sie können die Vektorgröße in XML erhöhen, aber die
desireWidth
unddesireHeight
möglicherweise flexibler angeben).Hoffe es hilft
quelle
quelle
Wenn Sie Ihre Ausgabe auf die gewünschte Ausgabegröße skalieren möchten, versuchen Sie das folgende Snippet:
quelle
Dadurch erhalten Sie die Bitmap in der gewünschten Größe. Darüber hinaus können Sie die Transparenz je nach Bild beibehalten oder nicht, um eine bessere Leistung bei denjenigen zu erzielen, die sie nicht benötigen.
quelle