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


94

我想通过动画在一个活动中交换两个片段。假设PageA用于片段A,屏幕左侧,而PageB用于片段B,即屏幕右侧。现在我希望当我单击pageA上的按钮时,PageA将移动到屏幕的右侧,并带有一些过渡动画。

我尝试了以下代码来替换职位

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

寻找一些线索。

提前致谢。


Answers:


282

旧的问题,您可能已经知道了,但供将来参考:

这是通过代码替换片段时用来设置自定义动画的方法:

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();

这是slide_in_left动画的示例:

<?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类型,而是仅实现旧的动画框架。


92
这绝对是正确的答案。请注意,顺序很重要!您需要在添加/替换调用之前调用setCustomAnimations()!
theelfismike 2013年

2
那么,如果您想获得最佳组合,应该使用哪种方法?
K-SO的毒性在增加。

17
这些不同的动画并不完全相等。您通过使用-1280的valueFrom来假设片段的宽度等于1280。如果宽度更大,它将无法完全在屏幕外启动。
egfconnor 2013年

51
U可以改用android命名空间中的预定义动画:transaction.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
乔迪2014年

2
预定义的动画会触发运行时异常FWIW,因为它们依赖于“ translate”标签。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.