Görünürlüğünü değiştirdiğimde düzeni yukarı veya aşağı iten bir Animasyon
ile göstermek veya gizlemek istediğim bir LinearLayout
var.
Orada birkaç örnek gördüm ama hiçbiri benim ihtiyaçlarıma uygun değil.
Animasyonlar için iki xml dosyası oluşturdum ancak bir LinearLayout
un görünürlüğünü değiştirdiğimde bunları nasıl başlatacağımı bilmiyorum.
Android 3.0'da (Honeycomb) sunulan yeni animasyon API'si ile bu tür animasyonlar oluşturmak çok kolaydır.
Bir Görünüm
ü belli bir mesafe aşağı kaydırmak:
view.animate().translationY(distance);
Daha sonra Görünüm
ü bu şekilde orijinal konumuna geri kaydırabilirsiniz:
view.animate().translationY(0);
Ayrıca birden fazla animasyonu kolayca birleştirebilirsiniz. Aşağıdaki animasyon bir View
i yüksekliği kadar aşağı kaydırır ve aynı anda soluklaştırır:
// Prepare the View for the animation
view.setVisibility(View.VISIBLE);
view.setAlpha(0.0f);
// Start the animation
view.animate()
.translationY(view.getHeight())
.alpha(1.0f)
.setListener(null);
Daha sonra Görünüm'ü tekrar soldurabilir ve orijinal konumuna geri kaydırabilirsiniz. Ayrıca bir
AnimatorListenerayarlıyoruz, böylece animasyon bittiğinde
Viewgörünürlüğünü tekrar
GONE` olarak ayarlayabiliyoruz:
view.animate()
.translationY(0)
.alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
view.setVisibility(View.GONE);
}
});
Yeni bir LinearLayout
alt sınıfı oluşturarak ve Animations
ı başlatmak için setVisibility()
fonksiyonunu geçersiz kılarak LinearLayout
un görünürlüğü değiştiğinde doğru Animation
ı başlatabilirsiniz. Şöyle bir şey düşünün:
public class SimpleViewAnimator extends LinearLayout
{
private Animation inAnimation;
private Animation outAnimation;
public SimpleViewAnimator(Context context)
{
super(context);
}
public void setInAnimation(Animation inAnimation)
{
this.inAnimation = inAnimation;
}
public void setOutAnimation(Animation outAnimation)
{
this.outAnimation = outAnimation;
}
@Override
public void setVisibility(int visibility)
{
if (getVisibility() != visibility)
{
if (visibility == VISIBLE)
{
if (inAnimation != null) startAnimation(inAnimation);
}
else if ((visibility == INVISIBLE) || (visibility == GONE))
{
if (outAnimation != null) startAnimation(outAnimation);
}
}
super.setVisibility(visibility);
}
}
if (filter_section.getVisibility() == View.GONE) {
filter_section.animate()
.translationY(filter_section.getHeight()).alpha(1.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
filter_section.setVisibility(View.VISIBLE);
filter_section.setAlpha(0.0f);
}
});
} else {
filter_section.animate()
.translationY(0).alpha(0.0f)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
filter_section.setVisibility(View.GONE);
}
});
}