支持库中的AnimatedVectorDrawable和“pathData”的动画

11

我正在使用来自Support Library 23.2.0动画向量,代码如下:

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

我正在尝试对"pathData"进行动画处理(将线条形状变换为另一种)。我的代码如下所示。

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>

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

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级。
看起来在读取tick_path_animation.xml中的valueFrom属性时出现了错误。该属性类型“pathType”可能尚未得到支持。有什么解决方法吗?

尝试使用wnafee的Vector-Compat(https://github.com/wnafee/vector-compat)进行测试路径变形,效果良好。 - mmaksitaliev
1
你的问题可以在支持库25.4.0+中得到解决:https://developer.android.com/topic/libraries/support-library/revisions.html#25-4-0 - Frank
对于 API 21 以下的平台路径变形,您可以使用 Rich Path Animator https://github.com/tarek360/RichPath。 - Tarek360
2个回答

23

抱歉,这不适用于当前版本的支持库(23.2.0)。

请参见Chris Banes的文章

在运行在低于API 21的平台上时,矢量动画所能做的事情也有一些限制。以下是目前在这些平台上不起作用的内容:

路径变形(PathType评估器)。这是用于将一个路径变形成另一个路径的功能。

路径插值。这用于定义灵活的插值器(表示为路径),而不是系统定义的线性插值器之类的插值器。

沿路径移动。这很少使用。几何对象可以沿任意路径移动。

因此,目前不支持对pathData进行动画处理或“路径变形”。

更新:
Frank的评论:

这终于在支持lib 25.4.0(2017年6月)中得到了修复:“AnimatedVectorDrawableCompat支持路径变形和路径插值”


非常感谢,我找不到这些限制。 - Jiří Vitinger
@Lewis McGeary:你有找到任何关于哪个版本支持路径的信息吗? - Trung Nguyen
7
在24.2.0版本中仍然无法工作。这使得支持库中的整个“Compat”部分对我来说都没有用!在声明向后兼容到API11之后,这相当令人恼火,但却隐藏了不起作用的“相关”细节。应该将其称为AnimatedVectorDrawablePartiallyCompat。 - Mark
@MarkKeen请看上面的评论。 - mmaksitaliev
1
这是因为支持库目前依赖于框架的AnimatorInflater来处理矢量可绘制对象,而声明valueType为intType或floatType以外的值类型的objectAnimator功能仅在API 21中添加。甚至关于动画资源的文档也没有及时更新这方面的内容。 - BladeCoder
2
这个问题最终在支持库25.4.0(2017年6月)中得到了修复:“AnimatedVectorDrawableCompat支持路径变形和路径插值”。 - Frank

4

API 16 animation
上图中的圆形“闪光”(在图像中央)是我按下屏幕启动变形。
可膨胀Drawable

在此支持库(`vector-compat`)中,可以以以下方式膨胀`VectorDrawable``AnimatedVectorDrawable`

  • 调用静态的getDrawable()方法:
//这将只会膨胀作为根元素的<vector> drawable
VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector);
//这将只会膨胀作为根元素的<animated-vector> drawable AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector);
//这将膨胀任意drawable,并会自动回退到lollipop实现在api 21+设备上 ResourcesCompat.getDrawable(context, R.drawable.any_drawable);

如果在Java代码中膨胀Drawable,则建议始终使用ResourcesCompat.getDrawable(),因为它可以处理Lollipop回退(适用时)。这使系统可以缓存Drawable ConstantState,因此更有效率。
该库(`vector-compat`)具有以下变形(双向)动画:

  • 播放-暂停变形动画
  • 播放-停止变形动画
  • 箭头-汉堡菜单变形动画

  • 如您所见,我在我的API 16手机上制作了上面的图像:

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

    请查看这里关于 vector-compat 的github READMEhttps://github.com/wnafee/vector-compat
    如果你将它与你的应用程序模块的build.gradle dependencies合并(通常在文件末尾),这将解决你的问题(下降到API 14)。
    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'
    }
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接