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

Dee*_*oel 86 android android-animation

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

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

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

寻找一些线索.

提前致谢.

小智 267

老问题,你可能已经弄清楚了,但为了将来的参考:

这是您通过代码替换片段时用于设置自定义动画的内容:

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();
Run Code Online (Sandbox Code Playgroud)

以下是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>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用兼容性库,这是动画.相反,如果您使用的是SDK和FragmentManager的原生支持,那么您的动画将如下所示:

<?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>
Run Code Online (Sandbox Code Playgroud)

这是因为兼容性库不支持新的objectAnimator类型,而只是实现旧的动画框架.

  • 这绝对是正确的答案.请注意,订单很重要!您需要在添加/替换调用之前调用setCustomAnimations()! (90认同)
  • 你可以使用android命名空间中的预定义动画:transaction.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right); (48认同)
  • 这些不同的动画并不完全相同.您假设片段的宽度等于1280,使用的值为-1280.如果宽度较大,则不会完全脱离屏幕. (17认同)
  • out_right动画将如何? (3认同)
  • 如果你想要最好的补偿,你应该使用哪种方法? (2认同)
  • 预定义的动画会触发运行时异常FWIW,因为它们依赖于"translate"标记. (2认同)