В моем приложении я должен установить большой значок для уведомления. LargeIcon должен быть растровым изображением, а мои чертежи - это векторные изображения (новая функция в Android, см. Эту ссылку ). Проблема в том, что когда я пытаюсь декодировать ресурс, который является векторным изображением, я получаю значение null.
Вот пример кода:
if (BitmapFactory.decodeResource(arg0.getResources(), R.drawable.vector_menu_objectifs) == null)
Log.d("ISNULL", "NULL");
else
Log.d("ISNULL", "NOT NULL");
В этом примере, когда я заменяю R.drawable.vector_menu_objectifs «нормальным» изображением, например png, результат не равен нулю (я получаю правильное растровое изображение) Что-то мне не хватает?
Ответы:
Проверено по API: 17, 21, 23
ОБНОВИТЬ:
Градл проекта:
Модуль gradle:
источник
AppCompatDrawableManager
помечен как@RestrictTo(LIBRARY_GROUP)
внутренний, и вам не следует его использовать (API может быть изменен без уведомления).ContextCompat
Вместо этого используйте .Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
на этой линииBitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Вы можете использовать следующий метод:
которые я иногда комбинирую с:
источник
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.setHasAlpha(boolean)' on a null object reference
на этой линииBitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Если вы хотите использовать Android KTX для Kotlin, вы можете использовать метод расширения
Drawable#toBitmap()
для достижения того же эффекта, что и другие ответы:или
Чтобы добавить этот и другие полезные методы расширения, вам необходимо добавить следующее на свой уровень модуля
build.gradle
См. Здесь последние инструкции по добавлению зависимости в ваш проект.
Обратите внимание, что это будет работать для любого подкласса,
Drawable
и если этоDrawable
-BitmapDrawable
ярлык для использования базового классаBitmap
.источник
VectorDrawable
.Основываясь на предыдущих ответах, его можно упростить таким образом, чтобы он соответствовал как VectorDrawable, так и BitmapDrawable и был совместим как минимум с API 15.
Затем вам нужно добавить в свой файл gradle:
В версии до Lollipop он будет использовать VectorDrawableCompat, а в Lollipop - VectorDrawable.
РЕДАКТИРОВАТЬ
Я отредактировал условие после комментария @ user3109468
источник
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && drawable instanceof VectorDrawable)
Престижность @Alexey
Вот
Kotlin
версия, использующая расширения дляContext
Пример использования в
Activity
:источник
Протестировано на API 16 - JellyBean с векторными чертежами
источник
Используйте следующий код для преобразования изображения с правильным соотношением сторон (например, для значка уведомления):
источник
Если ваше
vector
изображениеintrinsicWidth
иintrinsicHeight
маленькое, и вы пытаетесь отобразить растровое изображение в большом виде, вы увидите, что результатом является размытие.В этом случае вы можете указать новую ширину / высоту для своего растрового изображения, чтобы получить лучшее изображение (или вы можете увеличить размер вектора в xml, но предоставить
desireWidth
иdesireHeight
может быть более гибким).Надеюсь, это поможет
источник
источник
Если вы хотите масштабировать вывод до желаемого размера, попробуйте следующий фрагмент:
источник
Это дает вам растровое изображение нужного размера. Кроме того, он позволяет поддерживать или нет прозрачность в зависимости от каждого изображения для лучшей производительности с теми, которым это не нужно.
источник