Рисованные оттенки для API <21

Можно ли сделать рисованную тонировку для api < 21?

<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_calendar"
    android:tint="@color/primary" />

Работает просто отлично, но только для устройств с API21. Любой обходной путь для более низких устройств API или поддержки AppCompat? Ничего не могу найти.

7 ответов

Решение

Использовать AppCompatImageView вот так:

<android.support.v7.widget.AppCompatImageView
        android:id="@+id/my_appcompat_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/my_image"
        android:tint="#636363"
    />

Убедитесь, что у вас есть последние appcompat-v7 в вашем приложении build.gradle,

Пример: compile 'com.android.support:appcompat-v7:25.0.0' в вашем приложении build.gradle,

Вы можете добиться этого, используя исходный код. Ранее тонировка не поддерживалась 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));

Не могли бы вы просто использовать ImageView для отображения вашего Drawable? android:tint отлично работает на старых уровнях API.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_calendar"
    android:tint="@color/primary"
    />

Подобный вопрос уже задавался здесь: /questions/29385600/flazhok-tonirovki-na-pre-v21/29385626#29385626

Android Drawable Tinting поддерживается только в Android 5.0+ (API 21+). (Это говорит " At the moment this is limited to coloring the action bar and some widgets. ").

Тематизация

...

Когда вы устанавливаете эти атрибуты, AppCompat автоматически распространяет их значения на атрибуты платформы в API 21+. Это автоматически раскрасит строку состояния и запись обзора (последние).

На старых платформах AppCompat эмулирует цветовую тематику, где это возможно. На данный момент это ограничено окраской панели действий и некоторых виджетов.

А также

Тонировка виджетов

При работе на устройствах с Android 5.0 все виджеты окрашиваются с использованием атрибутов цветовой темы, о которых мы только что говорили. В Lollipop есть две основные функции, которые позволяют это: рисовать подкрашиванием и ссылаться на атрибуты темы (в форме? Attr / foo) в отрисовках.

AppCompat обеспечивает аналогичное поведение в более ранних версиях Android для подмножества виджетов пользовательского интерфейса:

Все, что обеспечивается панелью инструментов AppCompat (режимы действий и т. Д.) EditText Spinner CheckBox Переключатель RadioButton (используйте новый android.support.v7.widget.SwitchCompat) CheckedTextView Вам не нужно делать ничего особенного, чтобы сделать эту работу, просто используйте эти элементы управления в ваши макеты, как обычно, и AppCompat сделает все остальное (с некоторыми оговорками; см. FAQ ниже).

Источники:

http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

https://chris.banes.me/2014/10/17/appcompat-v21/

Теперь AppCompatImageView,AppCompatButton заменит ImageView, кнопку для поддержки оттенка на устройствах с более низким API. Проверьте ссылку для более подробной информации AppCompatImageView, AppCompatButton

Для тонирования изображений вы можете использовать imageView.setColorFilter(int color), Это работает с API 8 и работает для окрашивания моего черного изображения в цвет, который я хотел. Это может заменить setImageTintList() но просто используя android:tint также должен работать.

Используйте это NameSpace
XMLNS: приложение ="http://schemas.android.com/apk/res-auto"

и после вы можете заменить каждый Android: Tint с App: TINT. Это исправило проблему для меня.

Я немного опоздал, но вот как это сделать.

val textInput = EditText(context)

val drawable = ContextCompat.getDrawable(context, R.drawable.your_drawable)
        drawable?.let { myDrawable ->
            DrawableCompat.setTint(myDrawable, ContextCompat.getColor(context, R.color.your_color))
            textInput.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, myDrawable, null)
        }

Если кто-то хочет создать новый чертеж (tin1,tint2..), попробуйте это

<?xml version="1.0" encoding="utf-8"?>
<bitmap
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:src="@drawable/your_image"
  android:tint="@color/tint_color">
   </bitmap>

Это будет работать так, как вы хотите, и должно работать во всех версиях библиотеки поддержки Android:

@JvmStatic
fun getTintedDrawable(inputDrawable: Drawable, @ColorInt color: Int): Drawable {
    val wrapDrawable = DrawableCompat.wrap(inputDrawable.mutate())
    DrawableCompat.setTint(wrapDrawable, color)
    DrawableCompat.setTintMode(wrapDrawable, Mode.SRC_IN)
    return wrapDrawable
}
Другие вопросы по тегам