11

次のように、サポート ライブラリ 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>

アニメータ/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」はおそらくサポートされていません (まだ?)。これを解決する方法はありますか?

4

2 に答える 2

23

申し訳ありませんが、これはサポート ライブラリの現在のバージョン (23.2.0) では機能しません。

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

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

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

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

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

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

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

これは、サポート ライブラリ 25.4.0 (2017 年 6 月) で最終的に修正されました。

于 2016-03-04T22:30:10.340 に答える
4

API 16 アニメーション
上のアニメーション (画像の中央) の円形の「フラッシュ」は、モーフを開始するために画面を押しているところです。
Drawable の膨張

`VectorDrawable``AnimatedVectorDrawable`このサポート ライブラリ (`vector-compat`) では、次の方法でインフレートできます。

  • 静的getDrawable()メソッドの呼び出し:
//これは、ルート要素として <vector> を持つドローアブルのみをインフレートします
VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector);

//これは、ルート要素として <animated-vector> を持つドローアブルのみをインフレートします
AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector);

// これによりドローアブルがインフレートされ、API 21 以降のデバイスでは lollipop 実装に自動フォールバックされます
ResourcesCompat.getDrawable(context, R.drawable.any_drawable);

Drawable を Java コードでインフレートする場合はResourcesCompat.getDrawable()、該当する場合に Lollipop フォールバックを処理するため、常に使用することをお勧めします。これにより、システムは Drawable ConstantState をキャッシュできるため、より効率的になります。
ライブラリ (`vector-compat`) には、次のモーフ (双方向) アニメーションがあります。

  • モーフ アニメーションの再生と一時停止
  • 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 14build.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'
    }
    
    于 2016-12-31T15:30:21.340 に答える