Dans mon application, je dois définir une grande icône pour une notification. LargeIcon doit être un Bitmap, et mes drawables sont des images vectorielles (la nouvelle fonctionnalité d'Android, voir ce lien ) Le problème est que lorsque j'essaye de décoder une ressource qui est une image vectorielle, j'obtiens un null retourné.
Voici l'exemple de code:
if (BitmapFactory.decodeResource(arg0.getResources(), R.drawable.vector_menu_objectifs) == null)
Log.d("ISNULL", "NULL");
else
Log.d("ISNULL", "NOT NULL");
Dans cet exemple, lorsque je remplace R.drawable.vector_menu_objectifs par une image "normale", un png par exemple, le résultat n'est pas nul (j'obtiens le bon bitmap) Est-ce qu'il me manque quelque chose?
Réponses:
Vérifié sur l'API: 17, 21, 23
METTRE À JOUR:
Gradle du projet:
Gradle du module:
la source
AppCompatDrawableManager
est marqué comme étant@RestrictTo(LIBRARY_GROUP)
interne et vous ne devez pas l'utiliser (son API peut changer sans préavis). UtilisezContextCompat
plutôt.Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
sur cette ligneBitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Vous pouvez utiliser la méthode suivante:
que je combine parfois avec:
la source
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
sur cette ligneBitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Si vous souhaitez utiliser Android KTX pour Kotlin, vous pouvez utiliser la méthode d'extension
Drawable#toBitmap()
pour obtenir le même effet que les autres réponses:ou
Pour ajouter ceci et d'autres méthodes d'extension utiles, vous devrez ajouter ce qui suit à votre module au niveau
build.gradle
Voir ici pour les dernières instructions pour ajouter la dépendance à votre projet.
Notez que cela fonctionnera pour toute sous-classe de
Drawable
et si leDrawable
est un,BitmapDrawable
il sera raccourci pour utiliser le sous-jacentBitmap
.la source
VectorDrawable
.Sur la base des réponses précédentes, il peut être simplifié comme ça pour correspondre à la fois à VectorDrawable et BitmapDrawable et pour être compatible avec au moins l'API 15.
Ensuite, vous devez ajouter dans votre fichier gradle:
Sur pré-Lollipop, il utilisera VectorDrawableCompat et sur Lollipop, il utilisera VectorDrawable.
ÉDITER
J'ai modifié la condition suite au commentaire de @ user3109468
la source
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && drawable instanceof VectorDrawable)
Félicitations à @Alexey
Voici la
Kotlin
version utilisant des extensions pourContext
Exemple d'utilisation dans
Activity
:la source
Testé sur l'API 16 - JellyBean avec Vector Drawables
la source
Utilisez le code suivant pour convertir l'image avec le rapport hauteur / largeur correct (par exemple, pour l'icône de notification):
la source
Si votre
vector
image deintrinsicWidth
etintrinsicHeight
est petit et que vous essayez d'afficher le bitmap à une grande vue, vous verrez le résultat est flou.Dans ce cas, vous pouvez fournir une nouvelle largeur / hauteur pour votre bitmap pour obtenir la meilleure image (ou vous pouvez augmenter la taille du vecteur en xml, mais fournir le
desireWidth
etdesireHeight
peut être plus flexible).J'espère que ça aide
la source
la source
Si vous souhaitez pouvoir mettre à l'échelle votre sortie à une taille de sortie souhaitée, essayez l'extrait de code suivant:
la source
Cela vous donne le bitmap dans la taille souhaitée. De plus, il permet de conserver ou non la transparence en fonction de chaque image pour de meilleures performances avec celles qui n'en ont pas besoin.
la source