我正在使用支持库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 。
从 tick_path_animation.xml 中读取 valueFrom 属性时,它似乎失败了。可能不支持此属性类型“pathType”(还是?)。知道如何解决这个问题吗?
答案 0 :(得分:23)
抱歉,这不适用于当前版本的支持库(23.2.0)。
在平台上运行时,动画矢量可以做什么样的事情也有一些限制&lt; API 21.以下是目前在这些平台上不起作用的内容:
路径变形(PathType评估程序)。这用于将一条路径变形为另一条路径。
路径插值。这用于定义灵活的插值器(表示为路径),而不是系统定义的插值器,如LinearInterpolator。
沿着路径移动。这很少使用。几何对象可以沿着任意路径移动。
设置pathData的动画,或者&#39; Path Morphing&#39;目前不支持。
<强>更新强>
弗兰克的评论:
最终修复了支持lib 25。4。0(2017年6月):&#34; Path 支持变形和路径插值 AnimatedVectorDrawableCompat&#34;
答案 1 :(得分:4)
上面动画中的圆形“闪光”(在图像的中心)是我按下屏幕开始变形
膨胀Drawable
`VectorDrawable`
和`AnimatedVectorDrawable`
(`vector-compat`)可以通过这种方式充气:
getDrawable()
方法://This will only inflate a drawable with <vector> as the root element VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector); //This will only inflate a drawable with <animated-vector> as the root element AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector); // This will inflate any drawable and will auto-fallback to the lollipop implementation on api 21+ devices 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 自述文件:https://github.com/wnafee/vector-compat
如果您将其与您的应用模块的API 14
build.gradle
合并(通常位于文件末尾),这将解决您的问题(降至dependencies
):
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'
}