Transition:View 场景切换动画 · AndroidX 源码指南
AAndroidX 源码指南
图形与动画
图形与动画 · androidx.graphics.shapes

Transition:View 场景切换动画Shapes 1.2.0-alpha01

beginDelayedTransition 与 Transition 类的选择:AutoTransition、Fade、ChangeBounds。

最后更新 2026-08-01

复制即用

布局变化自动过渡(最简单):

import android.view.ViewGroup
import androidx.transition.AutoTransition
import androidx.transition.TransitionManager

// 任意位置:改变子 View 的可见性或位置前先调用
TransitionManager.beginDelayedTransition(parent)

// 然后修改布局
child.visibility = View.VISIBLE

自定义过渡:

import android.view.ViewGroup
import androidx.transition.Fade
import androidx.transition.TransitionManager

TransitionManager.beginDelayedTransition(
    parent,
    AutoTransition().apply {
        addListener(object : Transition.TransitionListener {
            override fun onTransitionStart(transition: Transition) {}
            override fun onTransitionEnd(transition: Transition) {}
            override fun onTransitionCancel(transition: Transition) {}
            override fun onTransitionPause(transition: Transition) {}
            override fun onTransitionResume(transition: Transition) {}
        })
    },
)
child.visibility = ViewGroup.VISIBLE

常用 Transition

Transition效果
Fade淡入淡出(IN/OUT)
Slide滑动进入/退出
ChangeBounds位置/尺寸变化动画
ChangeTransform旋转/缩放
ChangeColor背景色变化
AutoTransition组合(Fade + ChangeBounds)
// 组合多个过渡
TransitionManager.beginDelayedTransition(
    parent,
    TransitionSet().apply {
        addTransition(Fade())
        addTransition(ChangeBounds())
        ordering = TransitionSet.ORDERING_TOGETHER
    },
)

场景(Scene)切换

beginDelayedTransition 适合同一布局内的属性变化;跨布局结构变化用 Scene:

val startScene = Scene.getSceneForLayout(
    container, R.layout.scene_start, context
)
val endScene = Scene.getSceneForLayout(
    container, R.layout.scene_end, context
)

TransitionManager.go(endScene, AutoTransition())

与 Compose 对比

场景View 体系Compose
布局变化动画TransitionManager + ChangeBoundsanimateContentSize()
显隐动画Fade / SlideAnimatedVisibility
场景切换TransitionManager.goCrossfade / AnimatedContent

Compose 场景优先用 Compose 动画 API——声明式、无场景管理成本。

常见陷阱

  • 忘调用 beginDelayedTransition:布局变化没动画。
  • Scene 复用冲突:同一 View 在多个 Scene 之间切换时状态丢失。
  • Transition 加在错误的容器:要放在包含变化子 View 的容器上。
  • 监听器只加不加addListener 但没在结束时清理。

要点

  • TransitionManager.beginDelayedTransition(sceneRoot) 让随后的布局修改自动动画化(:431)。
  • 常用 Transition:Fade(淡入淡出)、SlideChangeBounds(位置/尺寸)、AutoTransition(组合)。
  • 跨布局结构变化用 Scene + TransitionManager.go
  • 该库针对 View 体系;Compose 中请使用 animate*AsStateAnimatedVisibility

相关页面