2012-08-13 19 views
22

Kullanıcı, "bir düğmeye bastığında aşağı kayan düzende bir izlenim vermek için yüksekliğini canlandırmak istediğim bazı düğmeler ve metin görünümü için bir kap olarak kullandığım bir LinearLayout var" göster "düğmesi.ValueAnimator ile LinearLayout konteynerinin yüksekliğinin animasyonu

xmlimde LinearLayout öğesini layout_height = "0dp" ve görünürlük = "gitti" olarak ayarlıyorum. Ardından, görünür olması ve içeriği sarmak için hangi yüksekliğe ihtiyaç duyulduğu ayarlanır. Şu anda bile olsa bile, animasyonlu içeriği yüksek tuttuğum sorunları yaşıyorum. Belki Sorun LinearLayout yüksekliğini ayarlıyorum nasıl

private void toggle(final LinearLayout v) { 
    v.setVisibility(View.VISIBLE); 
    ValueAnimator va = ValueAnimator.ofInt(0, 300); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.invalidate(); 

     } 
    }); 

    va.start(); 
} 

:

İşte animasyon benim yöntemidir? Yoksa ValueAnimator'ın işlevini yanlış anladım mı? Chet Haase tarafından blog gönderisine baktım ama herhangi bir özel yükseklik animasyonu örneği içermiyorlar. API'ları kullanarak 3,0+ boyutlarını kullanarak animasyon animasyonlarıyla nasıl çalışabileceğimi ve iyi örnekleri bulamadım. Bu konuda biraz yardım isterim, teşekkürler!

+0

Neden yalnızca düzen animasyonunu kullanmıyoruz? –

+0

Açıkçası onu nasıl kullanacağım konusunda hiçbir fikrim yok ve sadece API'nın daha yeni sürümlerini hedeflediğimden daha yeni sınıfları kullanmanın daha kolay olacağını düşündüm ... LayoutAnimation ile nasıl yapılacağına bakmaya devam edeceğim. Eğer nasıl yapacağınıza dair bir fikriniz varsa, bunu daha iyi bir çözüm olarak yayınlamaktan çekinmeyin :) – span

+0

Geçersizlik için herhangi bir sebep var mı? – portfoliobuilder

cevap

57

Bu blog gönderisine bakıyor: http://tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/ Düzeni yeniden çizmek için view.invalidate() kullanmamalıyım. view.requestLayout() kullanmalıyım.

ValueAnimator va = ValueAnimator.ofInt(0, height); 
    va.setDuration(700); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.requestLayout(); 
     } 
    }); 

Sadece animasyon dinamik hale getirmek için de LinearLayout yüksekliğini almak için nasıl bir not eklemek istedim:

Böylece kod böyle bir şey haline gelir. Yüksekliği elde etmek için öncelikle tüm manzaraların çizilmesi gerekiyor. Bize çizimin yapıldığını söyleyen bir olayı dinlemek zorundayız. Bu, onResume() yönteminden şu şekilde yapılabilir (xml'de kabın yüksekliğe wrap_content olarak bildirildiğini ve bunun da görünür olduğunu, çünkü onu baştan beri gizlemek istiyorum, bunu daha sonra ölçüyorum):

@Override 
    public void onResume() { 
     super.onResume(); 
     final ViewTreeObserver vto = filterContainer.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       height = filterContainer.getHeight(); 
       filterContainer.setVisibility(View.GONE); 
       filterContainer.getLayoutParams().height = 0; 
       filterContainer.requestLayout(); 
       ViewTreeObserver obs = filterContainer.getViewTreeObserver(); 
       obs.removeGlobalOnLayoutListener(this); 
      } 
     }); 
    } 
+3

Bu, getAnimatedValue'yi nasıl kullanacağımı anlamamda bana yardımcı oldu. Teşekkürler – speedynomads

+0

Değer animatörünün daha iyi çalışması, belirli bir süre için başlangıç ​​ve bitiş noktası arasında orta değerler alacaktır ve hedef yüksekliğine ulaşana kadar, düzen aralığımızı bu ara değerle güncelleyebiliriz. Ayrıca animasyon çok pürüzsüz. Teşekkürler. –

+0

Çok teşekkür ederim! Cevabın ikinci kısmı bana çok yardımcı oluyor! – Victor

İlgili konular