Android 片段标准转换未设置动画

Android 片段标准转换未设置动画,android,animation,android-fragments,android-support-library,Android,Animation,Android Fragments,Android Support Library,我正在使用v4 android兼容性库开发一个平板电脑用户界面,使用专门针对android 2.2及以上设备的片段 一切都正常工作,除了我不能让任何动画工作,即使是标准动画 代码: 而不是使用运输动画,片段冻结约一秒钟,刚消失,新的出现 使用: ft.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right); 也不行 XML: 我读到兼容性库中的自定义动画已被破坏,但似乎没有人对标准转换

我正在使用v4 android兼容性库开发一个平板电脑用户界面,使用专门针对android 2.2及以上设备的片段

一切都正常工作,除了我不能让任何动画工作,即使是标准动画

代码:

而不是使用运输动画,片段冻结约一秒钟,刚消失,新的出现

使用:

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

XML:


我读到兼容性库中的自定义动画已被破坏,但似乎没有人对标准转换有任何问题。我已经在3.2.1摩托罗拉Xoom、2.3 Galaxy Tab 7”、2.2模拟器上进行了测试,甚至在HTC G2和2.3.4上也进行了测试


这里可能有什么问题?

再次尝试获取最新的ACL,他们已经修复了它:

我还注意到,对于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();

经过多次尝试和错误,我终于让它起作用了

首先也是最重要的是,获得最新的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编译,希望这对其他人有所帮助。API文档说使用objectAnimator进行片段动画,但即使是编译器不接受xml中的最新兼容包objectAnimator

这对我很有用:

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


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

要对片段执行从上到下的动画

按照同样的方法从上到下进行操作

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“
指出片段布局的底部。

我已经在Google支持库中添加了NineodelDroids支持。有关详细信息,请参阅。它允许将属性动画用于片段转换、页面转换器和其他内容。

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

dalvik(调试器)有什么给你的吗?你有什么logcat输出给我们吗?没有,这就是我迷路的原因。没有错误。Logcat什么也没显示。只是系统的常规回调,与正在进行的应用程序内更改无关。检查它给出的MTTransition值=4099。该值由以下参数设置:ft.setTransition(FragmentTransaction.transition\u FRAGMENT\u FADE);我在另一台计算机上设置了一个完整的开发环境,结果相同。刚刚更新了兼容包,结果相同。我建立在2.2谷歌API的基础上。我已经做了你描述的两件事,我在评论中声明了这一点,以便跟进我的问题。我已经让它工作了,但我只是在测试之前,我给出了一个我不是100%肯定的答案。我用Galaxy标签,在XOOM上,动画看起来像垃圾。对不起,我不能评论其他人的帖子(没有足够的声誉)。很高兴听到你解决了这个问题!这为我解决了问题。这种神秘的“之前调用”依赖关系非常愚蠢,如果你不能执行正确的构建器模式,那么就不要执行。之所以存在“之前调用”,是因为一个事务可以有多个操作,每个操作都有不同的动画。@mark.kedzierski,这使得API与构建器模式不一致。操作及其属性应该有一个单独的生成器,例如添加片段+动画,替换片段+动画。然后添加到整个片段事务中。感谢您的回答,我正在测试SII、HTC evo、Nexus Galaxy和SIII,看到Nexus落后于动画非常可怕,硬件标记一切都按预期运行:)@blindstuff如果您没有使用API级别高于您支持的最低级别的任何代码,不需要针对较新的API进行编译。针对较新API进行编译的唯一功能就是访问新的类和方法。您需要在3.0或更高版本中进行编译才能识别出
android:hardwareAccelerated=“true”
。谢谢@greg ennis我差点疯了
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();
<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" />