使用支持片段管理器翻转动画

Flip animation using support fragment manager

所以我试图复制这个:https://developer.android.com/training/animation/cardflip.html

但是我尝试使用支持 FragmentManager.

而不是香草 FragmentManger

这是我的出发点:

为了支持 Fragment,我制作了 anim 个文件而不是 animator 个文件。

card_flip_left_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">


 <!-- Before rotating, immediately set the alpha to 0. -->
  <alpha
      android:valueFrom="1.0"
      android:valueTo="0.0"
      android:propertyName="alpha"
      android:duration="0" />

  <!-- Rotate. -->
  <rotate
      android:valueFrom="-180"
      android:valueTo="0"
      android:propertyName="rotationY"
      android:interpolator="@android:interpolator/accelerate_decelerate"
      android:duration="@integer/card_flip_time_full" />

  <!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
  <alpha
      android:valueFrom="0.0"
      android:valueTo="1.0"
      android:propertyName="alpha"
      android:startOffset="@integer/card_flip_time_half"
      android:duration="1" />

</set>

card_flip_left_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- Rotate. -->
  <rotate
      android:valueFrom="0"
      android:valueTo="180"
      android:propertyName="rotationY"
      android:interpolator="@android:interpolator/accelerate_decelerate"
      android:duration="@integer/card_flip_time_full" />

  <!-- Half-way through the rotation (see startOffset), set the alpha to 0. -->
  <alpha
      android:valueFrom="1.0"
      android:valueTo="0.0"
      android:propertyName="alpha"
      android:startOffset="@integer/card_flip_time_half"
      android:duration="1" />
</set>

card_flip_right_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- Before rotating, immediately set the alpha to 0. -->
  <alpha
      android:valueFrom="1.0"
      android:valueTo="0.0"
      android:propertyName="alpha"
      android:duration="0" />

  <!-- Rotate. -->
  <rotate
      android:valueFrom="180"
      android:valueTo="0"
      android:propertyName="rotationY"
      android:interpolator="@android:interpolator/accelerate_decelerate"
      android:duration="@integer/card_flip_time_full" />

  <!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
  <alpha
      android:valueFrom="0.0"
      android:valueTo="1.0"
      android:propertyName="alpha"
      android:startOffset="@integer/card_flip_time_half"
      android:duration="1" />
</set>

card_flip_right_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- Rotate. -->
  <rotate
      android:valueFrom="0"
      android:valueTo="-180"
      android:propertyName="rotationY"
      android:interpolator="@android:interpolator/accelerate_decelerate"
      android:duration="@integer/card_flip_time_full" />

  <!-- Half-way through the rotation (see startOffset), set the alpha to 0. -->
  <alpha
      android:valueFrom="1.0"
      android:valueTo="0.0"
      android:propertyName="alpha"
      android:startOffset="@integer/card_flip_time_half"
      android:duration="1" />
</set>

最后这是我进行转换的代码:

private void flipFragment(Fragment fragment, String tag){
    // if we are showing the back, just pop the back stack
    if(showingBack){
      getSupportFragmentManager().popBackStack();
      showingBack = false;
      return;
    }

    // otherwise flip it
    showingBack = true;
    getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(
            R.anim.card_flip_right_in,
            R.anim.card_flip_right_out,
            R.anim.card_flip_left_in,
            R.anim.card_flip_left_out)
        .replace(getFragmentViewId(), fragment, tag)
        .addToBackStack(null)
        .commit();

  }

一切正常,除了动画。

编辑: 使用淡入淡出动画效果很好:

.setCustomAnimations(
        android.R.anim.fade_in, android.R.anim.fade_out,
        android.R.anim.fade_in, android.R.anim.fade_out)

您的动画不工作,因为您没有使用正确的属性。您需要将 valueFromvalueTo 替换为 tween animations.

的相应属性

阿尔法

valueFrom 变为 fromAlpha

valueTo 变为 toAlpha

旋转

valueFrom 变为 fromDegrees

valueTo 变为 toDegrees

您还需要添加 pivotXpivotY 属性。

旋转y

pivotX="50%"

pivotY="0%"