片段标准转换不是动画

时间:2011-10-10 20:12:19

标签: android animation android-fragments android-support-library

我正在使用v4 android兼容性库,使用专门针对Android 2.2及更高版本设备的片段开发平板电脑用户界面。

除了我无法使用任何动画,甚至标准动画外,所有内容都应该正常工作。

代码:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    ABCFragment abcFragment = new ABCFragment();
    ft.replace(R.id.main_frame_layout_fragment_holder,abcFragment);     
    ft.addToBackStack(null);
    ft.commit();

该片段不会使用传输动画,而是冻结大约一秒钟,然后就会消失并出现新的片段。

使用:

ft.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right);

也不起作用。

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.synergygb.mycustomapp"
android:id="@+id/LinearLayout01" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:gravity="bottom">
<FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/main_frame_layout_fragment_holder">
</FrameLayout>
<!-- OTHER FIXED UI ELEMENTS-->
</RelativeLayout>

我读到自定义动画在兼容性库中被破坏了,但似乎没有人遇到标准转换的问题。我已经在3.2.1摩托罗拉Xoom,2.3 Galaxy Tab 7&#34;,2.2仿真器,甚至在2.4.4的HTC G2上测试了这个。

这里可能有什么问题?

6 个答案:

答案 0 :(得分:36)

经过多次试验和错误后,我终于开始工作了。

首先,获得最新的ACL,它确实修复了自定义动画,虽然这不是我的确切问题,但一旦有效,我最终使用它们而不是标准过渡。

现在我正在使用:

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

使其适用于Android 2.1,2.2和2.3以及Android 3.0+的关键是执行以下操作:

  • 确保您使用的API仅适用于您希望支持的最低API级别(在我的情况下为2.1)。
  • 使用Android 3.0进行编译。
  • 在清单文件中,在应用程序标记内设置android:hardwareAccelerated="true"

片段动画现在适用于所有设备。如果你没有在应用程序标签中设置额外的信息,那么动画就会出现问题,但是会以一种非常不稳定的方式,使它看起来根本没有发生。

希望这可以帮助将来的某个人!

作为一个注释,有一些API检查工具,所以你确定你没有使用任何不可用的API。我更喜欢在2.1上工作,所以IDE没有显示我无法使用的任何内容,一旦我有稳定的代码,我就会跳回到3.0上的编译

答案 1 :(得分:34)

尝试再次获取最新的ACL,他们修复了它: http://code.google.com/p/android/issues/detail?id=15623#c19

另外我注意到对于setCustomAnimations,它需要在事务调用之前设置,比如替换才能生效。

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.in_from_left, R.anim.out_to_right, R.anim.in_from_right, R.anim.out_to_left);
ft.replace(android.R.id.content, newFrag);
ft.addToBackStack(null);
ft.commit();

答案 2 :(得分:4)

为片段执行top_to_bottom动画,

按照同样做从上到下

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.top_to_bottom_fragment,
android.R.animator.fade_out); ft.replace(R.id.simple_fragment,
fragment); 
ft.commit();

top_to_bottom_fragment.xml

<objectAnimator android:duration="400" android:valueFrom="-800"
    android:valueTo="0" android:propertyName="y"
    android:valueType="floatType"
    xmlns:android="http://schemas.android.com/apk/res/android" />

其中valueFrom="-800"表示片段布局的底部。

答案 3 :(得分:4)

在添加片段之前,您必须先致电setCustomAnimations 。这允许添加具有不同动画的多个片段。

答案 4 :(得分:3)

我已将NineOldAndroids支持添加到Google支持库中。有关详细信息,请参阅http://www.github.com/kedzie/Support_v4_NineOldAndroids。它允许使用片段转换的属性动画,PageTransformers和其他一些东西。

答案 5 :(得分:0)

希望这有助于某人。 API文档说使用objectAnimator作为片段动画,但即使使用最新的兼容包,编译器也不接受xml中的objectAnimator。

这对我有用:

对于Android 3.0或更高版本:在res / animator文件夹中声明xml objectAnimator。

兼容性包小于3.0:在res / anim文件夹中声明xml动画。