studio animations animaciones android animation

android - animations - Cómo detener una animación(cancelar() no funciona)



android animations (7)

Debes usar .clearAnimation (); método en el hilo de la interfaz de usuario:

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

Necesito dejar de correr una animación traducida. El método de Animation .cancel() no tiene efecto; La animación va hasta el final de todos modos.

¿Cómo se cancela una animación en ejecución?


En Android 4.4.4, parece que la única forma en que podía detener una animación de desvanecimiento alfa en una Vista era llamar View.animate().cancel() (es decir, llamar a .cancel() en ViewPropertyAnimator de ViewPropertyAnimator ).

Aquí está el código que estoy usando para compatibilidad antes y después de ICS:

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

... con el método:

/** * 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; }

Aquí está la animación que estoy parando:

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


Llame a clearAnimation() en cualquier View que haya llamado startAnimation() .


Lo que puede hacer es obtener la Matriz de transformación de la animación antes de detenerla e inspeccionar el contenido de la Matriz para obtener los valores de posición que está buscando.

Aquí están los api que debes mirar

public boolean getTransformation (long currentTime, Transformation outTransformation)

public Matrix getMatrix ()

public void getValues (float[] values)

Así por ejemplo (algunos pseudo código. No he probado esto):

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];


Para detener la animación, puede establecer dicho ObjectAnimator que no haga nada, por ejemplo

Primero, cuando se voltea manualmente, hay animación de izquierda a derecha:

flipper.setInAnimation(leftIn); flipper.setOutAnimation(rightOut);

entonces cuando se cambia a cambio automático no hay animación

flipper.setInAnimation(doNothing); flipper.setOutAnimation(doNothing); doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);


Si está utilizando el detector de animación, configure v.setAnimationListener(null) . Utilice el siguiente código con todas las opciones.

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


Use el método setAnimation (null) para detener una animación, se expone como un método público en View.java , es la clase base para todos los widgets , que se usan para crear componentes de IU interactivos (botones, campos de texto, 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)