android - Aplicación de ColorFilter a ImageView con ShapedDrawable
android-imageview shapedrawable (4)
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)
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
<solid android:color="@android:color/white" />
</shape>
Y uno de los ImageView
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:
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();
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
Si desea cambiar el uso de Color de imagen
PorterDuff.Mode.SRC_ATOP instead
PorterDuff.Mode.MULTIPLY
en el ejemplo anterior