2013年5月14日火曜日

Support package の FragmentTransaction 時のアニメーションをセットする

3.0 以降では FragmentTransaction 時のアニメーションとして "fragmentOpenEnterAnimation" などのスタイルが用意されているのですが、 Support package の FragmentTransaction 時のアニメーションではスタイルは参照されていません。

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 件のコメント:

コメントを投稿