android动画向左滑动​​,向后滑动

时间:2016-10-27 20:06:53

标签: android android-fragments android-animation

我正在尝试在iOS上实现类似于推送和弹出动画的功能。用户正在导航的片段应向左滑出,用户导航到的片段应从右侧滑入。当用户向后导航时(通过单击工具栏上的小箭头图标或按设备上的后退按钮),动画应该反转; “弹出”片段应向右滑出,层次结构中的前一个片段应从左侧滑回。所以它实际上感觉就像你正朝着箭头指向的方向回去。不幸的是,我只能让第一部分发生;当用户返回时,前一个片段也(反直觉地)从右侧滑入,弹出的片段向左滑动! (完全扭转到期望的效果)。

这是我的片段转换代码:

FragmentManager fManager = getSupportFragmentManager();
FragmentTransaction transaction = fManager.beginTransaction();
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);
transaction.replace(R.id.wholeview, itemChoiceFragment, ItemChoiceFragment.class.getName());
transaction.addToBackStack("itemChoice");
transaction.commit();

这是我的动画xmls: slide_in_left.xml:

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

slide_out_right.xml:

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

非常感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:5)

而不是

transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);

使用

transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_right, R.anim.slide_out_left);

R.anim.slide_in_right

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

和R.anim.slide_out_left

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

此方法中的参数是

setCustomAnimations(int enter, int exit, int popEnter, int popExit)

所以基本上

- 在进入

时从右到左滑动新片段 当离开当前片段

时,

向左滑动

- 点击后退时从左到右滑动旧片段

- 单击后退时右侧的当前片段

根据方法说明

FragmentTransaction setCustomAnimations (int enter, 
            int exit, 
            int popEnter, 
            int popExit)
  

设置特定的动画资源,以便为在此事务中进入和退出的片段运行。弹出后退堆栈时,popEnter和popExit动画将专门用于进入/退出操作。

答案 1 :(得分:1)

您可以使用Visibility类(Slide的超级类):

Slide slideTransition = new Slide(fromRightToLeft ? Gravity.END : Gravity.START);
        slideTransition.setDuration(GlobalConstants.TRANSITION_ANIMATION_DURATION);
        fragment.setEnterTransition(slideTransition);

Here是完整指南