2010-12-26 19 views
9

Nesne tarafından, iki düzen arasında solma efekti üretecektim. Şimdi bu durumu ettik:Düzenler arasındaki solma efekti

LinearLayout l; 
LinearLayout l2; 

Ben bu transiction arasındaki solma efekti eklemek istediğiniz

l.setVisibility(View.GONE); 
l2.setVisibility(View.VISIBLE); 

kullandım aralarında geçiş yapmak için, bunu nasıl yapabilirim?

cevap

3

R.anim.fade_out öğesini kullanarak & .R.anim.fade_in bunu yapan bir animasyon oluşturabilirsiniz. Bu konuda kendim hakkında pek bir şey bilmiyorum ama android'de animasyonlar ile ilgili bir öğretici: Animation Tutorial

P.S. Bu öğretici benim değil, bu yüzden kredi bana çıkmıyor.

Düzenleme:

AnimationSet set = new AnimationSet(true); 

Animation animation = new AlphaAnimation(0.0f, 1.0f); 
animation.setDuration(50); 
set.addAnimation(animation); 

animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f, 
Animation.RELATIVE_TO_SELF, -1.0f,Animation.RELATIVE_TO_SELF, 0.0f 
); 
animation.setDuration(100); 
set.addAnimation(animation); 

LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f); 
l.setLayoutAnimation(controller); 

Fade dışarı Animasyon ben böyle bir şey deneyebilirsiniz tahmin ediyorum

public static Animation runFadeOutAnimationOn(Activity ctx, View target) { 
    Animation animation = AnimationUtils.loadAnimation(ctx,android.R.anim.fade_out); 
    target.startAnimation(animation); 
    return animation; 
} 

, ben ne yaptığını bilmiyorum öğreticisindeki animasyon yapıştırılan kopya Tam olarak Android geliştirme konusunda hiç tecrübem yok. Diğer bir örnek, burada Example 2

+1

Ben android.R.anim.fade_in ve fade_out kullanmak istiyorum ve overridePendingTransiction yöntemi hakkında bir şey okudum. Ama ben LinearLayout'a animasyonu nasıl ayarlayacağımı anlamıyorum. Bana yardımcı olabilir misiniz? – CeccoCQ

+0

Öğretici anim.fade_in ve fade_out'u kapsar, abit aşağı kaydırırsanız örnek kodu görebilirsiniz! Bu seni düşünmeli. – Citroenfris

21

2 düzenleri arasında solmasını geçmeye çalışan bir çözüm olabilir:

public class CrossFadeActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.crossfade); 

    final View l1 = findViewById(R.id.l1); 
    final View l2 = findViewById(R.id.l2); 

    final Animation fadeOut = AnimationUtils.loadAnimation(CrossFadeActivity.this, R.anim.fade_out); 
    final Animation fadeIn = AnimationUtils.loadAnimation(CrossFadeActivity.this, R.anim.fade_in); 

    findViewById(R.id.button1).setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      fadeOut.setAnimationListener(new AnimationListener() { 
       @Override 
       public void onAnimationStart(Animation animation) { 
       } 

       @Override 
       public void onAnimationRepeat(Animation animation) { 
       } 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        l1.setVisibility(View.GONE); 
       } 
      }); 
      l1.startAnimation(fadeOut); 
      l2.setVisibility(View.VISIBLE); 
      l2.startAnimation(fadeIn); 
     } 
    }); 
    findViewById(R.id.button2).setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      fadeOut.setAnimationListener(new AnimationListener() { 
       @Override 
       public void onAnimationStart(Animation animation) { 
       } 

       @Override 
       public void onAnimationRepeat(Animation animation) { 
       } 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        l2.setVisibility(View.GONE); 
       } 
      }); 
      l2.startAnimation(fadeOut); 
      l1.setVisibility(View.VISIBLE); 
      l1.startAnimation(fadeIn); 
     } 
    }); 
} 
} 

crossfade.xml: L1 ve L2 2 rasgele örnek düzenlemeleridir

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<LinearLayout 
    android:id="@+id/l1" 
    android:layout_width="fill_parent" 
    android:layout_height="300dip" 
    android:orientation="vertical" 
    android:background="@drawable/someimage" 
    > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 

</LinearLayout> 

<RelativeLayout 
    android:id="@+id/l2" 
    android:layout_width="fill_parent" 
    android:layout_height="300dip" 
    android:orientation="vertical" 
    android:background="@drawable/someimage2" 
    android:visibility="gone" 
    > 

    <Button 
     android:id="@+id/button2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     android:layout_centerInParent="true" 
     /> 

</RelativeLayout> 

</RelativeLayout> 

. İşin sırrı, XML'leri, görünür/yok ile birbirleriyle (örn. RelativeLayout) üst üste gelebilecekleri, animasyonları bitişte görünürlüğü değiştirmek için canlandırıcılara ekleyebilecekleri ve daha önce görünmesi gereken görüntüyü ayarlayabilmeleridir. animasyon başlar, aksi halde animasyon görünmez.

Düğmeleri, düzenleri kendi içinde değiştirmek için dinleyicilere koydum, çünkü bu yolu uygulamak zorundayım, ancak tıklama dinleyicisi elbette başka bir yerde olabilir (yalnızca bir tanesiyle birlikte kullanılmalıdır) biraz bayrak veya nasıl geçiş yapacağınızı kontrol edin).

Bunlar animasyon dosyalarıdır. Onlar/klasör res saklanabilir zorunda anim:

fade_in.xml

<?xml version="1.0" encoding="UTF-8"?> 
<alpha xmlns:android="http://schemas.android.com/apk/res/android" 
android:duration="1000" 
android:fillAfter="true" 
android:fromAlpha="0.0" 
android:toAlpha="1.0" /> 

fade_out.xml

<?xml version="1.0" encoding="UTF-8"?> 
<alpha xmlns:android="http://schemas.android.com/apk/res/android" 
android:duration="1000" 
android:fillAfter="true" 
android:fromAlpha="1.0" 
android:toAlpha="0" /> 

GÜNCELLEME: Yerine R.anim.fade_in kullanmanın

, Android API'sından (android.R.fade_in) varsayılan fade_in'i kullanabilirsiniz:

final Animation fadeIn = AnimationUtils.loadAnimation(CrossFadeActivity.this, android.R.anim.fade_in); 

android.R.anim.fade_in dosyasını kullanarak res/anim/fade_in.xml dosyasını oluşturmanıza gerek yoktur.

Android, android.R'deki bazı yararlı animasyonları içeren bir pakettir.anim: http://developer.android.com/reference/android/R.anim.html

+2

Ayrıca, kullanıcının önalanla etkileşim kurması gerektiğinde ilgili düzenlerin z sırasını tersine çevirmek için '.bringToFront()' yöntemini de kullanabilirsiniz. Bu cevap sadece animasyon yönünü kapsamaktadır. –

2

android 3.0 beri xml bir düzeni ve çalışma zamanında bu özel düzenleri içeriğe herhangi bir değişiklik içinde

android:animateLayoutChanges="true" 

kullanabilirsiniz animasyon eklenecektir. Örneğin, durumda, animasyon olacaktır l ebeveyn düzeni ve l2 örn

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="me.kalem.android.RegistrationActivity" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:animateLayoutChanges="true" 
    android:padding="20dp"> 

    <LinearLayout 
     android:id="@+id/l1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:visibility="visible"> 

    ........ 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/l2" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:visibility="gone"> 

    ........ 

    </LinearLayout> 

</LinearLayout> 

Şimdi gizleme l1 ve zamanında l2 göstermek için ebeveyn için bu özniteliği ayarlamak gerekir.