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



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

但是不是香草FragmentManger,我正在尝试使用支持FragmentManager来执行此操作。

这是我要做的:

为了使它适用于支持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替换为补间动画的相应 attr。

阿尔法

valueFrom变得fromAlpha

valueTo变得toAlpha

旋转

valueFrom变得fromDegrees

valueTo变得toDegrees

您还需要添加pivotXpivotY属性。

旋转 y

pivotX="50%"

pivotY="0%"

最新更新