Ошибка при попытке тестирования 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 :

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

Intereting Posts
Когда нам нужен NDK для OpenCV Android Google Play не показывает правильный счетчик загрузки для моего приложения Как начать службу на основе объекта ServiceInfo? Включение строки в нижней части навигационного ящика Android NDK: как переопределить onBackPressed в NativeActivity без java? Пользовательское изображение для входа в Facebook в Facebook Android SDK 3.5 Как управлять ограниченными профилями в приложении Android? Android: R.java: ошибка <идентификатор> ожидается Что произойдет, если я оставлю все свои изображения в папке drawable-hdpi? Печатать массив без скобок и запятых Android ChatHead ограничивает прикосновение только к себе, НО мне нужна поддержка второго пальца одновременно, вторая касающаяся области вне чата, Создание Recyclerview фиксированной высоты и прокрутки Захват экрана в andengine дает зеркальное отражение вверх дном Преобразование файла: // схема для контента: // схема NotifyDataSetChanged в адаптере Curser, не работающем с listfragment