Як зупинити анімацію (cancel () не працює)


245

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

Як ви скасуєте запущену анімацію?

Відповіді:


509

Телефонуйте, clearAnimation()кого б Viewви не зателефонували startAnimation().


Але насправді мені потрібна дещо складніша річ: коли анімація зупиняється, вона повинна залишатися в поточному положенні, тобто у мене ковзаюче зображення, і при події на дотик воно повинно застигнути в цьому місці. clearAnimation () - це не випадок, оскільки він скидає стан для початкової / кінцевої позиції залежно від setFillAfter ()
змішайте

1
@ user349871: setFillAfter()напевно, все одно не робить те, що, на вашу думку, робить. Коли відбудеться подія дотику, очистіть анімацію, а потім відрегулюйте ваш макет, щоб впливати на будь-які постійні зміни, які ви шукаєте.
CommonsWare

Гаразд, добре, я спробую зупинити анімацію, зателефонувавши clearAnimation (). Наступним кроком є ​​пошук місця, де була анімація, перш ніж я її зупиняю. Що для цього API?
Мікс

@Mix: Для цього немає API.
CommonsWare

7
Привіт ще раз! Я знайшов спосіб отримати точку (з точки зору інтерпольованого часу), коли анімація була скасована. Вам потрібно зробити підклас Animation і поставити туди код з анімації андроїд-коду (наприклад, TranslateAnimation). У вашому класі ви зможете зберегти та відслідковувати позицію у функції applyTransformation ().
Мікс

40

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

.setListener(null);це мені допомогло.
Мухаммед Сакіб

18

Якщо ви користуєтеся слухачем анімації, встановіть v.setAnimationListener(null). Використовуйте наступний код з усіма параметрами.

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

2
Не обов’язково телефонувати, v.setAnimation(null);тому що це буде зроблено в v.clearAnimation();.
Крістіан

Як заявив @Christian v.setAnimation (null) не потрібно
akshay bhange

5

Ви повинні використовувати .clearAnimation (); метод у потоці інтерфейсу користувача:

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

3

Що ви можете спробувати зробити, це отримати матрицю перетворення з анімації, перш ніж зупинити її, і оглянути вміст матриці, щоб отримати значення позиції, яку ви шукаєте.

Ось такі інструменти, які ви повинні заглянути

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

Де ми беремо поточний час?
mako

О, в документації йдеться про те, що він відповідає "настінному годиннику", в іншому випадку вони визначають настінний годинник як System.currentTimeMillis (), який відповідає часу календаря і скаче кожного разу, коли час зміниться користувачем або мережею. Незвичайний захід, який потрібно використовувати.
mako

0

Використовуйте метод 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)


0

Для зупинки анімації ви можете встановити такий objectAnimator, який нічого не робить, наприклад

Спочатку при ручному перегортанні з'являється анімація зліва направо:

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

то при переході на автоматичне гортання анімації немає

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

doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.