Xamarin.Android でフラグメントを切り替える際にアニメーションをつける

Xamarin.Android で Fragment の切り替えによってページ遷移を実現しているんだけど、 iOS の UINavigationController みたいな遷移アニメーションをなんとか実装できたので、 メモを残しておく。

まず、右から左にスライドインするアニメーションが Android.Resource.Animation に無かったので、Resources/anim/slide_in_right.xml を作成。

<?xml version="1.0" encoding="UTF-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
  <translate
    android:fromXDelta="100%p"
    android:toXDelta="0"
    android:duration="@android:integer/config_mediumAnimTime"/>
  <alpha
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="@android:integer/config_mediumAnimTime" />
</set>

右から左にスライドアウトするアニメーションも無かったので、Resources/anim/slide_out_left.xml を作成。

<?xml version="1.0" encoding="UTF-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
  <translate
    android:fromXDelta="0"
    android:toXDelta="-100%p"
    android:duration="@android:integer/config_mediumAnimTime"/>
  <alpha
    android:fromAlpha="1.0"
    android:toAlpha="0.0"
    android:duration="@android:integer/config_mediumAnimTime" />
</set>

あとは、SupportFragmentManager を使ってフラグメントを切り替える際に、作成したアニメーションの ID を指定する。

var transaction = SupportFragmentManager.BeginTransaction();
transaction.AddToBackStack(null);
transaction.SetCustomAnimations(
    Resource.Animation.slide_in_right,
    Resource.Animation.slide_out_left,
    Android.Resource.Animation.SlideInLeft,
    Android.Resource.Animation.SlideOutRight);
transaction.Replace(
    containerViewId,
    fragment);
transaction.Commit();

戻るとき左から右にスライドするアニメーションは Android.Resource.Animation にあったので、それを使っておく。