片段标准转换不是animation
我正在使用v4 android兼容库来开发一个专门用于Android 2.2设备的片段。
一切工作都应该如此,除了我不能得到任何animation工作,甚至没有标准的animation。
码:
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();
而不是使用过境animation,片段冻结了大约一秒,刚刚消失,新的出现。
使用:
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>
我看到自定义animation在兼容性库中被打破了,但似乎没有人遇到与标准转换有关的问题。 我已经在3.2.1摩托罗拉Xoom,2.3 Galaxy Tab 7“,2.2模拟器,甚至在2.3.4的HTC G2上testing过。
这里有什么可能是错的?
经过多次试验和错误,我终于得到了这个工作。
首先,获得最新的ACL,它确实修复了自定义animation,虽然这不是我确切的问题,但一旦这些工作结束,我最终使用它们而不是标准转换。
现在即时通讯使用:
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"
。
片段animation现在适用于所有设备。 如果您不在应用程序标签中设置额外的信息,animation将会发生变化,但以非常非常不连贯的方式,使得它看起来没有发生。
希望这有助于未来的人!
请注意,有一些API检查工具,所以你确定你没有使用任何不可用的API。 我更喜欢在2.1上工作,所以IDE不显示任何我不能使用,一旦我有稳定的代码,我跳回编译3.0
尝试再次获取最近的ACL,他们已经修复了这个问题: http : //code.google.com/p/android/issues/detail?id=15623#c19
另外我注意到,对于setCustomAnimations,它需要在事务调用之前设置replace才能生效。
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();
我已经将NineOldAndroid支持添加到Google支持库。 有关详细信息,请参阅http://www.github.com/kedzie/Support_v4_NineOldAndroids 。 它允许使用属性animation片段转换,PageTransformers,和其他一些东西。
为片段执行top_to_bottomanimation,
遵循同样的做法从上到下
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"
表示您的片段布局的底部。
在添加片段之前,您必须调用setCustomAnimations
。 这允许添加具有不同animation的多个片段。
希望这有助于某人。 API文档说使用objectAnimator进行片段animation,但即使是最新的兼容性软件包objectAnimator在xml中也没有被编译器接受。
这适用于我:
对于Android 3.0或更高版本:在res / animator文件夹中声明xml objectAnimator。
使用小于3.0的兼容性包:在res / anim文件夹中声明xmlanimation。