Ecco una soluzione di lavoro di cross dissolvenza tra 2 layout:
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:
<?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>
Dove L1 e L2 sono 2 esempi di schemi casuali. Il trucco è di metterli in XML in modo tale che si sovrappongano l'un l'altro (ad esempio in un RelativeLayout) con visibile/andato, aggiungere ascoltatori alle animazioni per attivare la visibilità al termine e impostare la vista che deve passare in dissolvenza a visibile prima del l'animazione inizia, altrimenti l'animazione non sarà visibile.
Metto i pulsanti con gli ascoltatori per alternare l'animazione nei layout stessi, perché ho bisogno di implementarlo in quel modo ma l'ascoltatore di clic può essere naturalmente da qualche altra parte (se è solo uno dovrebbe essere usato in combinazione con qualche bandiera o controllo per sapere come passare).
Questi sono i file di animazione. Essi devono essere conservati in cartella res/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" />
UPDATE:
Invece di usare R.anim.fade_in, puoi utilizzare il valore predefinito fade_in dall'API Android (android.R.fade_in):
final Animation fadeIn = AnimationUtils.loadAnimation(CrossFadeActivity.this, android.R.anim.fade_in);
Utilizzando android.R.anim.fade_in, non è necessario creare il file res/anim/fade_in.xml.
Android ha un pacchetto con alcune animazioni utili su android.R.anim: http://developer.android.com/reference/android/R.anim.html
Voglio usare android.R.anim.fade_in e fade_out e ho letto qualcosa sul metodo overridePendingTransiction. Ma non capisco come impostare l'animazione su LinearLayout. Mi potete aiutare? – CeccoCQ
Il tutorial copre anim.fade_in e fade_out, se scorri in basso abit puoi vedere il codice di esempio! Questo dovrebbe farti andare, penso. – Citroenfris