私は次のようにSupport Library 23.2.0のanimated vectorsを使用しています:
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"はおそらくサポートされていません(まだ?)。これを解決する方法はありますか?
現在のバージョンのサポートライブラリ(23.2.0)では動作しません。
Chris Banesの記事 を参照してください。
また、API 21未満のプラットフォームで実行する場合にアニメーションベクトルが実行できることには、いくつかの制限があります。以下は、現在これらのプラットフォームで機能しないものです。
パスモーフィング(PathTypeエバリュエーター)。これは、あるパスを別のパスに変形するために使用されます。
パス補間。これは、LinearInterpolatorのようなシステム定義のものではなく、(パスとして表される)柔軟な補間器を定義するために使用されます。
パスに沿って移動します。これはめったに使用されません。ジオメトリオブジェクトは、任意のパスに沿って移動できます。
そのため、pathDataまたは「パスモーフィング」のアニメーションは現在サポートされていません。
更新:
フランクのコメント:
これは、サポートライブラリ25.4.0(2017年6月)で最終的に修正されました:「パスのモーフィングとパスの補間は、AnimatedVectorDrawableCompatでサポートされています」