Tintado dibujable para api <21

84

¿Es posible hacer que el tintado dibujable funcione para api <21?

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

Funciona bien, pero solo para dispositivos con API21. ¿Alguna solución para dispositivos api inferiores o compatibilidad con AppCompat? No puedo encontrar nada.

MaTTo
fuente

Respuestas:

106

Use el me AppCompatImageViewgusta así:

<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"
    />

Asegúrese de tener lo último appcompat-v7en su aplicación build.gradle.

Ejemplo: compile 'com.android.support:appcompat-v7:25.0.0' en el build.gradle.

Sakiboy
fuente
66
De 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/… Entonces, usar lo normal ImageViewen el diseño debería funcionar bien.
Nimrod Dayan
1
Como @NimrodDayan mencionó anteriormente, esto no debería ser necesario. Sin embargo, recibo informes de android: tint no funciona en un Samsung A5 y Moto G (usando appcompat-v7: 23.4.0), por lo que es posible que los ImageViews no se reemplacen correctamente en algunos dispositivos.
Stephen Kidson
@StephenKidson, estoy usando la misma versión de appcompat y también encontré el mismo problema en un dispositivo de marca desconocida. ¿Conseguiste solucionar esto? Me pregunto si hay un error informado sobre esto ...
Nimrod Dayan
4
Esto no funcionó en el emulador de Android 4.0 con appcompat-v7: 25.1.0.
Peterdk
4
AppCompatImageView no se puede utilizar dentro de un widget. Utilice setColorFilter en ImageView.
Massimo
46

Puedes lograrlo usando el código fuente. Anteriormente, el teñido no era compatible con DrawableCompat. A partir de la biblioteca de soporte 22.1, puede hacerlo, pero debe hacerlo de esta manera:

Drawable normalDrawable = getResources().getDrawable(R.drawable.drawable_to_tint);
Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable);
DrawableCompat.setTint(wrapDrawable, getResources().getColor(R.color.colorPrimaryLight));
Simon K. Gerges
fuente
18
Si necesita admitir el teñido en <21 API, probablemente desee utilizar en ContextCompat.getColor()lugar de getResources().getColor().
Sevastyan Savanyuk
22

¿No podría simplemente usar un ImageView para mostrar su Drawable? android:tintfunciona bien en niveles de API anteriores.

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_calendar"
    android:tint="@color/primary"
    />
Jonik
fuente
2
Estoy usando ImageView - para mostrar el icono en él. Esos iconos son parte de elementos en mi cajón de navegación. Y el elemento seleccionado en el cajón de navegación tiene un color diferente, así que creé cada ícono teñido y también el selector para cada ícono. Y estoy usando ese selector para mi ícono. Selector:<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 el
@Orochi Eche un vistazo a mi respuesta, ya que proviene directamente de los blogs de Google. Principalmente, solo funciona en Android 5.0+, pero puede funcionar en algunos widgets para dispositivos con versiones anteriores a Android 5.0.
Jared Burrows
@Orochi Vas a tener que hacer vistas personalizadas para "emular" el mismo efecto.
Jared Burrows
1
Puede usar una vista de imagen, hacer que el icono sea lo más blanco posible y hacerlo del color que desee con iv.setColorFilter (yourColor, Mode.Multiply); Asegúrese de importar android.graphics.PorterDuff.Mode
jb15613
3
El mismo problema aqui. Lamentablemente, el tinte con selector no funciona con api <21
Luccas
17

Se ha hecho una pregunta similar antes aquí: https://stackoverflow.com/a/26533340/950427

Android Drawable Tinting solo es compatible con Android 5.0+ (API 21+). (Dice " At the moment this is limited to coloring the action bar and some widgets.").

Tematización

...

Cuando configura estos atributos, AppCompat propaga automáticamente sus valores a los atributos del marco en API 21+. Esto colorea automáticamente la barra de estado y la entrada de la tarea Descripción general (recientes).

En plataformas más antiguas, AppCompat emula la temática de color siempre que sea posible. Por el momento, esto se limita a colorear la barra de acción y algunos widgets.

Y

Tinte de widgets

Cuando se ejecuta en dispositivos con Android 5.0, todos los widgets están teñidos con los atributos del tema de color de los que acabamos de hablar.Hay dos características principales que permiten esto en Lollipop: tinte dibujable y atributos de tema de referencia (de la forma? Attr / foo) en dibujables.

AppCompat proporciona un comportamiento similar en versiones anteriores de Android para un subconjunto de widgets de IU:

Todo lo que proporciona la barra de herramientas de AppCompat (modos de acción, etc.) EditText Spinner CheckBox RadioButton Switch (use el nuevo android.support.v7.widget.SwitchCompat) CheckedTextView No necesita hacer nada especial para que estos funcionen, solo use estos controles en sus diseños como de costumbre y AppCompat hará el resto (con algunas advertencias; consulte las preguntas frecuentes a continuación).

Fuentes:

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

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

Jared Burrows
fuente
¿Por qué se votó en contra? Esto es de la documentación oficial.
Jared Burrows
La respuesta está desactualizada. ImageViewahora también es compatible a android:tinttravés de AppCompat, como en la respuesta de @ Jonik.
Vicky Chijwani
@VickyChijwani Envíe una edición. Y quieres decir que AppCompatImageViewno ImageView.
Jared Burrows
13

Ahora AppCompatImageView, AppCompatButton reemplazará el botón ImageView para admitir el tinte en dispositivos con API más baja. Consulte el enlace para obtener más detalles AppCompatImageView , AppCompatButton

Ankit Singh
fuente
6

Para teñir imágenes puedes usar imageView.setColorFilter(int color). Esto funciona desde API 8 y funcionó para teñir mi imagen de negro a un color que quería. Esto puede reemplazar, setImageTintList()pero solo usarlo android:tinttambién debería funcionar.

Peterdk
fuente
4

Utilice este
xmlns de NameSpace : app = "http://schemas.android.com/apk/res-auto"

y luego puedes reemplazar cada android: tint con app: tint. Esto me solucionó el problema.

seinta
fuente
4

Llego un poco tarde, pero he aquí cómo hacerlo.

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)
}
Loco
fuente
1

Esto hará lo que desee y debería funcionar en todas las versiones de Android de la biblioteca de soporte:

@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
}
desarrollador de Android
fuente
1

Si alguien quiere crear un nuevo dibujable (tin1, tint2 ..) intente esto

<?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>
Ranjith Kumar
fuente