FragmentTransaction 時の Animation は FragmentManager の loadAnimation() メソッドで決まります。
このメソッド内のロジックは次のようになっています。
1. Fragment の onCreateAnimation() の戻り値の Animation インスタンスが null じゃなかったからそれを使う
2. onCreateAnimation() の第3引数で渡した Fragment の mNextAnim フィールドが 0 じゃなければそれのリソースIDの Animation を使う
3. transit が FragmentTransaction.TRANSIT_FRAGMENT_OPEN, FragmentTransaction.TRANSIT_FRAGMENT_CLOSE, FragmentTransaction.TRANSIT_FRAGMENT_FADE のいずれかの場合、 enter かどうかに応じて決まる Animation (6種類のいずれか) を使う
ということで、任意のアニメーションをセットしたい場合は 1. の方法が一番楽。
transaction 時に setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) しておくと、 addToBackStack() でスタックしておいたものをバックキーで戻すときに transit として FragmentTransaction.TRANSIT_FRAGMENT_CLOSE が渡されるので、例えば横にスライドするアニメーションを切り替えることができます。
MyFragment2 f = new MyFragment2();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction()
.addToBackStack("MyFragment2")
.replace(android.R.id.content, f)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
public abstract class MyFragment2 extends Fragment {
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) {
if (enter) {
return AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_right);
} else {
return AnimationUtils.loadAnimation(getActivity(), R.anim.slide_out_right);
}
}
if (transit == FragmentTransaction.TRANSIT_FRAGMENT_CLOSE) {
if (enter) {
return AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_left);
} else {
return AnimationUtils.loadAnimation(getActivity(), R.anim.slide_out_left);
}
}
return super.onCreateAnimation(transit, enter, nextAnim);
}
}
0 件のコメント:
コメントを投稿