Bir animasyon nasıl durdurulur (cancel () çalışmıyor)


245

Çalışan bir çeviri animasyonu durdurmam gerekiyor. .cancel()Yöntem Animationherhangi bir etkiye sahip animasyon yine de sonuna kadar gider.

Çalışan bir animasyonu nasıl iptal edersiniz?

Yanıtlar:


509

clearAnimation()Hangisini Viewaradığınızı arayın startAnimation().


Ama aslında biraz daha karmaşık bir şeye ihtiyacım var: animasyon durduğunda, mevcut pozisyonda kalmalıdır, yani kayan görüntüye sahibim ve dokunma olayında bu yerde donması gerekiyor. o () setFillAfter bağlı / bitiş konumunu başlatmak için durumunu sıfırlar çünkü clearAnimation (), bir durum değildir
Mix

1
@ user349871: setFillAfter()muhtemelen zaten düşündüğünü yapmaz. Touch olayı meydana geldiğinde, animasyonu temizleyin ve ardından istediğiniz kalıcı değişikliği etkileyecek şekilde mizanpajınızı ayarlayın.
CommonsWare

Tamam, güzel, clearAnimation () öğesini çağırarak animasyonu durdurmaya çalışacağım. Bir sonraki adım, animasyonu durdurmadan önce bulunduğu konumu bulmaktır. Bunun için hangi API?
Mix

@ Mix: Bunun için API yok.
CommonsWare

7
Tekrar merhaba! Animasyon iptal edildiğinde (enterpolasyon süresi açısından) nokta almanın bir yolunu buldum. Animasyon alt sınıfı yapmanız ve android kod animasyonu (örneğin TranslateAnimation) kodunu koymanız gerekir. Sınıfınızda, ApplyTransformation () işlevinde konumu kaydedebilir ve takip edebilirsiniz.
Mix

40

Android 4.4.4 günü, ben çağırıyordu bir Gönünümü'ndeki bir alfa solan animasyonu durdurabilir tek yolu gibi görünüyor View.animate().cancel()(çağırarak, yani .cancel()Görünüm en üstünde ViewPropertyAnimator).

ICS öncesi ve sonrası uyumluluk için kullandığım kod:

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

... yöntemle:

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

İşte durduğum animasyon:

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);bu bana yardımcı oldu.
Muhammed Saqib

18

Animasyon dinleyicisini kullanıyorsanız, öğesini ayarlayın v.setAnimationListener(null). Tüm seçeneklerle aşağıdaki kodu kullanın.

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

2
Aramak gerekli değildir v.setAnimation(null);çünkü bu yapılacaktır v.clearAnimation();.
Christian

@Christian'ın dediği gibi v.setAnimation (null) gerekli değil
akshay bhange

5

.ClearAnimation (); UI iş parçacığında yöntem:

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

3

Yapmaya çalışabileceğiniz şey, durmadan önce animasyondan Matrix dönüşümünü almak ve aradığınız konum değerlerini almak için Matrix içeriğini incelemek.

İşte bakmanız gereken api'ler

public boolean getTransformation (long currentTime, Transformation outTransformation)

public Matrix getMatrix ()

public void getValues (float[] values)

Yani örneğin (bazı sözde kod. Bunu test etmedim):

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

CurrentTime'ı nereden edinebiliriz?
mako

Oh, belgeler "duvar saatine" karşılık geldiğini söylüyorlar, başka bir yerde duvar saatini System.currentTimeMillis () olarak tanımlıyorlar. Kullanmak için garip bir önlem.
mako

0

View.java'da genel yöntem olarak gösterilen bir animasyonu durdurmak için setAnimation (null) yöntemini kullanın, etkileşimli UI bileşenleri (düğmeler, metin alanları vb.) Oluşturmak için kullanılan tüm widget'lar için temel sınıftır . /** * 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

Animasyonu durdurmak için hiçbir şey yapmayan bir objectAnimator ayarlayabilirsiniz, örn.

önce manuel çevirme soldan sağa animasyon olduğunda:

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

otomatik çevirme moduna geçerken animasyon olmaz

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

doNothing = ObjectAnimator.ofFloat(flipper, "x", 0f, 0f).setDuration(flipperSwipingDuration);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.