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 が渡されるので、例えば横にスライドするアニメーションを切り替えることができます。

  1. MyFragment2 f = new MyFragment2();  
  2. FragmentManager manager = getSupportFragmentManager();  
  3. manager.beginTransaction()  
  4.        .addToBackStack("MyFragment2")  
  5.        .replace(android.R.id.content, f)  
  6.        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)  
  7.        .commit();  
  1. public abstract class MyFragment2 extends Fragment {  
  2.   
  3.     @Override  
  4.     public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {  
  5.           
  6.         if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) {  
  7.             if (enter) {  
  8.                 return AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_right);  
  9.             } else {  
  10.                 return AnimationUtils.loadAnimation(getActivity(), R.anim.slide_out_right);  
  11.             }  
  12.         }  
  13.           
  14.         if (transit == FragmentTransaction.TRANSIT_FRAGMENT_CLOSE) {  
  15.             if (enter) {  
  16.                 return AnimationUtils.loadAnimation(getActivity(), R.anim.slide_in_left);  
  17.             } else {  
  18.                 return AnimationUtils.loadAnimation(getActivity(), R.anim.slide_out_left);  
  19.             }  
  20.         }  
  21.           
  22.         return super.onCreateAnimation(transit, enter, nextAnim);  
  23.     }  
  24. }  

0 件のコメント:

コメントを投稿