本文全面介绍了在 Android 应用中如何为 Fragment 设置滑动动画,支持上下滑入滑出效果,涵盖打开 Fragment、返回键返回动画、replace 与 add 的使用差异及最佳实践,是开发者实现炫酷 Fragment 动画过渡不可或缺的参考指南。
在这里插入图片描述


一、前言

在 Android 应用开发中,Fragment 是一种非常常见的页面结构组件。为了提升用户体验,合理的动画过渡效果尤为重要。尤其是在页面切换时,通过滑动动画实现打开和关闭 Fragment,可以大大增强页面之间的流畅感和视觉效果。

本篇博客将详细介绍如何为 Fragment 设置滑动动画,包括从下往上打开、从上往下关闭,以及点击系统返回按钮也能保持动画的一致性。


二、Fragment 动画的基本原理

在 Android 中,Fragment 的切换动画主要通过以下两个方法设置:

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

这两个方法允许你为 Fragment 添加进入和退出时的动画资源。通过定义动画 XML,可以实现任意方向的滑动效果。


三、创建滑动动画资源

res/anim/ 目录下,创建如下 4 个动画资源文件:

  1. slide_in_bottom.xml(从下往上滑入)
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="100%p"
    android:toYDelta="0"
    android:duration="300" />
  1. slide_out_bottom.xml(从上往下滑出)
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="0"
    android:toYDelta="100%p"
    android:duration="300" />
  1. slide_in_top.xml(备用:从上往下滑入)
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="-100%p"
    android:toYDelta="0"
    android:duration="300" />
  1. slide_out_top.xml(备用:从下往上滑出)
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="0"
    android:toYDelta="-100%p"
    android:duration="300" />

四、打开 Fragment 并应用滑动动画

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(
        R.anim.slide_in_bottom, // 进入动画
        R.anim.slide_out_bottom, // 退出动画
        R.anim.slide_in_bottom, // popEnter
        R.anim.slide_out_bottom  // popExit
);
transaction.add(R.id.fragment_container, new MyFragment());
transaction.addToBackStack(null);
transaction.commit();

此时打开 Fragment 时会从下往上滑入,返回时从上往下滑出。


五、关闭 Fragment(带动画)

如果你使用的是手动移除 Fragment,例如:

FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(0, R.anim.slide_out_bottom);
transaction.remove(this);
transaction.commit();

注意:
此方式在动画完成前,Fragment 已经被移除,用户可能看不到完整动画。推荐使用 popBackStack() 搭配 addToBackStack(),这样系统会自动执行 popExit 动画。


六、点击返回按钮,保留动画

在你的 Activity 中或 Fragment 中监听返回事件,不要直接调用 finish()remove(),而是:

requireActivity().getSupportFragmentManager().popBackStack();

系统会调用你在 setCustomAnimations() 中设置的 popEnterpopExit 动画。


七、可选增强:自定义 Fragment 动画过渡

你还可以通过 Fragment.setEnterTransition()setExitTransition() 等方式,在 Android 5.0+ 系统使用 Transition 框架增强动画:

Slide slide = new Slide(Gravity.BOTTOM);
slide.setDuration(300);
setEnterTransition(slide);
setExitTransition(slide);

不过这种方式仅限于 Android Lollipop 及以上版本,不如 setCustomAnimations() 通用。


八、replace vs add:区别对比

方法 说明
add() 向容器中添加新的 Fragment,保留原 Fragment
replace() 替换容器中的 Fragment,相当于先 remove 后 add
addToBackStack() 是否能通过返回键回退

若需要返回动画,请使用 add() + addToBackStack(),而不是 replace(),否则可能出现回退动画无效的问题。


九、常见问题及解决方案

  • 问题:系统返回键无动画

    • 原因:使用 remove() 而不是 popBackStack()
    • 解决:正确使用 addToBackStack()popBackStack()
  • 问题:动画未完整显示

    • 原因:立即 remove(),导致动画未完成。
    • 解决:使用 popBackStack(),或延时 remove() 操作。

十、总结

通过 FragmentTransaction.setCustomAnimations() 配合 XML 动画资源文件,可以轻松实现 Fragment 的滑动动画。推荐使用 add() + addToBackStack() 的方式管理 Fragment 生命周期,同时配合系统 popBackStack() 实现优雅的过渡与返回动画。


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐