前面一篇文章讲解了Android动画Animator,但是不知道你有没有发现,前面讲解的所有的动画都是针对某一Object来进行的,虽然我们可以对整个Layout添加动画效果,但这是先把整个layout看成一个整体,再对这个整体添加动画效果。当我们想同时对多个Object添加动画效果时又该怎么做呢?
先来看一下效果
为什么要使用Transitions:
- ViewGroup级别的动画效果
- 只需确定动画的开始和结束的状态就可以完成整个动画
- 有可以直接使用的常用动画
- 支持从资源文件(Resource)载入动画
- 生命周期中有回调函数,可以更好的控制动画效果
Scenes
一个Scene保存了一个ViewGroup中所有元素的状。同时他还拥有一个关于这个ViewGroup的父ViewGroup的引用,这个父ViewGroup称为scene root。
Transitions
关于动画的信息都存在一个Transition 对象中。通过 TransitionManager 使用Transition中动画。Transitions 框架可以在两个不同的Scene或者同一Scene的不同元素之间使用动画。
限制
- API Level 19 (Android 4.4.2)
- 使用在SurfaceView上可能会出错
SurfaceView 是在一个非UI线程上更新的,所以可能会更其他元素的动画不同步。 - 使用在TextureView上可能会出错
- 使用在继承自AdapterView的View,比如ListView上可能会出错。
- 当你对TextView 使用动画的时候,里面的文字在动画没有结束之前可能会跑到其他地方。
创建Scene
Scene mAScene;
Scene mAnotherScene;
// Create the scene root for the scenes in this app
mSceneRoot = (ViewGroup) findViewById(R.id.scene_root);
// Create the scenes
mAScene = Scene.getSceneForLayout(mSceneRoot, R.layout.a_scene, this);
mAnotherScene =
Scene.getSceneForLayout(mSceneRoot, R.layout.another_scene, this);
创建Scene Actions
Transitions 框架允许自定义进入和退出Scene时的Action。把自定义的Action定义成Runnable对象并把他们作为参数传到Scene.setExitAction() 或者 Scene.setEnterAction() 中。系统会在进入和退出的时候调用这两个方法。
创建Transition
从resource文件中创建Transition
步骤如下:
1 . 在项目中添加res/transition/目录
2 . 在目录中新建XML文件
res/transition/fade_transition.xml
<fade xmlns:android="http://schemas.android.com/apk/res/android" />
3 . 在Activity中加载
Transition mFadeTransition =
TransitionInflater.from(this).
inflateTransition(R.transition.fade_transition);
在代码中动态添加Transition
Transition