片段和幻灯片动画

时间:2014-06-12 08:38:42

标签: android animation android-fragments

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

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

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

这是我的“幻灯片放入”转换定义:

<?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,试图避免使用支持库。

2 个答案:

答案 0 :(得分:0)

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

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

  1. 为无效的片段创建动画制作者
  2. 创建新片段时,传入初始X位置,即容器视图的负宽度。这将使新的片段偏移到容器视图的左侧,因此隐藏起来。
  3. 在FragmentTransaction上调用setCustomAnimations,使用&#34;保持静止&#34;动画
  4. 使用FragmentTransaction 添加新片段
  5. 创建一个动画侦听器,在onAnimationEnd中,将调用包含视图以执行以下操作。
  6. 通过调用bringChildToFront
  7. 交换两个视图的顺序
  8. 在旧视图上启动新视图动画以缩小它并淡出它
  9. 在新视图上启动新视图动画以将其滑入
  10. 将AnimatorListener附加到动画,以便在动画结束时删除旧视图。
  11. 这些是要遵循的步骤,其余的只是实现:-D

答案 1 :(得分: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();

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