之前在github上寻找Activity转场时偶然看到一个令人惊艳的项目:
Material-Animations(另有网友贡献了中文版本)
其中的效果有很多,我们着重看看其中比较常见的效果。
如:同一个Layout内视图变化时的动画
之所以说惊艳,主要是因为像这么复杂的动画效果,居然通篇不见Animation,只用了几行代码就搞定,颇有一种四两拨千斤的感觉。
其实现方式就是今天的主角:Transition 。本文重说概念,先简单介绍Transition的使用,再尝试从源码角度去分析,一探究竟。
Android Master Transition 源代码目录- master分支
Android Master Transition 源代码目录- 4.3KitKat分支
demo的效果如果自己使用Animation实现的话,代码会极其冗杂,需要计算四个View在切换时的最终坐标,推算出其动画过程。(更不要说图中的动画还有旋转等。。)
而这些在Transition的面前,需要我们做的事情就少得多了:
ViewGroup sceneRoot = (ViewGroup) findViewById(R.id.scene_root);
(...)
scene1 = Scene.getSceneForLayout(sceneRoot, R.layout.activity_animations_scene1, this);
scene2 = Scene.getSceneForLayout(sceneRoot, R.layout.activity_animations_scene2, this);
scene3 = Scene.getSceneForLayout(sceneRoot, R.layout.activity_animations_scene3, this);
scene4 = Scene.getSceneForLayout(sceneRoot, R.layout.activity_animations_scene4, this);
(...)
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
TransitionManager.go(scene1, new ChangeBounds());/*ChangeBound即为Transition一个子类*/
break;
case R.id.button2:
TransitionManager.go(scene2, TransitionInflater.from(this).inflateTransition(R.transition.slide_and_changebounds));
break;
case R.id.button3:
TransitionManager.go(scene3, TransitionInflater.from(this).inflateTransition(R.transition.slide_and_changebounds_sequential));
break;
case R.id.button4:
TransitionManager.go(scene4, Transiti