Как остановить анимацию (cancel() не работает)

Мне нужно остановить запущенную трансляционную анимацию. Метод .cancel() Animation не влияет; анимация продолжается до конца.

Как отменить запущенную анимацию?

Ответ 1

Вызвать clearAnimation() в зависимости от того, что View вы вызывали startAnimation().

Ответ 2

На Android 4.4.4 кажется, что единственный способ остановить анимацию альфа-затухания в View - это вызвать View.animate().cancel() (то есть вызвать .cancel() в View ViewPropertyAnimator).

Вот код, который я использую для совместимости до и после ICS:

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

... с помощью метода:

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

Вот анимация, которую я остановил:

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

Ответ 3

Если вы используете прослушиватель анимации, установите v.setAnimationListener(null). Используйте следующий код со всеми параметрами.

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

Ответ 4

Вы должны использовать .clearAnimation(); метод в потоке пользовательского интерфейса:

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

Ответ 5

Что вы можете сделать, так это получить матрицу преобразования из анимации, прежде чем остановить ее, и проверить содержимое матрицы, чтобы получить нужные значения позиции.

Вот api, который вы должны изучить

public boolean getTransformation (long currentTime, Transformation outTransformation)

public Matrix getMatrix ()

public void getValues (float[] values)

Итак, например (некоторый псевдокод. Я не тестировал это):

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

Ответ 6

Используйте метод setAnimation (null), чтобы остановить анимацию, которая была открыта как открытый метод в View.java, это базовый класс для всех виджетов, которые используются для создания компонентов интерактивного интерфейса (кнопки, текстовые поля и т.д.). /** * 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 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)

Ответ 7

Чтобы остановить анимацию, вы можете установить такой objectAnimator, который ничего не делает, например

сначала при ручном переключении анимация слева направо:

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

то при переключении на авто листать нет анимации

flipper.setInAnimation(doNothing);
flipper.setOutAnimation(doNothing);

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