studio programacion herramientas fundamentos con avanzado aplicaciones android vectordrawable

programacion - actualizar programáticamente android Vector Drawable



manual de android en pdf (2)

Tengo un VectorDrawable consta de 9 rectángulos. Esto se define como un XML en la carpeta drawables. Tengo este conjunto como fondo para un ImageView que he declarado en xml. android:src="@drawable/squares00" Me gustaría cambiar el color de uno o más cuadrados programáticamente en el tiempo de ejecución. Sé que hay una forma de hacerlo usando animaciones VectorDrawable. Pero me preguntaba si hay una forma más sencilla de acceder a mi vectorDrawable en java, actualizar sus propiedades (establecer uno o más de los colores de relleno para los rectángulos) y luego actualizar el fondo de la imagen con el VectoDrawable actualizado. Mi objetivo es Android API 21 (lollipop)


En breve:

  1. No tiene acceso directo a los elementos internos en VectorDrawable .
  2. AnimatedVectorDrawable solo tiene acceso a elementos internos.
  3. Use AnimatedVectorDrawable para simular lo que necesita.

Largo:

1. No tienes acceso.

Al VectorDrawable el código fuente de VectorDrawable se mostrará que la información de los elementos internos se almacena en una clase de estado privado interno VectorDrawableState . El único método para exponer el elemento interno por nombre es getTargetByName , pero desafortunadamente es un paquete privado (predeterminado), no se puede usar (a menos que se use reflexión).

2. AnimatedVectorDrawable solo tiene acceso

getTargetByName solo está siendo utilizado por AnimatedVectorDrawable , como podemos encontrar buscando los usos del método.

3. Utilice AnimatedVectorDrawable

Ahora que vemos que esta es la única opción disponible, por ejemplo, podemos intentar lo siguiente para cambiar el color del elemento "rect2" de blanco a negro:

change_color.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="0" android:propertyName="fillColor" android:valueFrom="@color/white" android:valueTo="@color/black"/> </set>

animación.xml:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/vectordrawable" > <target android:name="rect2" android:animation="@anim/change_color" /> </animated-vector>

y utilice el enfoque descrito AnimatedVectorDrawable .

Nota

Si lo anterior aún no es una opción para usted, puede intentar lo siguiente:

  • Copie todo el VectorDrawable y VectorDrawable (no probado)
  • Utilice la reflexión para getTargetByName para obtener el elemento interno. Deberá asegurarse de mutate el objeto primero.

Utilice esta library para el acceso directo a los elementos internos. Es implementar esta answer