9

Sto usando vettori animati da libreria di supporto 23.2.0, in questo modo:AnimatedVectorDrawable in libreria di supporto e l'animazione di "pathData"

compile 'com.android.support:support-vector-drawable:23.2.0' 
compile 'com.android.support:animated-vector-drawable:23.2.0' 

sto cercando di animare "pathData" (linee di morphing l'una all'altra). Il mio codice è simile a questo.

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> 

animatore/tick_path_animation.xml: codice

<?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(); 

E funziona bene su più nuovo dispositivo con livello API 21 ma ho un problema sul dispositivo con livello 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) 

Secondo un articolo android-support-library-232 i vettori animati (AnimatedVectorDrawableCompat) dovrebbe essere sostenuta torna al livello API 11.

sembra che non riesce durante la lettura valueFrom attributo da tick_path_animation.xml. Questo tipo di attributo "pathType" probabilmente non è supportato (ancora?). Qualche idea su come risolvere questo?

+0

prova ad usare Vector-Compat da wnafee https://github.com/wnafee/vector-compat, ho provato il percorso morphing, funziona bene –

+1

La tua domanda è risolta nel supporto lib 25.4.0+: https: // developer. android.com/topic/libraries/support-library/revisions.html#25-4-0 – Frank

+0

Per Path Morphing su piattaforme Tarek360

risposta

23

Siamo spiacenti, questo non funzionerà con la versione corrente della Biblioteca Support (23.2.0).

Vedi Chris Banes article.

ci sono anche alcune limitazioni a che tipo di cose vettori animati possono fare durante l'esecuzione su piattaforme < API 21. Di seguito sono le cose che non funzionano attualmente su queste piattaforme:

Path Morphing (PathType valutatore). Questo è usato per trasformare un percorso in un altro percorso.

Interpolazione. Questo è usato per definire un interpolatore flessibile (rappresentato come un percorso) al posto di quelli definiti dal sistema come LinearInterpolator.

Sposta lungo il percorso. Questo è usato raramente. L'oggetto della geometria può muoversi intorno, lungo un percorso arbitrario.

Così l'animazione di pathData, o "Path Morphing" non è attualmente supportata.

Aggiornamento:
commento di Frank:

Questa è finalmente risolto a sostegno lib 25.4.0 (giugno 2017): "Percorso morphing e interpolazione sono supportati in AnimatedVectorDrawableCompat"

+0

Grazie mille, non sono riuscito a trovare queste limitazioni. –

+0

@Lewis McGeary: trovate qualsiasi informazione su quale versione supporta il percorso –

+7

continua a non funzionare in 24.2.0. Questo tipo di rendering rende inutile l'intera parte "Compat" della libreria di supporto per me! Abbastanza fastidioso dopo aver dichiarato la compatibilità a API11, ma nascondere i dettagli "rilevanti" di ciò che non funziona però. Dovrebbe essere chiamato AnimatedVectorDrawablePartiallyCompat .. –

4

API 16 animation
il "flash" circolare nell'animazione sopra (al centro dell'immagine) è pre ssing lo schermo per iniziare il morph.
che gonfia di

`VectorDrawable` e `AnimatedVectorDrawable` in questa libreria di supporto (`vector-compat`) Drawable può essere gonfiato in questo modo:

  • Calling statici getDrawable() metodi:
//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);

Se si gonfia il Drawable nel codice java, si consiglia di utilizzare sempre ResourcesCompat.getDrawable() poiché gestisce il fallback di Lollipop quando applicabile. Ciò consente al sistema di memorizzare nella cache il costante ConstantState e quindi è più efficiente.
La libreria (`vector-compat`) ha le seguenti Morph (bidirezionale) animazioni:

  • Play-Pause morph animazione
  • Play-Smettere morph animazione
  • Arrow-Hamburger menù morph animazione

  • Come potete vedere, ho prodotto l'immagine qui sopra sul mio API 16 telefono:

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

    sguardo al github README per vector-compat qui: https://github.com/wnafee/vector-compat
    Ciò risolverà il vostro problema (fino a API 14) se si uniscono con del build.gradledependencies (di solito alla fine del file) modulo app:

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