同一个Activity之间,布局切换是可以有动画效果的,下面是仿照API Demo中的一个例子,如下图:
在同一个Activity中,通过选中不同的Scene,切换不同的布局。
在两个Layout之间进行动画的基本步骤如下:
步骤是不是很简单?整个流程图如下:
Scene可以理解为对布局的一个快照,包含了View的层次以及各种属性相关的信息。Transition框架可以自动在起始和结束Scene之间进行动画。
调用Scene.getSceneForLayout()方法创建一个Scene,其中第一个参数是一个ViewGroup,第二个参数是布局id。
Scene.getSceneForLayout(scene_root, R.layout.layout_scene_1, this)
xml布局中定义的View层次也是可以通过代码定义的,只不过比较麻烦,这里就不介绍了。
可以使用android已经提供的一些Transition,比如AutoTransition、Fade,或者定义自己的Transition。然后调用TransitionManager.go()方法即可。
类 | 标签 | 属性 | 效果 |
---|---|---|---|
AutoTransition | 淡出、移动和改变尺寸、淡入 | ||
Fade | android:fadingMode="[fadein ,fadeout,fadeinout]" | 控制淡出淡入 | |
ChangeBounds | 移动和改变尺寸 |
以上就是内置的类型以及在xml中对应的标签。Transition和属性动画、View Animation一样,都是可以在xml中定义的,举个例子,
<fade xmlns:android="http://schemas.android.com/apk/res/android" />
然后就可以通过代码获取到Transition实例,代码是
var mFadeTransition: Transition =
TransitionInflater.from(this)
.inflateTransition(R.transition.fade_transition)
而如果使用代码定义Transition,可以这么做:
var mFadeTransition: Transition = Fade()
调用如下代码即可:
TransitionManager.go(mEndingScene, mFadeTransition)
是不是很easy?这个demo的代码如下所示:
secneRg.setOnCheckedChangeListener { group, checkedId ->
var endScene: Scene? = null
when (checkedId) {
R.id.scene1Rb -> {
endScene = Scene.getSceneForLayout(scene_root, R.layout.layout_scene_1, this)
}
R.id.scene2Rb -> {
endScene = Scene.getSceneForLayout(scene_root, R.layout.layout_scene_2, this)
}
R.id.scene3Rb -> {
endScene = Scene.getSceneForLayout(scene_root, R.layout.layout_scene_3, this)
}
R.id.scene4Rb -> {
endScene = Scene.getSceneForLayout(scene_root, R.layout.layout_scene_4, this)
}
}
TransitionManager.go(endScene, TransitionSet().apply {
addTransition(Fade())
addTransition(ChangeBounds())
})
}
默认情况下,整个View层次都是作为动画的对象,如果不想某些View有动画效果,可以在设置动画之前调用removeTarget()来进行清除。
Transition框架有一些使用限制,
关于代码,请参考Github地址
本文分享自 每天学点Android知识 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!