2015-07-18 20 views
8

Bir süredir arandıktan sonra, bu konuyla ilgili herhangi bir bilgi bulamadım ve bir süre sonra FAB'ların (Tasarım destek kütüphanesinden) simge animasyonu oluşturma hakkında belgeler bulmaya çalışıyordum. Android geliştiricilerindeki AnimationDrawable referansı, sınıf ImageView'ın bir çocuğu olsa bile FAB'ler için çalışmaz.FloatingActionButton simge animasyonu (Android FAB src çekilebilir animasyon)

Ancak iyi çalışan bir geçici çözüm elde etmek için yönetmek.

cevap

12

Kullandığım teknik DrawableAnimation belgelerinde bulunana benzer ve Property Animation API doc.

Önce ValueAnimator sınıfını ve animasyonda kullanacağınız çizim araçlarının kimliklerini içeren bir int dizisini kullanıyorum.

final int[] ids = {R.drawable.main_button_1,R.drawable.main_button_2,R.drawable.main_button_3,R.drawable.main_button_4,R.drawable.main_button_5,R.drawable.main_button_6, R.drawable.main_button_7}; 
    fab = (FloatingActionButton) findViewById(R.id.yourFabID); 
    valueAnimator = ValueAnimator.ofInt(0, ids.length - 1).setDuration(yourAnimationTime); 
    valueAnimator.setInterpolator(new LinearInterpolator() /*your TimeInterpolator*/); 

sonra bir AnimationUpdateListener kurmak ve yöntem FloatinActionButton.setImageDrawable (Drawable yourDrawable) ile simge davranış değişikliği tanımlar.

Yine de ValueAnimator varsayılan olarak her kullanılabilir çerçeveyi güncelleştirir (donanımdaki yüke bağlı olarak), ancak önceden çizildiyse simgeyi yeniden çizmemize gerek yoktur, bu yüzden "i" değişkenini kullanıyorum. ; Böylece bir simge, bir diğeriyle değiştirildikten sonra, kod, bir sonraki çekilişin zamanı gelene kadar bekler. Eğer yöntemle geriye animasyon oynarken biliyorum ValueAnimator.reverse();

yanlısı bir çözüm değildir Ayrıca

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     int i = -1; 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      int animatedValue = (int) animation.getAnimatedValue(); 
      if(i!=animatedValue) { 
       fab.setImageDrawable(getResources().getDrawable(ids[animatedValue])); 
       i = animatedValue; 
      } 
     } 
    }); 

onun kullanışlı (zamanlama tanımladığınız interpolator bağlıdır) ama ben ettik tek rakam var PropertyAcimation'u destekleyen tüm API'lar üzerinde çalışmak için. Eğer daha iyi bir çözüm olduğunu biliyorsanız lütfen buraya gönderin, eğer bu gönderinin faydalı olmadığını umarız

İlgili konular