文章目录
前言
Android 5.0 以来, 我们可以方便的使用系统内置的转场动画. 平移, 淡入, 爆炸, 共享元素等. 当然大神也可以自定义复杂动画. 经过排列组合, 可以做出炫丽的转场效果
提示:以下是本篇文章正文内容,下面案例可供参考
一、Activity 转场:
无图无真相, 上图

1.三种常用转场
Explode
爆炸出入, 控件由屏幕中心 向四周扩散或汇聚.
// TransOneActivity 用双参的 startActivity()
startActivity(
Intent(this, TransTwoActivity::class.java),
ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle()
)
// TransTwoActivity 的 onCreate() 函数中:
window.enterTransition = Explode().setDuration(800)
// 如果退场动画跟进场动画一样, returnTransition 可以不设置; 这里可以注释掉
window.returnTransition = Explode().setDuration(800)
// 布局文件? 要什么布局, 随便写几个 View 就完事了;
重点:
系统会自动遍历屏幕上所有的 View, 并做对应动画处理;enterTransition: 进场动画returnTransition: 退场动画. 如果跟进场动画一样, 则可以不设置 (进场扩散, 则退场汇聚)
Slide
滑动平移, 默认是 向上滑入, 向下滑出
// TransOneActivity, 启动方法没变;
startActivity(
Intent(this, TransTwoActivity::class.java),
ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle()
)
// TransTwoActivity 的 onCreate() 函数中:
window.enterTransition = Slide(Gravity.START) // 左滑入
window.returnTransition = Slide(Gravity.END) // 右滑出
// 如果手动关闭页面, 则用 finishAfterTransition 替代 finish();
ActivityCompat.finishAfterTransition(this)
Slide 构造函数, 可以传一个 Gravity 常量; 可以从对应方向入场. 控件分步入场(带时间差);
如果不传参数, 则页面整体 向上滑入, 向下滑出;
- Gravity.LEFT, Gravity.START: 左侧出入;
- Gravity.TOP: 上方出入;
- Gravity.RIGHT, Gravity.END: 右侧出入;
- Gravity.BOTTOM: 底部出入;
Fade
整页面, 淡入淡出
// TransTwoActivity
window.enterTransition = Fade()
2.前页动画:
上面几个例子, 都是 被启动页 动画. 前页也可以有动画
假设 Activity A 转场启动 Activity B:
| 函数 | 意义 | 触发时机 |
|---|---|---|
| setExitTransition() | A的 前进关闭(离场)动画 | 启动B时执行, 早于B的入场动画 |
| setEnterTransition( ) | B的 启动入场动画 | B被启动时 |
| setReturnTransition() | B的 后退离场动画 | B关闭时 |
| setReenterTransition() | A的 返场动画 | B关闭时, 回到A后执行 |
代码示例:
// TransOneActivity
window.reenterTransition = Slide(Gravity.START)
window.exitTransition = Slide(Gravity.END)
window.allowEnterTransitionOverlap = false // 允许进入时过度重叠
window.allowReturnTransitionOverlap = false // 允许返回时过度重叠
// TransTwoActivity 的 onCreate() 函数中:
window.enterTransition = Explode()
window.returnTransition = Explode()
这里就不贴动图了, 有兴趣的小伙伴可以自己试一下; 我们可以看到, 前页动画执行完毕后, 后页的动画才开始执行; 当下面两个属性设为 false 时, 才会这样;
| 参数 | 意义 |
|---|---|
| allowEnterTransitionOverlap | 默认true; 前后页面的动画, 几乎同时执行 |
| allowReturnTransitionOverlap | 默认true; 返场时动画是否同时执行 |
3.单元素共享过度
说是元素共享. 实际上根本就不共享. 只是在元素前后页的位置上做了个渐变动画!
1.第一步: 设置 transitionName
xml中写死:
android:transitionName="trans_view"
代码指定:
ViewCompat.setTransitionName(view, "trans_view")
注意: 前后页的共享控件都要设置该属性;
2.第二步: 启动Activity 指定共享元素
startActivity(
Intent(this, TransTwoActivity::class.java),
ActivityOptionsCompat.makeSceneTransitionAnimation(
this, transView, "trans_view").toBundle()
)
使用三参的 makeSceneTransitionAnimation() 函数, 传入 View 和 transitionName;
3.第三步: …
确保: transitionName 设置好了退出页面时, 使用: ActivityCompat.finishAfterTransition(this); back键 可以不管;
有时候, 新的页面可能 View还没准备好. 这时候我们想让动画稍晚一点执行:
- ActivityCompat.postponeEnterTransition(this): 暂停转场动画
- ActivityCompat.startPostponedEnterTransition(this): 开始转场动画
// 例如
ActivityCompat.postponeEnterTransition(this)
// 准备 view 的代码; 例如 ViewPager
Android转场艺术:Activity动画与控件无缝过渡指南

本文详细介绍了Android 5.0后如何使用系统内置动画实现Activity转场,包括Explode、Slide和Fade,以及前页动画的设置。还探讨了单元素和多元素共享过渡,以及RecyclerView和ViewPager的图片转场技巧。
最低0.47元/天 解锁文章
7086

被折叠的 条评论
为什么被折叠?



