icon - vector drawable compat android
Cambiar fillColor de un vector en Android programáticamente (3)
Quiero editar el color de relleno de un archivo vectorial en Android mediante programación.
En el archivo xml puedo configurar mi color con el atributo android: fillColor pero quiero cambiar el color en tiempo de ejecución.
¿Algún ejemplo para eso? Gracias.
Si desea cambiar todo el color, puede aplicar un PorterduffColorFilter. Pero esto no funciona para un solo <path>
. Solo para el conjunto dibujable.
public void applyThemeToDrawable(Drawable image) {
if (image != null) {
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE,
PorterDuff.Mode.SRC_ATOP);
image.setColorFilter(porterDuffColorFilter);
}
}
VectorDrawable extiende la clase Drawable. Ver docs
agregue el método setColorFilter()
al vector de contenido de la imagen (se agrega en el nivel de API 8) de la siguiente manera:
imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);
This es exactamente lo que necesitas. Créditos a @emmaguy , el autor del post. Acabo de agregar el soporte completo de Support Library 23.4+ , que te permite detener la generación de pngs en tiempo de ejecución:
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
Y si esta línea está configurada en su actividad o en la aplicación onCreate:
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
Puede usar sus SVG no solo con srcCompat
sino también con otros atributos como drawableLeft
, background
, etc. en TextView, ToggleButton, etc. También funciona si se utiliza en los selectores.
Nota : modifiqué el código para usar VectorDrawableCompat.create
lugar de ResourcesCompat.getDrawable
. De lo contrario, no funcionaría y lanzaría org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector
.
Contenido de la publicación media:
Primero, creamos atributos para los dos tipos de chucherías, por lo que podemos cambiar sus colores:
<declare-styleable name="ChristmasTree">
<attr name="bauble_round" format="color" />
<attr name="bauble_small" format="color" />
</declare-styleable>
Luego, en VectorDrawable, establezca las partes que queremos cambiar dinámicamente para usar estos atributos:
<path
android:fillColor="?attr/bauble_round"
android:pathData="...." />
<path
android:fillColor="?attr/bauble_small"
android:pathData="...." />
...
Crea temas y establece los colores que quieres usar:
<style name="UpdatedScene" parent="DefaultScene">
<item name="bauble_round">#db486e</item>
<item name="bauble_small">#22c7f7</item>
</style>
<style name="DefaultScene">
<item name="bauble_round">#fec758</item>
<item name="bauble_small">#f22424</item>
</style>
Utilice el dibujo en un ImageView:
final ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DefaultScene);
final Drawable drawable = VectorDrawableCompat.create(getResources(), R.drawable.christmas, wrapper.getTheme());
imageView.setImageDrawable(drawable);
¡Eso es! Cuando desee cambiar los colores, simplemente configure un tema diferente y su dibujo se actualizará. Ver el repo GitHub para una muestra completa.