Error al intentar probar AnimatedVectorDrawable, "No se puede cambiar de x a z"

Quería hacer un AnimatedVectorDrawable, por lo que mi FAB puede mirar un poco tan fabuloso como este , con animaciones y cosas.

He encontrado este gran tutorial , sobre cómo usar y poner en práctica etc, y más tarde encontré una herramienta muy útil para convertir SVG en Android-VectorDrawables, y convirtió estas dos imágenes: https://github.com/google/material- Diseño-iconos / blob / master / content / svg / diseño / ic_add_48px.svg https://github.com/google/material-design-icons/blob/master/action/svg/design/ic_done_48px.svg

Ahora este es el xml- "código" que he creado:

Drawable / vector_add.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:viewportWidth="48" android:viewportHeight="48"> <group> <path android:pathData="M0 0h48v48h-48Z" /> <path android:name="add" android:fillColor="#ffffff" android:pathData="M38 26h-12v12h-4v-12h-12v-4h12v-12h4v12h12v7Z" /> </group> </vector> 

Anim / add_to_done.xml:

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="3000" android:propertyName="pathData" android:valueFrom="M38 26h-12v12h-4v-12h-12v-4h12v-12h4v12h12v7Z" android:valueTo="M18 32.34l-8.34-8.34-2.83 2.83 11.17 11.17 24-24-2.83-2.83Z" android:valueType="pathType" /> </set> 

Drawable / ic_add.xml:

 <?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/vector_add"> <target android:name="add" android:animation="@anim/anim_plus_to_done" /> </animated-vector> 

Si ejecuto este código, acabo con este error:

 Caused by: android.view.InflateException: Binary XML file line #3 Can't morph from M38 26h-12v12h-4v-12h-12v-4h12v-12h4v12h12v4Z to M18 32.34l-8.34-8.34-2.83 2.83 11.17 11.17 24-24-2.83-2.83Z at android.animation.AnimatorInflater.setupAnimatorForPath(AnimatorInflater.java:337) at android.animation.AnimatorInflater.parseAnimatorFromTypeArray(AnimatorInflater.java:283) at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:618) at android.animation.AnimatorInflater.loadObjectAnimator(AnimatorInflater.java:577) at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:529) at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:542 

Mi conjetura sería que los dos caminos en los dos svg son demasiado diferentes, por lo que Android no puede manejar la animación por sí mismo, y tengo que hacer como varios VectorDrawables para cada animación "punto de control".

… Estoy probablemente completamente lejos con esa teoría, pero es lo más lógico que puedo llegar a.

No tengo mucha experiencia (ni ningún experince en absoluto para esa materia) que trabaja con los vectores y el ilustrador etc, así que cualquier ayuda que los individuos pueden subir con serán extremadamente apreciados.

Que tengas un buen día, y Feliz Navidad.

Sinceramente, Måns.

Los VectorDrawables que desea transformar deben ser compatibles, lo que significa que deben tener complejidades simlar; Longitud y número de comandos similares (esto fue mencionado por pksink).

De esta manera terminé resolviendo esto es tomar el símbolo "plus" y modificar las dimensiones manualmente en android studio hasta que tuviera algo parecido a una marca de verificación.

Vector Plus:

 <?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" android:height="24dp"> <group android:name="plus_group" android:pivotX="12" android:pivotY="12"> <path android:name="plus_path" android:strokeColor="@android:color/white" android:strokeWidth="3" android:pathData="M12,0L12,24M0,12,L24,12" /> </group> </vector> 

Vector de CheckMark:

 <?xml version="1.0" encoding="utf-8"?> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:viewportWidth="24" android:viewportHeight="24" android:width="24dp" android:height="24dp"> <group android:name="check_group" android:pivotX="12" android:translateX="0" android:pivotY="12"> <path android:name="check_path" android:strokeColor="@android:color/white" android:strokeWidth="3" android:pathData="M20,0L06,20M0,14,L08,19" /> </group> </vector> 

Observe que estos tienen el mismo número de comandos. La marca de verificación no parece perfecta, pero no se puede notar si la pone en un botón de acción flotante.

Sugerencia adicional: Mueve el pathData a una variable de cadena. De esta forma, es más fácil mantener la consistencia en sus objectAnimators.

Si desea transformarse entre imágenes SVG arbitrarias (o VectorDrawable ) es necesario alinear las rutas correspondientes para que sean compatibles con el morphing . Esta es una tarea muy tediosa, pero hay una herramienta de línea de comandos que puede hacer eso por usted: VectAling

Sólo tienes que ejecutar la herramienta VectAlign desde la línea de comandos pasando tus rutas originales y creará automáticamente secuencias "morphables".

Ejemplo de uso:

 java -jar vectalign.jar --start "M 10,20..." --end "M 30,30..." 

Salida:

 -------------------- ALIGNMENT RESULT -------------------- # new START sequence: M 48.0,54.0 L 31.0,42.0 L 15.0,54.0 L 21.0,35.0 L 6.0,23.0 L 25.0,23.0 L 25.0,23.0 L 25.0,23.0 L 25.0,23.0 L 32.0,4.0 L 40.0,23.0 L 58.0,23.0 L 42.0,35.0 L 48.0,54.0 # new END sequence: M 48.0,54.0 L 48.0,54.0 L 48.0,54.0 L 48.0,54.0 L 31.0,54.0 L 15.0,54.0 L 10.0,35.0 L 6.0,23.0 L 25.0,10.0 L 32.0,4.0 L 40.0,10.0 L 58.0,23.0 L 54.0,35.0 L 48.0,54.0 

Ahora puede utilizar estas nuevas secuencias en su proyecto de Android y morph entre ellos como de costumbre con un AnimatedVectorDrawable !

También puede pasar archivos SVG :

 java -jar vectalign.jar --start image1.svg --end image2.svg 

Esta es una de las muestras de la demo de VectAlign :

Introduzca aquí la descripción de la imagen

  • Android: analiza XML desde problemas de cadena
  • Cómo inflar Android View en la clase LinearLayout?
  • Cómo agregar efecto de sombra en drawable en android
  • Programación Android de fondo de cultivo
  • El diálogo del progreso tiene el fondo blanco en dispositivos del Lollipop,
  • Cómo poner TODO comentarios en xml?
  • Coloque los botones en la parte inferior de la pantalla con LinearLayout?
  • ¿Puede explicar alguien inflar método? Mayor comprensión de las vistas de Android
  • Acolchado CardView y esquinas redondeadas
  • Símbolo de porcentaje de Android XML
  • Teclado suave de Android con botones superpuestos (Captura de pantalla)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.