2010-10-25 17 views
5

Ho preso qualche xml di animazione direttamente dai documenti di android e come per lo per quanto posso vedere, non funziona sul mio emulatore di aggiornamento 2.1 o su il mio dispositivo di aggiornamento 2.1 1 Galaxy S.Animazione Android startOffset rotto o difettoso?

In particolare, sto cercando di creare un'animazione a pulsare una vista (cioè renderlo più piccolo allora più grande in un'animazione) Questo è il molto semplice markup:

<?xml version="1.0" encoding="utf-8"?> 
<set 
     xmlns:android="http://schemas.android.com/apk/res/android"> 
     <scale 
       android:fromXScale="1.0" 
       android:toXScale="0.5" 
       android:fromYScale="1.0" 
       android:toYScale="0.5" 
       android:pivotX="50%" 
       android:pivotY="50%" 
       android:duration="1000" /> 
       <set android:startOffset="1000"> 
         <scale 
         android:fromXScale="0.5" 
         android:toXScale="1.0" 
         android:fromYScale="0.5" 
         android:toYScale="1.0" 
         android:pivotX="50%" 
         android:pivotY="50%" 
         android:duration="1000" /> 
       </set> 
</set> 

Quindi quello che sto cercare di ottenere è di ridurre la vista dalle sue dimensioni a metà di esso per un secondo, quindi per aumentare nuovamente la sua dimensione originale per un secondo. Quindi per ripetere questa operazione, in due secondi dovrebbe andare da originale -> metà dimensione -> originale.

Cosa accade realmente è non scatta immediatamente alla metà della dimensione vista (anche se fromX/yScale è a 1.0) e quindi esegue l'animazione in due secondi e scatta indietro alla dimensione originale dopo.

Qualcun altro può provarlo rapidamente? Se gli altri vedono questo comportamento , lo invierò come un bug. Non riesco a credere che una cosa così semplice possa essere annullata !?

Inoltre, la copia di questa animazione sotto il "Tween animazione" voce su questa pagina http://developer.android.com/guide/topics/graphics/2d-graphics.html parola per parola, inoltre, non come per animare pagina dice. Sembra essere rotto esattamente allo stesso modo!

Qualcuno ha qualche idea?

Grazie!

Andy.

risposta

3

Ho rimosso il secondo tag <set>, quindi c'è solo uno <set> con due bambini <scale>. Questo ha funzionato bene un ciclo, ma non è riuscito a ripetere. Forse devi ascoltare la fine dell'animazione e riavviarla manualmente (quindi gli offset partono da 0 ogni volta).

Il lato positivo sono stato in grado di utilizzare repeatMode per ottenere l'effetto ti sembra di volere, con un unico tag:

<scale xmlns:android="http://schemas.android.com/apk/res/android" 
     android:repeatMode="reverse" 
     android:fromXScale="1.0" 
     android:toXScale="0.5" 
     android:fromYScale="1.0" 
     android:toYScale="0.5" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:duration="1000" /> 
+0

Ci siamo quasi!Avevo bisogno di aggiungere android: repeatCount = "1" perché funzioni, altrimenti esegue il ridimensionamento dell'animazione e dello snap indietro (invece di tornare indietro). In entrambi i casi funziona con questa aggiunta! Grazie mille! :) In una nota a margine, ho effettivamente provato questo approccio, tutto in codice, ma non si è ripetuto, ma si è sempre spezzato nonostante il conteggio delle ripetizioni! I documenti Android falliscono di nuovo! ;) – Andy

+0

Scusa, ho dimenticato quel piccolo dettaglio (che avevo fatto nel codice, non in XML). –

5

Qualcosa che ho scoperto di recente ed è parzialmente responsabile per il comportamento indesiderato della tua animazione è il fatto che molti attributi XML usati nel tag <set> non funzionano!

Nel tuo esempio di codice si dispone <set android:startOffset="1000">

A causa di un ridicolo bug/difetto, Android ignorerà questo attributo che farà sì che il vostro secondo figlio <set> di animazioni per iniziare in concomitanza con il genitore <set>

Ciò che rende questo ancora più frustrante è che questo attributo funziona programmaticamente nel codice, setStartOffset() ma non in XML.

ho trascorso un paio d'ore frustrante per capire che attribuisce il lavoro in codice e XML per AnimationSet s ed ha presentato una segnalazione di bug/problema qui: Issue 17662

In sintesi:

setRepeatCount()/Android : repeatCount

Questo attributo (così come repeatMode) non funziona nel codice o nell'XML. Questo rende difficile ripetere un'intera serie di animazioni.

setDuration()/Android: durata

L'impostazione di questo su un AnimationSet in codice funziona (sostituisce tutte le durate di animazioni per bambini), ma non quando incluso nel tag in XML

setFillAfter()/android: fillAfter

Questo funziona sia in codice che in XML per il tag. Stranamente ho ottenuto di funzionare anche senza la necessità di impostare fillEnabled su true.

setFillBefore()/Android: fillBefore

sembra non avere effetto/ignorato sia in codice e XML

setFillEnabled()/Android: fillEnabled

Sembra non avere alcun effetto/ignorato sia nel codice che nell'XML. Posso ancora ottenere fillAfter per funzionare anche senza includere fillEnabled o l'impostazione fillEnabled su false.

setStartOffset()/Android: startOffset

Questo funziona solo nel codice e non XML.

Inutile dire che questo provoca un sacco di inutili frustrazioni.

2

Provare i seguenti codici. Quello che manca è repeatMode = "-1" nella risposta precedente. Quindi vedrai l'immagine pulsare indefinitamente senza usare l'ascoltatore.

In res/anim/pulsate.xml:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > 
<scale 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="1000" 
    android:fromXScale="0.5" 
    android:fromYScale="0.5" 
    android:pivotX="50%" 
    android:pivotY="50%" 
    android:repeatMode="reverse" 
    android:repeatCount="-1" 
    android:toXScale="1.0" 
    android:toYScale="1.0" /> 

In java:

Animation animPulsate = AnimationUtils.loadAnimation(JoinRecipeClubActivity.this, R.anim.pulsate); 
ImageView ivFinger = (ImageView) findViewById(R.id.wivFinger); 
ivFinger.startAnimation(animPulsate);