在android.support.v4.Fragment上实现3D翻转动画

21

我目前正在阅读这篇教程:

http://developer.android.com/training/animation/cardflip.html

关于片段的翻转动画 (flip Animations of Fragments)。不幸的是,object-animator 只适用于 android.app.Fragment,而不适用于support Fragment

我尝试使用比例和旋转动画重构 .xml 动画。 但现在动画根本就没有执行,而在动画 .xml 文件中设置的时间过后,其他片段出现,而不是翻转。

  • 我是否只是在实现 .xml 动画时犯了一个错误?
  • 或者说,在没有 object-animator 的情况下无法进行三维翻转动画?
  • 或者说,在 support Fragment 中无法进行三维翻转动画?

以下是我的 .xml 动画:

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:anim/accelerate_decelerate_interpolator"
    android:duration="800"/>

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

flip_left_out.xml

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

   <!-- Rotate. -->
   <rotate
    android:duration="800"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:propertyName="rotationY"
    android:valueFrom="0"
    android:valueTo="180" />

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

 </set>

向右翻转动画效果flip_right_in.xml

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

<!-- Rotate. -->
<rotate
    android:duration="800"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:propertyName="rotationY"
    android:valueFrom="180"
    android:valueTo="0" />

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

  </set>

flip_right_out.xml

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

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

 </set>

以下是执行它们的代码:

FragmentTransaction trans = getActivity().getSupportFragmentManager().beginTransaction();

trans.setCustomAnimations(R.anim.flip_right_in, R.anim.flip_right_out, 
                           R.anim.flip_left_in, R.anim.flip_left_out);
trans.addToBackStack(null);

trans.replace(R.id.content_frame, new MyFragment()).commit();

你做了3D翻转效果吗?你能告诉我如何用对象动画器替换上面的代码吗? - user6517192
3个回答

3

您可以使用NineOldAndroids。它将Honeycomb(Android 3.0)动画API回溯到Android 1.0。您将获得ObjectAnimator,ValueAnimator和所有其他好东西。


2
我已经导入了库,用对象动画器的.xml文件替换了我的.xml动画文件,但是我遇到了一个错误:未知的动画名称:object Animator。 - Philipp Jahoda
你确定你已经正确导入并使用了它吗?在这里可以查看一个XML文件的示例:https://github.com/JakeWharton/NineOldAndroids/blob/master/sample/res/anim/object_animator.xml - Anup Cowkur
@PhilippJahoda,您能告诉我在哪里找到您的答案吗?谢谢。 - Arkadiusz 'flies' Rzadkowolski
是的,请看一下我下面的答案,我刚刚把它恢复了。我最初删除它是因为它被某种方式投票反对了。 - Philipp Jahoda
1
@AnupCowkur 你确定只能使用NineOldAndroids吗?我也遇到了错误“未知的动画名称:object Animator”。 - theblang
显示剩余4条评论

2
谢谢大家的帮助。
我成功解决了我的问题。这个解决方案与NineOldAndroids和另一个支持NineOldAndroids的support-v4库有关。
我所做的:
  • 我下载了这个库:https://github.com/kedzie/Support_v4_NineOldAndroids(这是NineOldAndroids的支持库)
  • 将其导入到我的workspace中
  • 下载了NineOldAndroids库并将其导入到我的workspace中
  • 将NineOldAndroids库导入到support-v4库中
  • 将support-v4-nineoldandroids库导入到我的项目中
  • 执行Filp动画

如果有人在导入“support-v4 support for NineOldAndroids”等方面遇到问题,请确保您的ADT已经更新到最新版本。例如,如果此支持库是针对API 19构建的,则必须在您的ADT中可用。我曾经因为我的ADT只有API 18而遇到了问题。解决方法是将ADT更新到最新版本。 - Stan
如何在Android Studio中使用support-v4支持NineOldAndroids? - Sathish Kumar J

1
如果你不支持低于api<3的版本,可以使用以下给出的代码:https://stuff.mit.edu/afs/sipb/project/android/docs/training/animation/cardflip.html,只需将flipCard方法进行微调即可。
private void flipCard() {
if (mShowingBack) {
    mShowingBack = false;
    FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction();
    trans.setCustomAnimations(R.animator.card_flip_right_in,
            R.animator.card_flip_right_out,
            R.animator.card_flip_left_in,
            R.animator.card_flip_left_out)
         .replace(R.id.memberCardContainer, new CardFrontFragment())
         .commit();
    return;
}

// Flip to the back.
mShowingBack = true;
FragmentTransaction trans = getActivity().getFragmentManager().beginTransaction();
trans.setCustomAnimations(R.animator.card_flip_right_in,
        R.animator.card_flip_right_out,
        R.animator.card_flip_left_in,
        R.animator.card_flip_left_out)
     .replace(R.id.memberCardContainer, new CardBackFragment())
     .commit();
}

当您的片段类扩展支持v4片段时,会出现转换错误。 - Eli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接