Тоноване малювання для api <21


84

Чи можна зробити тонування, що малюється, для api <21?

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

Працює чудово, але лише для пристроїв з API21. Будь-яке обхідне рішення щодо нижчих пристроїв api або підтримки AppCompat? Нічого не можу знайти.

Відповіді:


106

Використовуйте 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.


66
З AppCompatImageViewdocs: This will automatically be used when you use ImageView in your layouts. You should only need to manually use this class when writing custom views. developer.android.com/reference/android/support/v7/widget/... Отже, використання нормального ImageViewв макеті має працювати нормально.
Німрод Даян

1
Як згадувалося вище @NimrodDayan, це не повинно бути необхідним. Однак я отримую звіти про android: tint, який не працює на Samsung A5 та Moto G (за допомогою appcompat-v7: 23.4.0), тож можливо, ImageViews не замінюються належним чином на деяких пристроях.
Стівен Кідсон,

@StephenKidson, я використовую ту саму версію appcompat, а також натрапив на ту саму проблему на пристрої невідомої торгової марки. Вам вдалося це вирішити? Цікаво, чи повідомляють про це помилку ...
Німрод Даян

4
Це не спрацювало на емуляторі Android 4.0 за допомогою appcompat-v7: 25.1.0.
Peterdk

4
AppCompatImageView не можна використовувати всередині віджета. Використовуйте setColorFilter на ImageView.
Массімо

46

Ви можете досягти цього за допомогою вихідного коду. Раніше тонування не підтримувалось 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));

18
Якщо вам потрібно підтримати тонування на <21 API, тоді ви, мабуть, хочете використовувати ContextCompat.getColor()замість getResources().getColor().
Севастьян Саванюк

22

Чи не могли б ви просто використати 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"
    />

2
Я використовую ImageView - для відображення в ньому значка. Ці піктограми є частиною елементів моєї панелі навігації. А вибраний елемент у шухляді навігації має різний колір, тому я створив кожну тоновану піктограму, а також селектор для кожної піктограми. І я використовую цей селектор для своєї піктограми. Селектор:<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@drawable/ic_home_tinted" /> <item android:drawable="@drawable/ic_home" /> </selector>
MaTTo

@Orochi Погляньте на мою відповідь, яка надходить безпосередньо з блогів Google. В основному він працює лише на Android 5.0+, але може працювати на деяких віджетах для пристроїв, що працюють до Android 5.0.
Джаред Берроус,

@Orochi Вам доведеться створювати власні подання, щоб "наслідувати" той самий ефект.
Джаред Берроус,

1
Ви можете скористатися переглядом зображення, зробити піктограму якомога білішою та зробити її будь-яким кольором за допомогою iv.setColorFilter (yourColor, Mode.Multiply); Переконайтеся, що ви імпортували android.graphics.PorterDuff.Mode
jb15613

3
Тут та сама проблема. На жаль, відтінок із селектором не працює з api <21
Луккас

17

Подібне запитання задавали і раніше тут: https://stackoverflow.com/a/26533340/950427

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 усі віджети підфарбовуються за допомогою атрибутів кольорової теми, про які ми щойно говорили. Існує дві основні функції, які дозволяють це використовувати на льодянику: підфарбовування, що малюється, та посилання на атрибути теми (форми? Attr / foo) у малюнках.

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

Все, що надає панель інструментів AppCompat (режими дій тощо) EditText Spinner CheckBox RadioButton Switch (використовуйте новий android.support.v7.widget.SwitchCompat) CheckedTextView Вам не потрібно робити нічого спеціального, щоб зробити цю роботу, просто використовуйте ці елементи керування в ваші макети, як зазвичай, і AppCompat зробить все інше (з деякими застереженнями; див. розділ поширених запитань нижче).

Джерела:

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

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


Чому це було проти? Це з офіційної документації.
Джаред Берроус,

Відповідь застаріла. ImageViewтакож тепер підтримує android:tintчерез AppCompat, як у відповіді @ Jonik.
Вікі Чійвані

@VickyChijwani Надішліть редагування. І ви маєте на увазі AppCompatImageView, ні ImageView.
Джаред Берроуз,

13

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


6

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


4

Використовуйте цей
xmlns NameSpace : app = "http://schemas.android.com/apk/res-auto"

і після того, як ви зможете замінити кожен android: tint на app: tint. Це вирішує проблему для мене.


4

Я трохи запізнився, але ось як це зробити.

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)
}

1

Це буде робити так, як вам хочеться, і повинно працювати на всіх версіях бібліотеки підтримки 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
}

1

Якщо хтось хоче створити новий малювальний (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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.