Рисованные оттенки для 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
Теперь 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
}