Réponses:
Appelez clearAnimation()
celui que View
vous avez appelé startAnimation()
.
setFillAfter()
ne fait probablement pas ce que vous pensez qu'il fait, de toute façon. Lorsque l'événement tactile se produit, effacez l'animation, puis ajustez votre disposition pour affecter le changement permanent que vous recherchez.
Sur Android 4.4.4, il semble que la seule façon d'arrêter une animation de fondu alpha sur une vue était d'appeler View.animate().cancel()
(c'est-à-dire d'appeler .cancel()
sur la vue deViewPropertyAnimator
).
Voici le code que j'utilise pour la compatibilité avant et après ICS:
public void stopAnimation(View v) {
v.clearAnimation();
if (canCancelAnimation()) {
v.animate().cancel();
}
}
... avec la méthode:
/**
* 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;
}
Voici l'animation que j'arrête:
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);
.setListener(null);
cela m'a aidé.
Si vous utilisez l'écouteur d'animation, définissez v.setAnimationListener(null)
. Utilisez le code suivant avec toutes les options.
v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);
v.setAnimation(null);
car cela se fera en v.clearAnimation();
.
Ce que vous pouvez essayer de faire est d'obtenir la matrice de transformation de l'animation avant de l'arrêter et d'inspecter le contenu de la matrice pour obtenir les valeurs de position que vous recherchez.
Voici les API que vous devriez examiner
public boolean getTransformation (long currentTime, Transformation outTransformation)
public void getValues (float[] values)
Ainsi par exemple (du pseudo code. Je n'ai pas testé ça):
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];
Utilisez la méthode setAnimation (null) pour arrêter une animation, elle est exposée comme méthode publique dans
View.java , c'est la classe de base pour tous les widgets , qui sont utilisés pour créer des composants d'interface utilisateur interactifs (boutons, champs de texte, etc.).
/**
* 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)
Pour arrêter l'animation, vous pouvez définir un objet ObjectAnimator qui ne fait rien, par exemple
d'abord lors du retournement manuel, il y a une animation de gauche à droite:
flipper.setInAnimation(leftIn);
flipper.setOutAnimation(rightOut);
puis lors du passage au retournement automatique, il n'y a pas d'animation
flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);
doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);