web-dev-qa-db-ja.com

サポートライブラリのAnimatedVectorDrawableおよび「pathData」のアニメーション

私は次のようにSupport Library 23.2.0animated 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"はおそらくサポートされていません(まだ?)。これを解決する方法はありますか?

11
Jiří Vitinger

現在のバージョンのサポートライブラリ(23.2.0)では動作しません。

Chris Banesの記事 を参照してください。

また、API 21未満のプラットフォームで実行する場合にアニメーションベクトルが実行できることには、いくつかの制限があります。以下は、現在これらのプラットフォームで機能しないものです。

パスモーフィング(PathTypeエバリュエーター)。これは、あるパスを別のパスに変形するために使用されます。

パス補間。これは、LinearInterpolatorのようなシステム定義のものではなく、(パスとして表される)柔軟な補間器を定義するために使用されます。

パスに沿って移動します。これはめったに使用されません。ジオメトリオブジェクトは、任意のパスに沿って移動できます。

そのため、pathDataまたは「パスモーフィング」のアニメーションは現在サポートされていません。

更新:
フランクのコメント:

これは、サポートライブラリ25.4.0(2017年6月)で最終的に修正されました:「パスのモーフィングとパスの補間は、AnimatedVectorDrawableCompatでサポートされています」

23
Lewis McGeary