Как остановить анимацию (отмена () не работает) - PullRequest
219 голосов
/ 06 ноября 2010

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

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

Ответы [ 7 ]

466 голосов
/ 06 ноября 2010

Звоните clearAnimation() в зависимости от того, View вы звонили startAnimation().

35 голосов
/ 29 сентября 2014

В Android 4.4.4 кажется, что единственный способ остановить анимацию альфа-затухания в представлении - это вызов View.animate().cancel() (то есть вызов .cancel() для представления 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);
18 голосов
/ 28 мая 2015

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

v.getAnimation().cancel();
v.clearAnimation();
animation.setAnimationListener(null);
4 голосов
/ 21 октября 2015

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

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                    v.clearAnimation();
            }
        });
3 голосов
/ 10 ноября 2010

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

Вот 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];
0 голосов
/ 21 августа 2018

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

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

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

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

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

doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);
0 голосов
/ 26 октября 2017

Используйте метод 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'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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...