Es posible que haya utilizado la identificación del recurso entero en lugar del valor de color entero, intente convertir R.color.blue en getResources (). GetColor (R.color.blue)
milosmns
Drawable drawable = ...; drawable.setColorFilter (ContextCompat.getColor (contexto, R.color.white), PorterDuff.Mode.DST); imageView.setImageDrawable (dibujable); // se puede usar cualquier color aquí
flame3
Respuestas:
916
Puede cambiar el tinte, bastante fácilmente en el código a través de:
ACTUALIZACIÓN :
@ADev tiene una solución más nueva en su respuesta aquí , pero su solución requiere una biblioteca de soporte más nueva: 25.4.0 o superior.
Debería ser la respuesta aceptada. Tenga en cuenta que solo funciona en ImageViewinstancias xml con el tema AppCompat o en AppCompatImageViewsubclases.
Louis CAD
1
@ADev aprecia su solución, pero la pregunta se hizo en 2013 y ImageViewCompat y AppCompatImageView con v4 soportan lib 25.4.0 en junio de 2017 y 25.1.0 de diciembre de 2016 respectivamente :)
Hardik
1
@ADev, por supuesto, pero no ha mencionado correctamente en su respuesta que su solución es nueva y requiere una biblioteca de soporte más nueva 25.4.0 y superior porque con una versión más baja de lib de soporte, esta clase no está disponible, ¡así que nadie podría encontrarla! !! por cierto edité la respuesta :) buen día ...
sí, funcionó para mí también, sin el segundo parámetro ... también puede funcionarmImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskrem Muhammad
votado y sin el segundo parámetro, funciona a las mil maravillas. Thx @ toobsco42
Ravi Vaniya
35
@Hardik tiene razón. El otro error en su código es cuando hace referencia a su color definido por XML. Pasó solo la identificación al setColorFiltermétodo, cuando debe usar la identificación para ubicar el recurso de color y pasar el recurso alsetColorFilter método. Reescribiendo su código original a continuación.
De lo contrario, debe hacer referencia a su actividad principal:
Activity main =...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);
Tenga en cuenta que esto también es cierto para los otros tipos de recursos, como enteros, bools, dimensiones, etc. Excepto para la cadena, para la cual puede usar directamente getString()en su actividad sin la necesidad de llamar primerogetResources() (no me pregunte por qué) .
De lo contrario, su código se ve bien. (Aunque no he investigado setColorFilterdemasiado el método ...)
Mejor función de extensión simplificada gracias a ADev
fun ImageView.setTint(@ColorRes colorRes:Int){ImageViewCompat.setImageTintList(this,ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))}
¿Hay uno similar para el tinte de texto de Button / TextView?
Desarrollador de Android
¿te refieres al color o tinte del texto de la vista de texto para dibujar vista de texto?
Manohar Reddy
Me refiero a "tinte de texto". El color del texto. Pero creo que es bastante problemático, ya que el texto tiene un color para cada estado ... Por otra parte, ¿cómo es que funciona bien cuando configuro el color de acento ... Extraño ... ¿Es posible quizás establecer el color de acento en un botón específico (o TextView), programáticamente?
Desarrollador de Android el
12
Prueba esto. Debería funcionar en todas las versiones de Android que admite la biblioteca de soporte:
//get ImageViewImageView myImageView =(ImageView) findViewById(R.id.iv);//colorid is the id of a color defined in values/colors.xml
myImageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.colorid)));
Esto solo parece funcionar en API 21+, pero para mí eso no fue un problema. Puede usar un ImageViewCompat para resolver ese problema, aunque.
Comenzando en Lollipop, hay un método llamado ImageView#setImageTintList()que puedes usar ... la ventaja es que toma unColorStateList un solo color en lugar de un solo color, lo que hace que el tinte de la imagen sea consciente del estado.
En los dispositivos anteriores a Lollipop, puede obtener el mismo comportamiento al teñir el dibujable y luego configurarlo como la ImageViewimagen dibujable de la imagen:
Agregando a la respuesta de ADev (que en mi opinión es la más correcta), desde la adopción generalizada de Kotlin, y sus útiles funciones de extensión:
fun ImageView.setTint(context:Context,@ColorRes colorId:Int){
val color =ContextCompat.getColor(context, colorId)
val colorStateList =ColorStateList.valueOf(color)ImageViewCompat.setImageTintList(this, colorStateList)}
¡Creo que esta es una función que podría ser útil tener en cualquier proyecto de Android!
Hola, no funciona para dibujos vectoriales ... ¿Alguna solución para lo mismo?
Manukumar
@Manukumar Use en app:srcCompatlugar de android:srcy agregue vectorDrawables.useSupportLibrary = truea la defaultConfigparte de su archivo build.gradle. Probado para funcionar bien en el emulador Kitkat.
Desarrollador de Android
3
No usar PoterDuff.Mode, usarlo setColorFilter()funciona para todos.
Como dijo @milosmns, deberías usar
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Esta API necesita un valor de color en lugar de una identificación de recurso de color. Esa es la causa principal por la cual su declaración no funcionó.
Llego tarde a la fiesta pero no vi mi solución arriba. También podemos configurar el color del tinte setImageResource()(mi minSdkVersion es 24).
Entonces, primero, debe crear un selector y guardarlo en la /drawablecarpeta de activos (lo llamo ic_color_white_green_search.xml)
<!-- Focused and not pressed --><itemandroid:state_focused="true"android:state_pressed="false"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Focused and pressed --><itemandroid:state_focused="true"android:state_pressed="true"><bitmapandroid:src="@drawable/ic_search"android:tint="@color/branding_green"/></item><!-- Default --><itemandroid:drawable="@drawable/ic_search"/>
Luego configúrelo en un código como este:
val icon = itemView.findViewById(R.id.icon)asImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)
Solución de Kotlin usando la función de extensión, para configurar y desarmar el tinte:
fun ImageView.setTint(@ColorInt color:Int?){if(color ==null){ImageViewCompat.setImageTintList(this,null)return}ImageViewCompat.setImageTintMode(this,PorterDuff.Mode.SRC_ATOP)ImageViewCompat.setImageTintList(this,ColorStateList.valueOf(color))}
esto se trata de tinte! no alfa que es por transparencia.
David
Pero eso termina actuando como un tinte. Deberías probarlo tú mismo. Esta es solo una forma de ver las cosas.
Shubham Chaudhary
@ShubhamChaudhary Sé que es tarde, pero ¿qué pasa si la imagen es png? Entonces, ¿no cambiará el fondo? También el alfa y el tinte son muy diferentes. El tinte es como el reemplazo de color, si no me equivoco. Sin intención de ofender. Solo trato de ayudar :)
KISHORE_ZE
Punto valido. Esta respuesta ayudó en mi caso. La esperanza también se adapta a los zapatos de otra persona.
Respuestas:
Puede cambiar el tinte, bastante fácilmente en el código a través de:
imageView.setColorFilter(Color.argb(255, 255, 255, 255));
// Tinte blancoSi quieres tinte de color, entonces
Para Vector Drawable
ACTUALIZACIÓN :
@ADev tiene una solución más nueva en su respuesta aquí , pero su solución requiere una biblioteca de soporte más nueva: 25.4.0 o superior.
fuente
android:tint
Funciona en todas las versiones de Android. Tal vez estás hablandodrawableTint
?La mayoría de las respuestas se refieren al uso
setColorFilter
que no es lo que se pidió originalmente.El usuario @Tad tiene su respuesta en la dirección correcta, pero solo funciona en API 21+.
Para configurar el tinte en todas las versiones de Android, use
ImageViewCompat
:Tenga
yourTint
en cuenta que en este caso debe ser un "color int". Si tiene un recurso de color comoR.color.blue
, primero debe cargar el color int:fuente
ImageView
instancias xml con el tema AppCompat o enAppCompatImageView
subclases.Esto funciono para mi
fuente
mImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
@Hardik tiene razón. El otro error en su código es cuando hace referencia a su color definido por XML. Pasó solo la identificación al
setColorFilter
método, cuando debe usar la identificación para ubicar el recurso de color y pasar el recurso alsetColorFilter
método. Reescribiendo su código original a continuación.Si esta línea está dentro de su actividad:
De lo contrario, debe hacer referencia a su actividad principal:
Tenga en cuenta que esto también es cierto para los otros tipos de recursos, como enteros, bools, dimensiones, etc. Excepto para la cadena, para la cual puede usar directamente
getString()
en su actividad sin la necesidad de llamar primerogetResources()
(no me pregunte por qué) .De lo contrario, su código se ve bien. (Aunque no he investigado
setColorFilter
demasiado el método ...)fuente
Después probé todos los métodos y no me funcionaron.
Obtengo la solución usando otro PortDuff.MODE.
fuente
Comenzando con Lollipop, también hay un método de tinte para BitmapDrawables que funciona con la nueva clase Palette:
y
En versiones anteriores de Android, ahora puede usar la biblioteca DrawableCompat
fuente
Mejor función de extensión simplificada gracias a ADev
Uso:-
fuente
Prueba esto. Debería funcionar en todas las versiones de Android que admite la biblioteca de soporte:
Puede usar cualquiera de los anteriores para que funcione.
Puede leer más características interesantes de DrawableCompat en los documentos, aquí .
fuente
imageView.getBackground()
para obtener el dibujable, porqueimageView.getDrawable()
estaba volviendo nulo.Si su color tiene transparencia hexadecimal, use el siguiente código.
Para borrar el tinte
fuente
img
es de tipo ImageView.Simple y una linea
fuente
Como la primera respuesta no funcionó para mí:
Esto solo parece funcionar en API 21+, pero para mí eso no fue un problema. Puede usar un ImageViewCompat para resolver ese problema, aunque.
Espero haber ayudado a alguien :-)
fuente
Comenzando en Lollipop, hay un método llamado
ImageView#setImageTintList()
que puedes usar ... la ventaja es que toma unColorStateList
un solo color en lugar de un solo color, lo que hace que el tinte de la imagen sea consciente del estado.En los dispositivos anteriores a Lollipop, puede obtener el mismo comportamiento al teñir el dibujable y luego configurarlo como la
ImageView
imagen dibujable de la imagen:fuente
fuente
Para establecer el tinte para una vista de imagen mediante programación en Android
Tengo dos métodos para Android:
1)
2)
Espero haber ayudado a alguien :-)
fuente
Agregando a la respuesta de ADev (que en mi opinión es la más correcta), desde la adopción generalizada de Kotlin, y sus útiles funciones de extensión:
¡Creo que esta es una función que podría ser útil tener en cualquier proyecto de Android!
fuente
Descubrí que podemos usar el selector de color para tint attr:
activity_main.xml:
section_arrowup_color.xml:
fuente
app:srcCompat
lugar deandroid:src
y agreguevectorDrawables.useSupportLibrary = true
a ladefaultConfig
parte de su archivo build.gradle. Probado para funcionar bien en el emulador Kitkat.No usar
PoterDuff.Mode
, usarlosetColorFilter()
funciona para todos.fuente
Como dijo @milosmns, deberías usar
imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);
Esta API necesita un valor de color en lugar de una identificación de recurso de color. Esa es la causa principal por la cual su declaración no funcionó.
fuente
Llego tarde a la fiesta pero no vi mi solución arriba. También podemos configurar el color del tinte
setImageResource()
(mi minSdkVersion es 24).Entonces, primero, debe crear un selector y guardarlo en la
/drawable
carpeta de activos (lo llamoic_color_white_green_search.xml
)Luego configúrelo en un código como este:
fuente
En caso de que quiera configurar el selector a su tinte:
fuente
Solución de Kotlin usando la función de extensión, para configurar y desarmar el tinte:
fuente
No es una respuesta exacta, sino una alternativa más simple:
Aquí hay un fragmento para eso:
fuente
png
? Entonces, ¿no cambiará el fondo? También el alfa y el tinte son muy diferentes. El tinte es como el reemplazo de color, si no me equivoco. Sin intención de ofender. Solo trato de ayudar :)