Intereting Posts
Возобновить приложение и стек из уведомления Android Studio – создание модулей без копирования файлов? Ошибка подключения к серверу была неудачной при запуске приложения phonegap в эмуляторе Android Служба адаптера синхронизации экспортирована, но незащищена Как получить «сетевое» время (из параметра «Автоматический» под названием «Использовать сетевые значения»), а не время на телефоне? После того, как кнопки изменения ориентации на виджете не отвечают Не удалось скрыть индикатор прогресса после загрузки изображения в picasso? Как читать данные из Firebase ONCE с помощью java / android? Выберите подмножество символов во многих строках (выбор столбцов) в Eclipse / Android Studio Масштабировать, чтобы соответствовать всем маркерам на карте google maps v2 Как я могу заполнить RecyclerView с помощью GridLayoutManager справа налево Получить значок файла apk, версию, имя Как использовать шрифт Roboto в android Project Как иметь несколько экземпляров службы на Android Просмотр прокрутки Overlap с помощью AppBarLayout

Android: оттенок с использованием DrawableCompat

Я пытаюсь подкрасить изображение до уровня API Android уровня 21. Я успешно обрабатывал элементы, используя:

<android:tint="@color/red"/> 

Однако я не могу понять, как это сделать с помощью кода в ImageView:

 Drawable iconDrawable = this.mContext.getResources().getDrawable(R.drawable.somedrawable); DrawableCompat.setTint(iconDrawable, this.mContext.getResources().getColor(R.color.red)); imageView.setImageDrawable(iconDrawable); 

Я попытался установить TintMode, но это, похоже, не отличается. Я неправильно использую класс совместимости v4 DrawableCompat?

Solutions Collecting From Web of "Android: оттенок с использованием DrawableCompat"

Самый простой способ подкрасить кросс-платформу (если вам не нужен ColorStateList):

 drawable.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN); 

Не забудьте мутировать Drawable перед применением фильтра.

В случае, если кто-то должен использовать тонирование DrawableCompat , не затрагивая другие чертежи, вот как вы это делаете с помощью mutate() :

 Drawable drawable = getResources().getDrawable(R.drawable.some_drawable); Drawable wrappedDrawable = DrawableCompat.wrap(drawable); wrappedDrawable = wrappedDrawable.mutate(); DrawableCompat.setTint(wrappedDrawable, getResources().getColor(R.color.white)); 

Который может быть упрощен:

 Drawable drawable = getResources().getDrawable(R.drawable.some_drawable); drawable = DrawableCompat.wrap(drawable); DrawableCompat.setTint(drawable.mutate(), getResources().getColor(R.color.white)); 

Ранее тонирование не поддерживалось DrawableCompat . Начиная с библиотеки поддержки 22.1 вы можете это сделать, но вам нужно сделать это следующим образом:

 Drawable normalDrawable = getResources().getDrawable(R.drawable.drawable_to_tint); Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable); DrawableCompat.setTint(wrapDrawable, getResources().getColor(R.color.colorPrimaryLight)); 

Ответы здесь не работают для pre-lollipop-устройств (SupportLib 23.4.0), но я опубликовал обходной путь, который работает для API 17 и выше: https://stackoverflow.com/a/37434219/2170109

Следующий код был протестирован и работает над API 17, 19, 21, 22, 23 и N Preview 3:

  // https://stackoverflow.com/a/30928051/2170109 Drawable drawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.vector)); image.setImageDrawable(drawable); /* * need to use the filter | https://stackoverflow.com/a/30880522/2170109 * (even if compat should use it for pre-API21-devices | https://stackoverflow.com/a/27812472/2170109) */ int color = ContextCompat.getColor(context, R.color.yourcolor); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { DrawableCompat.setTint(drawable, color); } else { drawable.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN); } 

Если вы посмотрите на исходный код для DrawableCompat, вы увидите, что для любой версии <21 метод ничего не делает .

Идея DrawableCompat кажется просто не сбой на старых версиях, а не фактическое предоставление этой функциональности.

В библиотеке поддержки 22.1 вы можете использовать DrawableCompat для рисования строк.

DrawableCompat.wrap (Drawable) и setTint (), setTintList () и setTintMode () будут работать: нет необходимости создавать и поддерживать отдельные чертежи только для поддержки нескольких цветов!

Я поделюсь своим решением здесь, потому что это может сэкономить время кому-то.

У меня был ImageView с векторным drawable, который использовался в качестве исходного ресурса (на самом деле это была поддержка Vector Drawable из Android Support Library 23.3). Итак, сначала я обернул его так:

mImageView.setImageDrawable(DrawableCompat.wrap(mImageView.getDrawable()));

И после этого я попытался применить оттенок к нему так:

 DrawableCompat.setTint( mImageView.getDrawable(), getResources().getColor(R.color.main_color) ); 

Не повезло.

Я попытался вызвать mutate() на wrapped drawable, а также на оригинальную drawable – все равно не повезло. mImageView invalidate() вызванный mImageView сделал трюк.