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