
Originariamente inviato da
lsantaniello
Salve a tutti,
ho un'activity con un button ed un fragment. Quando clicco su un button viene cambiato il contenuto del fragment, randomico... l'esempio mi serve per capire il funzionamento.
Funziona tutto ma non vedo alcuna animazione, consigli?
codice:
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
TestFragment llf = new TestFragment();
ft.replace(R.id.testFragment, llf);
ft.commit();
llf.test(i);
Grazie
Ciao,
io ho applicato delle animazioni (stile Google Now) al layout dei Fragment, in questo modo:
1) Ho creato una classe denominata 'NowLayout' (si occupa ti animare tutti i layout child contenuti in un layout 'NowLayout'):
codice:
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.AnimationUtils;
import android.widget.LinearLayout;
public class NowLayout extends LinearLayout implements OnGlobalLayoutListener {
public NowLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initLayoutObserver();
}
public NowLayout(Context context) {
super(context);
initLayoutObserver();
}
private void initLayoutObserver() {
setOrientation(LinearLayout.VERTICAL);
getViewTreeObserver().addOnGlobalLayoutListener(this);
}
@Override
public void onGlobalLayout() {
getViewTreeObserver().removeGlobalOnLayoutListener(this);
final int heightPx = getContext().getResources().getDisplayMetrics().heightPixels;
boolean inversed = false;
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
int[] location = new int[2];
child.getLocationOnScreen(location);
if (location[1] > heightPx) {
break;
}
if (!inversed) {
child.startAnimation(AnimationUtils.loadAnimation(getContext(),
R.anim.slide_up_left));
} else {
child.startAnimation(AnimationUtils.loadAnimation(getContext(),
R.anim.slide_up_right));
}
inversed = !inversed;
}
}
}
Questi i file dell'animazione indicati nella classe NowLayout:
R.anim.slide_up_left:
codice:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator" >
<translate
android:duration="@integer/tempo2"
android:fromYDelta="20%p"
android:toYDelta="0" />
<alpha
android:duration="@integer/tempo2"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
<rotate
android:duration="@integer/tempo2"
android:fromDegrees="0"
android:pivotX="0"
android:pivotY="0"
android:toDegrees="0" />
</set>
e R.anim.slide_up_right:
codice:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator" >
<translate
android:duration="@integer/tempo2"
android:fromYDelta="20%p"
android:toYDelta="0" />
<alpha
android:duration="@integer/tempo2"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
<rotate
android:duration="@integer/tempo2"
android:fromDegrees="0"
android:pivotX="0"
android:pivotY="0"
android:toDegrees="0" />
</set>
a questo punto è sufficiente configurare i tuoi layout (.xml) specificando un layout contenitore di tipo 'NowLayout', in questo modo:
codice:
<com.nome.tua.app.NowLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >
<layout1>
<layout2>
<layout3>
...
</com.nome.tua.app.NowLayout>
Non appena viene eseguita la setContentView nelle tue Activity, partirà l'animazione su tutti i layout figli contenuti all'interno del layout com.nome.tua.app.NowLayout (di tutti i suoi layout) 'in automatico'.
p.s. l'animazione nei file xml l'ho configurata in modo che tutti i layout child si visualizzano in fade partendo dal basso verso l'alto.