Ошибка при попытке тестирования AnimatedVectorDrawable, «Невозможно преобразовать из x в z»

Я хотел сделать AnimatedVectorDrawable, так что мой FAB может выглядеть как-то невероятно, как этот , с анимацией и т. Д.

Я нашел этот отличный учебник , о том, как его использовать и внедрять и т. Д., А позже я нашел очень полезный инструмент для преобразования SVG в Android-VectorDrawables и преобразовал эти два изображения: https://github.com/google/material- Design-icons / blob / master / content / svg / design / ic_add_48px.svg https://github.com/google/material-design-icons/blob/master/action/svg/design/ic_done_48px.svg

Теперь это xml-«код», который я придумал:

рисуем / 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> 

аним / 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> 

рисуем / 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> 

Если я запустил этот код, я просто закончил бы эту ошибку:

 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 

Я предполагаю, что два пути в двух svg слишком разные, поэтому Android не может обрабатывать анимацию самостоятельно, и мне нужно сделать как несколько VectorDrawables для каждой контрольной точки анимации.

… Я, вероятно, полностью ушел с этой теорией, но это наиболее логично, я могу придумать ..

У меня нет большого опыта (и вообще никакого опыта), работающего с Vectors & Illustrator и т. Д., Поэтому любая помощь, которую вы, ребята, можете придумать, будет чрезвычайно оценена.

Приятного дня и Рождества.

С уважением, Måns.

VectorDrawables, которые вы хотите преобразовать, должны быть совместимыми, то есть они должны иметь сходные сложности; Аналогичную длину и количество команд (об этом упоминал pksink).

Таким образом, я решил, что это означает, что символ «плюс» и модификация – это размеры вручную в андроид-студии, пока у меня не появилось что-то похожее на галочку.

Плюс вектор:

 <?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> 

CheckMark Vector:

 <?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> 

Обратите внимание, что они имеют одинаковое количество команд. Флажок не выглядит идеально, но вы не можете заметить, если вы поместите его в плавающую кнопку.

Дополнительный совет: переместите pathData в строковую переменную. Таким образом, легче поддерживать согласованность в объектных атрибутах.

Если вы хотите повернуть между произвольными изображениями SVG (или VectorDrawable ), вам необходимо выровнять соответствующие пути, чтобы сделать их совместимыми для морфинга . Это очень утомительная задача, но есть инструмент командной строки, который может сделать это для вас: VectAling

Вам просто нужно запустить инструмент VectAlign из командной строки, передавая исходные пути, и он автоматически создаст «морфируемые» последовательности.

Пример использования:

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

Вывод:

 -------------------- 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 

Теперь вы можете использовать эти новые последовательности в своем проекте Android и морфировать между ними, как обычно, с помощью AnimatedVectorDrawable !

Вы также можете передавать файлы SVG :

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

Это один из примеров демонстрации VectAlign :

Введите описание изображения здесь