Aplicación de ColorFilter a ImageView con ShapedDrawable

Tengo un 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 para responder a algunos eventos. imgView.setColorFilter parece ser la solución, pero después de usar esto (se probaron diferentes parámetros) la imagen se vuelve invisible (no la veo en la pantalla).

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

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

Las siguientes afirmaciones funcionan perfectamente bien para un ShapeDrawable declarado ShapeDrawable con 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 ); 

The ShapeDrawable para completar: (Configuré el tamaño en ImageView , ver abajo)

    

Y uno de los ImageView como ejemplo:

  

Resultado visual:

Captura de pantalla de círculos de colores

Si desea cambiar el uso de Color de imagen

 PorterDuff.Mode.SRC_ATOP instead PorterDuff.Mode.MULTIPLY 

en el ejemplo anterior

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

Ejemplo:

  

Probado en Android 4.1.2 y 6.0.1

Puede hacerlo de forma muy simple utilizando esta biblioteca: https://github.com/jrvansuita/IconHandler

Funciona así:

 Icon.on(yourImageView).color(R.color.your_color).icon(R.mipmap.your_icon).put();