2010-11-06 23 views

Respuesta

418

Llame a clearAnimation() en cualquiera de los View que llamó al startAnimation().

+0

Gracias, CommonsWare, funciona. – Mix

+0

Pero, de hecho, necesito algo un poco más complejo: cuando la animación se detiene, debe permanecer en su posición actual, es decir, tengo una imagen deslizante y en evento táctil debe congelarse en este lugar. clearAnimation() no es un caso, porque restablece el estado a la posición de inicio/final dependiendo de setFillAfter() – Mix

+1

@ user349871: 'setFillAfter()' probablemente no haga lo que usted cree que ocurre. Cuando se produce el evento táctil, borre la animación y luego ajuste su diseño para afectar cualquier cambio permanente que busque. – CommonsWare

3

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

Estas son las API usted debe buscar en

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

Akos Cz, gracias! esta idea es buena y podría funcionar – Mix

+0

¿Dónde obtenemos el tiempo actual? – mako

+0

Oh, la documentación dice que corresponde al "reloj de pared", en otro lugar definen el reloj de pared como System.currentTimeMillis(), que corresponde al tiempo de calendario y saltará cada vez que el usuario o la red cambien el horario. Una medida extraña para usar. – mako

31

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 al View.animate().cancel() (es decir, llamar al .cancel() en la Vista ViewPropertyAnimator).

Aquí está el código que estoy usando para la 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); 
+0

'.setListener (null);' esto me ayudó. –

11

Si está utilizando el oyente de animación, establezca v.setAnimationListener(null). Use el siguiente código con todas las opciones.

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

No es necesario llamar a 'v.setAnimation (null);' porque esto se hará en 'v.clearAnimation();'. – Christian

+0

Como @Christian dijo que v.setAnimation (null) no es necesario –

+0

Hola, he actualizado mi respuesta. – Dhananjay

4

Debe utilizar .clearAnimation(); método en el subproceso de interfaz de usuario:

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

Utilice el método setAnimation (nulo) para detener una animación, se expone como método público en View.java, es la clase base para todos los widgets de , que se utilizan para crear componentes de interfaz de usuario 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)

Cuestiones relacionadas