30

Tengo ImageView con android:src configurado en ShapedDrawable, es decir, un círculo blanco. Lo que quiero es colorear este ImageView en tiempo de ejecución respondiendo a algunos eventos. imgView.setColorFilter parece ser una solución, pero después de usar esto (se probaron diferentes parámetros) la imagen se vuelve invisible (no la veo en la pantalla).Aplicación de ColorFilter a ImageView con ShapedDrawable

¿Cómo resolver esto? ¿Y hay mejores formas de tener círculos de colores?

+0

Puede encontrar [este Q & A relacionado] (http://stackoverflow.com/questions/4354939/understanding-the-use-of-colormatrix-and-colormatrixcolorfilter-to-modify-a-draw) interesante. –

+0

Lo sentimos, pero no pude encontrar nada relacionado con esta pregunta. – aplavin

+0

No estoy seguro de cómo no se puede encontrar la respuesta aceptada relacionada ... De todos modos, aquí hay otro tema similar: [enlace] (http://stackoverflow.com/q/1309629/1029225). Como se sugiere allí, intente: 'imgView.setColorFilter (0xff00ffff, PorterDuff.Mode.MULTIPLY);'. Si eso no se adapta a sus necesidades, también se propone una solución más sofisticada. –

Respuesta

93

Muy bien, tuve un juego rápido con esto y noté que su problema de los círculos desaparecía. Sin que describa exactamente lo que ha intentado con, supongo que aún no ha intentado configurar el filtro de color en el Drawable. (a diferencia del ImageView, que solo parece funcionar con BitmapDrawable s).

las siguientes afirmaciones funcionan perfectamente bien para un xml-declarada ShapeDrawable con el blanco como color inicial:

ImageView redCircle = (ImageView) findViewById(R.id.circle_red_imageview); 
ImageView greenCircle = (ImageView) findViewById(R.id.circle_green_imageview); 
ImageView blueCircle = (ImageView) findViewById(R.id.circle_blue_imageview); 

// we can create the color values in different ways: 
redCircle.getDrawable().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY); 
greenCircle.getDrawable().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY); 
blueCircle.getDrawable().setColorFilter(getResources().getColor(R.color.blue), PorterDuff.Mode.MULTIPLY); 

El ShapeDrawable esté completo: (I ajustar el tamaño de la ImageView, véase más adelante)

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > 
    <solid android:color="@android:color/white" /> 
</shape> 

Y una de las ImageView s como ejemplo:

<ImageView 
    android:id="@+id/circle_red_imageview" 
    android:layout_width="40dp" 
    android:layout_height="40dp" 
    android:padding="5dp" 
    android:src="@drawable/circle_white" /> 

resultado visual:

Screenshot of colored circles

+4

llamando 'mutable()' en el 'Drawable' ayudará a mantener el estado de los modelos. – Sufian

+0

Guau, esto me acaba de salvar, definitivamente desea aplicar el filtro al 'Drawable' y no simplemente al' ImageView'. – Maurizio

+0

obtenemos el color exacto que elegimos aquí setColorFilter (0xff00ff00, PorterDuff.Mode.MULTIPLY) si usamos blanco como color original. Si no, ¿cómo podemos obtener el color exacto? – SadeepDarshana

11

Si desea cambiar Color usar

PorterDuff.Mode.SRC_ATOP instead 
PorterDuff.Mode.MULTIPLY 

en el ejemplo anterior.

+0

Creo que el autor preguntó acerca de cualquier filtro, no solo SRC_ATOP o MULTIPLY. – kelin

5

Puede usar el atributo android:tint en ImageView en xml.

Ejemplo:

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

Probado en Android 4.1.2 y 6.0.1

+0

buena respuesta no es necesario ejecutar – marlonpya

+0

@marlonpya gracias! –