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-
相关产品推荐
相关产品推荐

