Android 片段和幻灯片动画

Android 片段和幻灯片动画,android,animation,android-fragments,Android,Animation,Android Fragments,在花了相当多的时间搜索这个之后,我需要在这里请求帮助 我有一系列片段,每个片段代表一个“页面”。 我想给用户一个很好的动画效果,当进入下一页,他要求 我希望新的片段滑入前一个片段,将其隐藏起来,就像它是一个实心页面一样。 目前,我可以滑入新片段,但在转换过程中我们仍然可以看到底层片段 以下是我的“滑入”转换定义: <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.c

在花了相当多的时间搜索这个之后,我需要在这里请求帮助

我有一系列片段,每个片段代表一个“页面”。 我想给用户一个很好的动画效果,当进入下一页,他要求

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

以下是我的“滑入”转换定义:

<?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>
我已经看到了我想要演示的效果,但我使用的是片段。 这种转换(只是从最后显示的左位移入)可以通过片段动画实现吗? 或者是片段动画和属性动画的混合我试过了,但弄得一团糟

我正在为平板电脑上的安卓4.0及更高版本构建


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

经过大量的实验和测试,下面是我采用的方法

也许不是最好的,但对我来说很有效

  • 为不做任何事情的片段创建动画
  • 创建新片段时,在初始X位置传递,这是容器视图的负宽度。这将把新的片段偏移放在容器视图的左侧,因此暂时隐藏起来
  • 在带有“保持静止”动画的FragmentTransaction上调用setCustomAnimations
  • 使用FragmentTransaction添加新片段
  • 创建一个动画侦听器,在onAnimationEnd中,该侦听器将调用包含视图来执行以下操作
  • 通过调用bringChildToFront来交换两个视图的顺序
  • 在旧视图上启动新视图动画,以缩小它并使其淡出
  • 在新视图上启动新视图动画以将其滑入
  • 将AnimatorListener附加到动画,以便可以在动画结束时删除旧视图

  • 这些是要遵循的步骤,其余的只是实施:-D

    我发现了一个比目前提出的任何其他解决方案都要好得多的解决方案。我所做的是:

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

    这使得被移除的片段位于新片段之下。按下“后退”按钮看起来有点奇怪,但总的来说要好得多。:-)

    您是如何将AnimatorListener添加到FragmentTransaction的?我正试图解决同样的问题,但我不能完全实现你的解决方案。@JessieA.Morris:解决方案并不那么直接。动画侦听器未连接到FragmentTransaction。您需要在每个片段中重写以下函数:
    public Animator onCreateAnimator(int-transit、boolean-enter、int-nextAnim)
    。检查
    nextAnim
    是否不是0,然后:
    Animator anim=AnimatorInflater.loadAnimator(getActivity(),nextAnim);addListener([你的动画监听器])。希望这能有所帮助。你能分享一些解决方案的代码吗?我希望新的片段滑到旧片段的上方。你在这里提出的建议很有趣,但不符合我上面概述的要求。基本的、传出的片段应该是“收缩”和淡出的,而不是向右滑动,正如我在ViewPager上的链接所示。所以使用不同的动画。代替R.anim.slide\u向左,做R.anim.shrink\u和\u fade\u什么的。最困难的部分是在旧片段之上获得新片段,我的解决方案就是这样做的。
    
    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();
    
            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();