通过动画交换活动中的片段

100
我想通过动画交换活动中的两个片段。假设PageA是片段A并在屏幕左侧,而PageB是片段B,即在屏幕右侧。现在,我希望当我在PageA上单击按钮时,PageA将以某种过渡动画移到屏幕右侧。 我尝试以下代码来替换位置:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

寻找一些线索。


1
可能是重复的问题:在片段之间动画过渡 - TalkLittle
1个回答

293

虽然这是一个旧问题,你可能已经解决了,但为了以后的参考:

以下是在代码中替换片段时设置自定义动画所使用的内容:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

这是一个从左侧滑入的动画示例:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="500"/>
</set>

请注意,如果您使用的是兼容性库,则以下是动画效果。相反,如果您正在使用支持FragmentManager的原生SDK,则动画效果如下:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>
这是因为兼容性库不支持新的objectAnimator类型,而只实现了旧的动画框架。

95
这绝对是正确的答案。请注意顺序很重要!在执行添加/替换操作之前,您需要先调用setCustomAnimations()函数。 - theelfismike
2
如果您想获得最佳的计算机性能,应该使用哪种方法? - basickarl
17
这些不同的动画效果并不完全相同。你假定片段的宽度等于1280,因为使用了-1280的valueFrom值。如果宽度更大,则不会完全从屏幕外开始。 - egfconnor
58
你可以使用Android命名空间中预定义的动画:transaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); - Jordy
2
预定义的动画会触发运行时异常,FWIW,因为它们依赖于“translate”标记。 - user153275
显示剩余5条评论

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