2014-06-12 205 views
2

花了很多时间寻找这个之后,我需要在这里请求帮助。片段和幻灯片上的动画

我有一系列代表“页面”的片段。 我想在转到他请求的下一页时给用户一个很好的动画效果。

我希望新的片段可以滑过上一个片段,隐藏它就好像它是一个实体页面一样。 目前我可以在新片段中滑动,但在转换过程中我们仍然可以看到底层片段。

这里是我的过渡定义 “幻灯片”:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" > 

    <objectAnimator 
     android:duration="500" 
     android:propertyName="x" 
     android:valueFrom="-1280" 
     android:valueTo="0" 
     android:valueType="floatType" /> 
</set> 

,这里是我的淡出过渡

<set xmlns:android="http://schemas.android.com/apk/res/android" > 
    <objectAnimator 
     android:propertyName="alpha" 
     android:duration="500" 
     android:valueFrom="1.0" 
     android:valueTo="0" 
     android:valueType="floatType" /> 
</set> 

我套用:

Fragment f = (Fragment)FragClass.newInstance(); 
FragmentTransactionft = getFragmentManager().beginTransaction(); 
ft.setCustomAnimations(R.animator.fragment_slide_in, R.animator.fragment_fade_out); 
ft.replace(R.id.fl_frame, f); 
ft.commit(); 

我所看到的我想用ViewPager来演示这种效果 - 但我使用的是片段。 可以通过片段动画实现这种转换(只需从最后显示的左侧位移入)? 或者可能是片段动画和属性动画的混合? - 尝试过,但它非常混乱。

我在平板电脑上为Android 4.0及以上版本构建。

我不想为此使用ViewPager,试图避免支持库。

回答

0

经过相当多的实验和测试,这里是我采用的方法。

可能不是最好的,但它适用于我。

  1. 创建片段的动画,其不执行任何
  2. 当创建新的片段,通过在初始X位置,该位置是容器视图的负宽度。这会将新的片段偏移量隐藏到容器视图的左侧,并因此隐藏起来。在FragmentTransaction
  3. 呼叫setCustomAnimations与“留还是”动画
  4. 使用FragmentTransaction 添加新片段
  5. 创建一个动画监听器,在onAnimationEnd,将调用包含视图做到以下几点。
  6. 互换的两个视图通过调用bringChildToFront
  7. 开始一个新的视图动画的旧观点萎缩,并淡出出来
  8. 开始一个新的视图动画的新观点,以它滑入
  9. 顺序
  10. 将AnimatorListener附加到动画上,以便在动画结束时删除旧视图。

这些是需要遵循的步骤,剩下的只是实现:-D

+0

你如何将AnimatorListener添加到FragmentTransaction中?我试图解决这个相同的问题,我不能完全实现你的解决方案。 –

+0

@ JessieA.Morris:解决方案并不那么直接。动画侦听器未连接到FragmentTransaction。您需要在每个片段中重写以下函数:'public Animator onCreateAnimator(int transit,boolean enter,int nextAnim)'。检查'nextAnim'是否不是0,然后:'Animator anim = AnimatorInflater.loadAnimator(getActivity(),nextAnim); anim.addListener([你的动画师监听器]);'。希望这可以帮助。 – Simon

+2

可以请你分享一些解决方案的代码,我希望新的片段可以滑过旧的片段。 – Dory

0

我发现比任何已经提出作为然而其他的显著更好的解决方案。我做的是以下几点:

 FragmentManager manager = getSupportFragmentManager(); 

     FragmentTransaction ft = manager.beginTransaction(); 

     FragmentManager.BackStackEntry entry = manager.getBackStackEntryAt(manager.getBackStackEntryCount() - 1); 
     Fragment oldFragment = manager.getFragments().get(entry.getId()); 

     ft.setCustomAnimations(R.anim.slide_left, R.anim.slide_left_out, R.anim.slide_right, R.anim.slide_right_out); 

     ft.hide(oldFragment); 

     ft.add(R.id.container, login).addToBackStack(null).commit(); 

这使得被删除的片段在新的片段下。按下后退按钮时看起来有点奇怪,但总体来说它明显更好。 :-)

+0

你在这里提出的建议很有意思,但不符合我上面概述的要求。底层输出片段应该“缩小”并淡出,而不是向右滑动,正如您从ViewPager所做的链接中所看到的。 – Simon

+0

因此使用不同的动画。而不是R.anim.slide_left做R.anim.shrink_and_fade或其他什么。困难的部分是让我的解决方案所做的旧片段之上的新片段。 –