AnimatedVectorDrawable в библиотеке поддержки и анимации "pathData"

Я использую анимированные векторы из библиотеки поддержки 23.2.0, например:

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

Я пытаюсь анимировать "pathData" (морфинг линий друг к другу). Мой код выглядит так.

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

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

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

Java-код:

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

Это работает хорошо на более новом устройстве с уровнем API 21, но у меня есть проблема на устройстве с уровнем API 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)

Согласно статье android-support-library-232 анимированные векторы (AnimatedVectorDrawableCompat) должны поддерживаться до уровня API 11.

Похоже, что происходит сбой при чтении атрибута valueFrom из tick_path_animation.xml. Этот тип атрибута "pathType", вероятно, не поддерживается (пока?). Есть идеи, как это решить?

2 ответа

Решение

Извините, это не будет работать с текущей версией библиотеки поддержки (23.2.0).

Смотрите статью Криса Бейнса.

Существуют также некоторые ограничения на то, что анимированные векторы могут делать при работе на платформах

Path Morphing (оценщик PathType). Это используется для преобразования одного пути в другой.

Путь Интерполяция. Это используется для определения гибкого интерполятора (представленного в виде пути) вместо определенных системой, таких как LinearInterpolator.

Двигайся по тропинке. Это редко используется. Объект геометрии может перемещаться по произвольному пути.

Поэтому анимация pathData или Path Morphing в настоящее время не поддерживается.

Обновить:
Комментарий Фрэнка:

Наконец, это исправлено в библиотеке поддержки 25.4.0 (июнь 2017 г.): "Морфинг пути и интерполяция пути поддерживаются в AnimatedVectorDrawableCompat"

API 16 анимация
круговая "вспышка" в приведенной выше анимации (в центре изображения) - это нажатие на экран, чтобы запустить морфинг.
Раздувание Drawable's

`VectorDrawable` а также `AnimatedVectorDrawable` в этой библиотеке поддержки (`vector-compat`) можно накачать таким образом:

  • Вызов статический getDrawable() методы:
 // Это только раздувает отрисовку с  в качестве корневого элемента
VectorDrawable.getDrawable (context, R.drawable.ic_arrow_vector);

// Это только раздувает отрисовку с  в качестве корневого элемента
AnimatedVectorDrawable.getDrawable (context, R.drawable.ic_arrow_to_menu_animated_vector);

// Это раздувает все отрисовки и автоматически откатывается к реализации lollipop на устройствах api 21+
ResourcesCompat.getDrawable(context, R.drawable.any_drawable); 

Если надувать Drawable в Java-коде, рекомендуется всегда использовать ResourcesCompat.getDrawable() как это обрабатывает запасной вариант Lollipop, когда это применимо. Это позволяет системе кэшировать Drawable ConstantState и, следовательно, более эффективно.
Библиотека (`vector-compat`) имеет следующие морфинговые (двунаправленные) анимации:

  • Play-Pause морф анимация
  • Play-Stop морф анимация
  • Стрелка-гамбургер меню морф анимация

  • Как вы можете видеть, я создал вышеупомянутое изображение на моем API 16 Телефон:

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

    Посмотрите на GitHub README для vector-compat здесь: https://github.com/wnafee/vector-compat
    Это исправит вашу проблему (вплоть до API 14) если вы объедините его с модулем приложения build.gradledependencies (обычно в конце файла):

    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'
    }
    
    Другие вопросы по тегам