2010-11-06 10 views

risposta

418

Chiama clearAnimation() su qualsiasi View hai chiamato startAnimation().

+0

Grazie, CommonsWare, funziona. – Mix

+0

Ma in effetti ho bisogno di una cosa un po 'più complessa: quando l'animazione si ferma, deve rimanere nella posizione corrente, cioè ho un'immagine scorrevole e su un evento touch deve bloccarsi su questo posto. clearAnimation() non è un caso, perché reimposta lo stato sulla posizione di inizio/fine a seconda di setFillAfter() – Mix

+1

@ user349871: 'setFillAfter()' probabilmente non fa quello che tu pensi che faccia, comunque. Quando si verifica l'evento tattile, deselezionare l'animazione e quindi regolare il layout in modo da influire su qualsiasi modifica permanente che si cerca. – CommonsWare

3

Quello che puoi provare a fare è ottenere la trasformazione di Matrix dall'animazione prima di fermarla e ispezionare il contenuto di Matrix per ottenere i valori di posizione che stai cercando.

Ecco le API si dovrebbe guardare in

public boolean getTransformation (long currentTime, Transformation outTransformation)

public Matrix getMatrix()

public void getValues (float[] values)

Così, per esempio (alcuni pseudo codice non ho testato questo.):

Transformation outTransformation = new Transformation(); 
myAnimation.getTransformation(currentTime, outTransformation); 
Matrix transformationMatrix = outTransformation.getMatrix(); 
float[] matrixValues = new float[9]; 
transformationMatrix.getValues(matrixValues); 
float transX = matrixValues[Matrix.MTRANS_X]; 
float transY = matrixValues[Matrix.MTRANS_Y]; 
+0

Akos Cz, grazie! questa idea è buona e potrebbe funzionare – Mix

+0

Dove prendiamo il tempo attuale? – mako

+0

Oh, la documentazione dice che corrisponde al "wall clock", altrove definiscono l'orologio da parete come System.currentTimeMillis(), che corrisponde al tempo del calendario e salterà ogni volta che l'ora viene cambiata dall'utente o dalla rete. Una misura strana da usare. – mako

31

Su Android 4.4.4, sembra che l'unico modo per interrompere un'animazione in dissolvenza alfa su una vista era chiamare il numero View.animate().cancel() (ad esempio chiamando ViewPropertyAnimator) .cancel().

Ecco il codice che sto utilizzando per la compatibilità prima e dopo ICS:

public void stopAnimation(View v) { 
    v.clearAnimation(); 
    if (canCancelAnimation()) { 
     v.animate().cancel(); 
    } 
} 

... con il metodo:

/** 
* Returns true if the API level supports canceling existing animations via the 
* ViewPropertyAnimator, and false if it does not 
* @return true if the API level supports canceling existing animations via the 
* ViewPropertyAnimator, and false if it does not 
*/ 
public static boolean canCancelAnimation() { 
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; 
} 

Ecco l'animazione che sto fermando:

v.setAlpha(0f); 
v.setVisibility(View.VISIBLE); 
// Animate the content view to 100% opacity, and clear any animation listener set on the view. 
v.animate() 
    .alpha(1f) 
    .setDuration(animationDuration) 
    .setListener(null); 
+0

'.setListener (null);' questo mi ha aiutato. –

11

Se si utilizza il listener di animazione, impostare v.setAnimationListener(null). Usa il seguente codice con tutte le opzioni.

v.getAnimation().cancel(); 
v.clearAnimation(); 
animation.setAnimationListener(null); 
+2

Non è necessario chiamare 'v.setAnimation (null);' perché ciò sarà fatto in 'v.clearAnimation();'. – Christian

+0

Come @Christian ha detto che v.setAnimation (null) non è richiesto –

+0

Hey ho aggiornato la mia risposta. – Dhananjay

4

È necessario utilizzare .clearAnimation(); Procedimento thread UI:

runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
        v.clearAnimation(); 
      } 
     }); 
0

Utilizzare il metodo setAnimation (null) fermare un'animazione, esposta come metodo pubblico in View.java, è la classe base per tutti i widget , che vengono utilizzati per creare componenti dell'interfaccia utente interattivi (pulsanti, campi di testo, ecc.). /** * Sets the next animation to play for this view. * If you want the animation to play immediately, use * {@link #startAnimation(android.view.animation.Animation)} instead. * This method provides allows fine-grained * control over the start time and invalidation, but you * must make sure that 1) the animation has a start time set, and * 2) the view's parent (which controls animations on its children) * will be invalidated when the animation is supposed to * start. * * @param animation The next animation, or null. */ public void setAnimation(Animation animation)