【问题标题】:Fragments and slide over animation片段和幻灯片动画
【发布时间】:2014-08-22 06:15:23
【问题描述】:

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

我有一系列片段,每个片段代表一个“页面”。 当用户转到他请求的下一页时,我想给用户一个漂亮的动画效果。

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

这是我的“滑入”过渡定义:

<?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 演示的那种效果 - 但我使用的是 Fragments。 可以通过片段动画实现这种过渡(只是从最后显示的左侧位移入)吗? 或者可能是片段动画和属性动画的混合? - 试过这个,但它变得非常混乱。

我正在为平板电脑上的 Android 4.0 及更高版本进行构建。

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

【问题讨论】:

    标签: android animation android-fragments


    【解决方案1】:

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

    可能不是最好的,但它对我有用。

    1. 为不执行任何操作的片段创建动画师
    2. 创建新片段时,传入初始 X 位置,即容器视图的负宽度。这会将新的片段偏移量放在容器视图的左侧,因此暂时隐藏。
    3. 使用“保持静止”动画在 FragmentTransaction 上调用 setCustomAnimations
    4. 使用 FragmentTransaction 添加新片段
    5. 创建一个动画监听器,在 onAnimationEnd 中,它将调用包含视图来执行以下操作。
    6. 通过调用 bringChildToFront 交换两个视图的顺序
    7. 在旧视图上开始一个新的视图动画以缩小和淡出它
    8. 在新视图上启动新视图动画以将其滑入
    9. 将 AnimatorListener 附加到动画,以便可以在动画结束时移除旧视图。

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

    【讨论】:

    • 您是如何将 AnimatorListener 添加到 FragmentTransaction 的?我正在尝试解决同样的问题,但我不太能够实施您的解决方案。
    • @JessieA.Morris :解决方案不是那么直接。动画侦听器未连接到 FragmentTransaction。您需要在每个片段中覆盖以下函数:public Animator onCreateAnimator(int transit, boolean enter, int nextAnim)。检查nextAnim 是否不为0,然后:Animator anim = AnimatorInflater.loadAnimator(getActivity(), nextAnim); anim.addListener( [your animator listener] );。希望这会有所帮助。
    • 您能否分享一些解决方案的代码,我希望新片段滑到旧片段之上。
    【解决方案2】:

    我找到了一个比迄今为止提出的任何其他解决方案都要好得多的解决方案。我所做的如下:

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

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

    【讨论】:

    • 您在这里提出的建议很有趣,但与我上面概述的要求不符。底层的传出片段应该“缩小”并淡出,而不是向右滑动,正如您从我创建的 ViewPager 的链接中看到的那样。
    • 所以使用不同的动画。而不是 R.anim.slide_left 做 R.anim.shrink_and_fade 或其他什么。困难的部分是将新片段置于旧片段之上,我的解决方案就是这样做的。
    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    相关资源
    最近更新 更多