You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android导航中Fragment转场:Transition转Animation及注入Explode方法

问题解答

一、Transition 转 Animation 实现 Fragment 切换动画

Transition(过渡)和 Animation(动画)是Android两套独立的API体系,没有直接的转换方法,但可以通过两种思路实现类似效果:

1. 直接用 Transition API 处理 Fragment 切换

不需要转换,直接借助TransitionManager让Fragment切换时应用Explode这类过渡效果:

// Kotlin示例
supportFragmentManager.beginTransaction().apply {
    replace(R.id.container, targetFragment)
    addToBackStack(null)
    // 给容器View绑定Explode过渡
    TransitionManager.beginDelayedTransition(requireViewById(R.id.container), Explode().apply {
        duration = 500
    })
    commit()
}

注意:容器布局需支持过渡(如ConstraintLayout、LinearLayout等常规布局都可)。

2. 自定义Animation模拟Transition效果

如果必须用Animation体系,可自定义Animation类模拟Explode的扩散/收缩逻辑:

class ExplodeEnterAnimation : Animation() {
    override fun applyTransformation(interpolatedTime: Float, t: Transformation) {
        super.applyTransformation(interpolatedTime, t)
        // 随动画进度缩放视图,模拟爆炸入场
        val scale = interpolatedTime * 1.2f
        t.matrix.setScale(scale, scale, pivotX, pivotY)
        t.alpha = interpolatedTime
    }

    override fun initialize(width: Int, height: Int, parentWidth: Int, parentHeight: Int) {
        super.initialize(width, height, parentWidth, parentHeight)
        pivotX = width / 2f
        pivotY = height / 2f
        duration = 500
        interpolator = AccelerateDecelerateInterpolator()
    }
}

之后在Navigation的NavOptions中使用这个自定义动画:

val navOptions = NavOptions.Builder()
    .setEnterAnim(R.anim.custom_explode_enter)
    .setExitAnim(R.anim.custom_explode_exit)
    .build()
findNavController().navigate(R.id.target_dest, null, navOptions)

二、将Explode过渡注入Navigation组件

完全可以实现,有两种常用方案:

1. 导航图XML配置

  • 先在res/transition目录下创建explode_transition.xml:
<?xml version="1.0" encoding="utf-8"?>
<explode xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"/>
  • 给单个跳转Action配置:
<fragment
    android:id="@+id/homeFragment"
    android:name="com.example.HomeFragment">
    <action
        android:id="@+id/action_home_to_detail"
        app:destination="@id/detailFragment"
        app:enterTransition="@transition/explode_transition"
        app:exitTransition="@transition/explode_transition"/>
</fragment>
  • 或者给整个导航图设置全局过渡:
<navigation
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph"
    app:startDestination="@id/homeFragment"
    app:enterTransition="@transition/explode_transition"
    app:exitTransition="@transition/explode_transition">
    <!-- 目的地配置 -->
</navigation>

2. 代码动态绑定

  • 在调用navigate()时通过NavOptions关联过渡:
val navOptions = NavOptions.Builder()
    .setEnterAnim(R.transition.explode_transition)
    .setExitAnim(R.transition.explode_transition)
    .build()
findNavController().navigate(R.id.action_home_to_detail, null, navOptions)
  • 也可以在目标Fragment内部直接设置过渡,切换时自动生效:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    enterTransition = Explode().apply { duration = 500 }
    exitTransition = Explode().apply { duration = 500 }
}

内容的提问来源于stack exchange,提问作者KurdTt-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:27:46