图形与动画
图形与动画 · 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 + ChangeBounds | animateContentSize() |
| 显隐动画 | Fade / Slide | AnimatedVisibility |
| 场景切换 | TransitionManager.go | Crossfade / AnimatedContent |
Compose 场景优先用 Compose 动画 API——声明式、无场景管理成本。
常见陷阱
- 忘调用 beginDelayedTransition:布局变化没动画。
- Scene 复用冲突:同一 View 在多个 Scene 之间切换时状态丢失。
- Transition 加在错误的容器:要放在包含变化子 View 的容器上。
- 监听器只加不加:
addListener但没在结束时清理。
要点
TransitionManager.beginDelayedTransition(sceneRoot)让随后的布局修改自动动画化(:431)。- 常用 Transition:
Fade(淡入淡出)、Slide、ChangeBounds(位置/尺寸)、AutoTransition(组合)。 - 跨布局结构变化用 Scene +
TransitionManager.go。 - 该库针对 View 体系;Compose 中请使用
animate*AsState或AnimatedVisibility。