9

動畫我使用從支持庫23.2.0動畫載體,像這樣:AnimatedVectorDrawable在支持庫和 「pathData」

​​

我試圖動畫 「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

它看起來像讀取時失敗valueFrom屬性來自tick_path_animation.xml。此屬性類型「pathType」可能不受支持(但?)。任何想法如何解決這個問題?

+0

嘗試通過wnafee使用Vector-Compat https://github.com/wnafee/vector-compat,我測試了路徑變形,效果很好 –

+1

您的問題已在支持庫25.4.0+:https:// developer中得到解決。 android.com/topic/libraries/support-library/revisions.html#25-4-0 – Frank

+0

對於平臺上的路徑變形 Tarek360

回答

23

對不起,這不支持當前版本的支持庫(23.2.0)。

請參閱Chris Banes article

也有一定的侷限性,以什麼樣的東西在平臺上運行時的動畫向量可以做< API 21.以下是不上這些平臺目前的工作的事情:

路徑變形算法(PathType評估)。這用於將一個路徑變形爲另一個路徑。

路徑插值。這用於定義靈活的插補器(表示爲路徑),而不是像LinearInterpolator這樣的系統定義的插補器。

沿路徑移動。這很少使用。幾何對象可以沿着任意路徑移動。

所以動畫pathData或'Path Morphing'目前不支持。

更新:
弗蘭克的評論:

這是最後固定在支持LIB 25.4.0(六月2017): 「路徑 變形和路徑插值支持 AnimatedVectorDrawableCompat」

+0

非常感謝,我無法找到這些限制。 –

+0

@Lewis McGeary:你是否發現任何支持路徑 –

+7

的版本的信息在24.2.0中仍然不起作用。它使得我的支持庫中的'Compat'部分無用!在向API11聲明兼容性之後相當惱火,但隱藏了不適用的「相關」細節。應該稱爲AnimatedVectorDrawablePartiallyCompat .. –

4

API 16 animation
上面的動畫中(在圖像的中心)的圓形「閃光」是我預先點擊屏幕開始變形。

  • 調用靜態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);

膨化繪製對象的

`VectorDrawable``AnimatedVectorDrawable`在此支持庫(`矢量compat`)可以以這種方式被充氣

如果在Java代碼中繪製Drawable,建議始終使用ResourcesCompat.getDrawable(),因爲這適用於處理棒棒堂後備。這允許系統緩存Drawable ConstantState,因此效率更高。
庫(`矢量compat`)具有以下變形(雙向​​)的動畫:

  • 播放-暫停變形動畫
  • 播放停止變形動畫
  • 箭漢堡包菜單變形動畫

  • 正如你所看到的,我公司生產的上面的圖片我 API 16電話:

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

    看看GitHub的READMEvector-compat這裏:https://github.com/wnafee/vector-compat
    這將解決您的問題(低至API 14)如果你用它合併您的應用程序模塊的build.gradledependencies(通常在文件的結尾):

    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' 
    }