AnimatedVectorDrawable en la biblioteca de soporte y animación de "pathData"

Estoy utilizando vectores animados de Support Support Library 23.2.0 , así:

compile 'com.android.support:support-vector-drawable:23.2.0' compile 'com.android.support:animated-vector-drawable:23.2.0' 

Estoy tratando de animar " pathData " (líneas de morphing uno a otro). Mi código se ve así.

Drawable / ic_done.xml:

 <?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportHeight="24.0" android:viewportWidth="24.0"> <path android:name="tick" android:pathData="M4.8,12L9,16.2L20,8" android:strokeColor="#FF000000" /> </vector> 

Dibujable / ic_done_animated.xml:

 <?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:drawable="@drawable/ic_done"> <target android:name="tick" android:animation="@animator/tick_path_animation" /> </animated-vector> 

Animator / tick_path_animation.xml:

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially"> <objectAnimator android:duration="200" android:propertyName="pathData" android:valueFrom="M4.8,12L4.8,12L4.8,12" android:valueTo="M4.8,12L9,16.2L9,16.2" android:valueType="pathType" /> <objectAnimator android:duration="200" android:propertyName="pathData" android:valueFrom="M4.8,12L9,16.2L9,16.2" android:valueTo="M4.8,12L9,16.2L20,8" android:valueType="pathType" /> </set> 

Código Java:

 ImageView vImgAnimated = findByViewId(R.id.img); AnimatedVectorDrawableCompat animatedVector = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.ic_done_animated); vImgAnimated.setImageDrawable(animatedVector); animatedVector.start(); 

Funciona bien en el nuevo dispositivo con API de nivel 21, pero tengo un problema en el dispositivo con API de nivel 16 :

 java.lang.NumberFormatException: Invalid int: "M4.8,12L4.8,12L4.8,12" at java.lang.Integer.invalidInt(Integer.java:138) at java.lang.Integer.parse(Integer.java:375) at java.lang.Integer.parseInt(Integer.java:366) at com.android.internal.util.XmlUtils.convertValueToInt(XmlUtils.java:123) at android.content.res.TypedArray.getInt(TypedArray.java:254) at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:258) at android.animation.AnimatorInflater.loadObjectAnimator(AnimatorInflater.java:161) at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:117) at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:126) at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93) at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.inflate(AnimatedVectorDrawableCompat.java:377) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.createFromXmlInner(AnimatedVectorDrawableCompat.java:162) at android.support.graphics.drawable.AnimatedVectorDrawableCompat.create(AnimatedVectorDrawableCompat.java:142) 

De acuerdo con un artículo android-support-library-232, los vectores animados (AnimatedVectorDrawableCompat) deberían ser respaldados de nuevo al nivel 11 de la API .

Parece que falla al leer el atributo valueFrom de tick_path_animation.xml . Este tipo de atributo "pathType" probablemente no es compatible (todavía?). Alguna idea de como resolver esto?

Lo sentimos, esto no funcionará con la versión actual de la biblioteca de soporte (23.2.0).

Ver el artículo de Chris Banes .

También hay algunas limitaciones a qué tipo de cosas pueden hacer los vectores animados cuando se ejecutan en plataformas <API 21. Las siguientes son las cosas que no funcionan actualmente en esas plataformas:

Path Morphing (evaluador de PathType). Esto se utiliza para transformar una ruta en otra ruta.

Interpolación de ruta. Esto se utiliza para definir un interpolador flexible (representado como una ruta) en lugar de los definidos por el sistema como LinearInterpolator.

Mover a lo largo del camino. Esto se utiliza raramente. El objeto de geometría puede moverse alrededor, a lo largo de una trayectoria arbitraria.

Por lo tanto, la animación de pathData, o 'Path Morphing' no está soportado actualmente.

Actualizar:
Comentario de Frank:

Esto se fija finalmente en soporte lib 25.4.0 (Junio ​​2017): "El morphing de ruta y la interpolación de ruta son compatibles en AnimatedVectorDrawableCompat"

Animación API 16
El "flash" circular en la animación anterior (en el centro de la imagen) es yo presionando la pantalla para iniciar el morph.
Inflando dibujables

`VectorDrawable` `AnimatedVectorDrawable` en esta biblioteca de soporte (`vector-compat`) pueden inflarse de esta manera:

  • Llamar a los getDrawable() static getDrawable() :
  // Esto solo inflar un dibujable con <vector> como el elemento raíz
 VectorDrawable.getDrawable (contexto, R.drawable.ic_arrow_vector);

 // Esto solo inflar un dibujable con <animated-vector> como el elemento raíz
 AnimatedVectorDrawable.getDrawable (contexto, R.drawable.ic_arrow_to_menu_animated_vector);

 // Esto inflar cualquier drawable y auto-fallback a la implementación de lollipop en dispositivos api 21+
 ResourcesCompat.getDrawable (contexto, R.drawable.any_drawable); 

Si se infla el código Drawable en java, se recomienda utilizar siempre ResourcesCompat.getDrawable() ya que esto maneja el fallback de Lollipop cuando sea aplicable. Esto permite al sistema almacenar en caché ConstantState Drawable y por lo tanto es más eficiente.
La biblioteca (`vector-compat`) tiene las siguientes animaciones de morph (bidireccional):

  • Play-Pause morph animación
  • Animación de animación de Play-Stop
  • Arrow-Hamburger menu morph animación
  • Como se puede ver, he producido la imagen de arriba en mi teléfono API 16 :

     import com.wnafee.vector.compat.AnimatedVectorDrawable; mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector); 

    Vea el github README para vector-compat aquí: https://github.com/wnafee/vector-compat
    Esto solucionará el problema (hasta la API 14 ) si lo fusiona con las dependencies build.gradle del módulo de build.gradle (generalmente al final del archivo):

     dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) //Trying to FIX Binary XML file line #2: invalid drawable tag animated-vector compile 'com.android.support:appcompat-v7:25.0.0' compile 'com.android.support:design:25.0.0' //not needed // compile 'com.android.support:support-vector-drawable:25.0.0' compile 'com.wnafee:vector-compat:1.0.5'//*******holy grail *******https://github.com/wnafee/vector-compat // Failed to resolve: com.android.support:support-animated-vector-drawable:25.0.0 //not needed // compile 'com.android.support:support-animated-vector-drawable:25.0.0' } 
  • Convertidor de gson retrofit para json anidado con diferentes objetos
  • Consultar tabla con subclases-como las relaciones
  • ¿Por qué Android LocationManager tiene un gran retraso antes de que las actualizaciones de ubicación se inicien si la precisión del ajuste
  • Mostrar decimal de un doble solo cuando sea necesario
  • ¿Se puede usar Android Studio para ejecutar proyectos Java estándar?
  • Android OpenCV con MatOfKeyPoint y detección de feature2d
  • iniciar gira virtual con gmaps v2 para android
  • Cómo solucionar el error: No se pudo encontrar el método onClick (View) en un padre o ancestro Contexto para android: onClick
  • OnSaveInstanceState no se llama después de rotación de pantalla
  • No se puede obtener el proveedor com.google.android.gms.measurement.AppMeasurementContentProvider
  • Ejemplos de patrones de diseño de Android MVVM
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.