【问题标题】:Fragment standard transition not animating片段标准过渡没有动画
【发布时间】:2011-10-10 20:12:18
【问题描述】:

我正在使用 v4 android 兼容性库来开发一个平板电脑 UI,它使用专门用于 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"、2.2 模拟器,甚至在 HTC G2 和 2.3.4 上进行了测试。

这里有什么问题?

【问题讨论】:

  • dalvik(调试器)给你什么了吗?
  • 您有任何 logcat 输出要给我们吗?
  • 没什么,这就是我迷路的原因。没有错误。 Logcat 什么也没显示。只是系统的定期回调,与正在进行的应用内更改无关。检查它给出的 mTransition 的值 = 4099。该值由以下方式设置:ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
  • 我在另一台计算机上设置了整个开发环境,结果相同。
  • 刚刚更新了兼容包,结果一样。我在 2.2 Google API 上构建。

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


【解决方案1】:

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

首先,获取最新的 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 上编译

【讨论】:

  • 感谢您的回答,我在 SII、HTC evo、Nexus Galaxy 和 SIII 上进行测试,看到 Nexus 动画滞后,硬件标签一切正常 :)
  • @blindstuff 如果您没有使用高于您支持的最低 API 级别的任何代码,则无需针对较新的 API 进行编译。针对较新的 API 进行编译的唯一方法是访问新的类和方法。
  • 您需要在3.0或更高版本中编译才能识别android:hardwareAccelerated="true"
【解决方案2】:

再次尝试获取最新的 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();

【讨论】:

  • 我已经完成了你描述的两件事,我确实在 cmets 中声明了对我的问题的跟进。我已经让它工作了,但我只是在给出一个我不能 100% 确定的答案之前进行测试。我让它与 Galaxy Tab 一起工作,在 XOOM 上,动画看起来像废话。
  • 抱歉,我无法评论其他人的帖子(声誉不够)。很高兴听到你解决了它!
  • 这为我解决了。这种神秘的“call-before”依赖非常愚蠢,如果你不能做一个正确的 Builder 模式,那就不要做。
  • 存在“call-before”是因为一个事务可以有多个操作,每个操作都有不同的动画。
  • @mark.kedzierski 这使得 API 与 Builder 模式不一致。应该有一个单独的构建器用于操作及其属性,例如。添加片段+动画,替换片段+动画。然后将其添加到整个片段事务中。
【解决方案3】:

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

【讨论】:

  • 谢谢@greg-ennis 我快疯了
【解决方案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" 表示片段布局的底部。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      这对我有用:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多