Transition
之前有了解一丁点转换动画,比如说不同activity之间转换的动画,或者公共部件之间的转换动画,笔记做的很简略。
这里又(稍微)仔细的了解了一下官网的关于转换动画的介绍。
使用transition framwork
Material-Animations,就是上面那条的英文版,还有例子
Transition-android developer
定义定制动画-android developer
摘录于第一个参考里面的:
Android Transition Framework可以实现三种效果:
1,不同Activity之间切换时,Activityc的内容(contentView)转场动画
2,不同Activity之间切换时,如果使用了Shared Element动画,也可以使用Transition FrameWork来实现不 同的过渡动画效果
3,同一个Activity内View变化的过渡动画(Scene)
其实,看上面的参考就很清楚了,但是因为有些比较重要的容易忽略的东西,必须在这里记下来。
首先,如果要使用activity的切换动画,需要使用startActivity(intent,bundle)
其中第二个参数一般为ActivityOptionsCompat.makeSceneTransitionAnimation().toBundle()
然后,并不是所有场合都适用转换动画。
(简单翻译自官网的说明)
1,surfaceView 不能正常应用转换动画
2,部分动画在textureView上工作不正常
3,AdapterView的子类,比如listView,与transition不兼容
4,有文字的view比如textView会在调整大小的时候文字显示错误。
创建简单的activity切换动画
用java code创建简单的切换动画
//设置退出的时候显示的动画
getWindow().setExitTransition(new Slide(Gravity.LEFT).setDuration(500));
//设置进入的时候显示的动画
getWindow().setEnterTransition(new Fade(Fade.IN).setDuration(500));
在theme里面有一个比较重要的设置
<!-- 允许使用transitions -->
<item name="android:windowContentTransitions">true</item>
<!--是否覆盖执行,其实可以理解成是否同步执行还是顺序执行-->
<item name="android:windowAllowEnterTransitionOverlap">false</item>
<item name="android:windowAllowReturnTransitionOverlap">false</item>
如果没有设置,默认是同步执行,也就是说退出当前activity,进入新activity是同步执行
实际效果并不好。
其中,上面设置的参数是内建的fade动画,具体可以查询transition的api参考。
然后使用startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(thisActivity).toBundle());
来启用动画。如果用普通的startActivity(intent)是没有效果的
同时,我们希望在打开的activity里面按返回键以后退出到上一步的activity的时候也显示动画,也需要设置如下:
//按返回键以后,退出的activity显示的动画
getWindow().setReturnTransition(new Fade(Fade.IN).setDuration(500));
//按返回键以后,重新进入的上一步的activity显示的动画
getWindow().setReenterTransition(new Fade(Fade.IN).setDuration(500));
ViewAnimationUtils
发现一个实用的动画工具,ViewAnimationUtils
里面只有一个静态的方法
static Animator createCircularReveal (View view,
int centerX,
int centerY,
float startRadius,
float endRadius)
这个方法创建了一个animator,从参数就可以看出,就是创建一个圆环放大的动画,需要设置中心点,起始半径,最终半径。
配合各种动画效果,可以实现很平滑的效果。
比如在点击某按钮以后,需要显示新内容的地方来这么一个揭露动画,效果棒极了。
需要注意的是,这个揭露动画是覆盖目标view的
也就是说,相当于一个覆盖在目标view上的一个幕布,然后揭露隐藏在幕布下面的内容。
所以可以在anim.start()之前就设置好要显示的内容,然后动画再开始执行动画。
和其他的动画一样,可以设置一个listener。
布局变动动画
Transition-google developer
实用transition
正如官网介绍的一样,在应用的布局发生变动的时候,可以展现动画来显示变动。
具体的在官网和之前的参考里面都有。
简单说明一下
1,可以对一个需要变动的布局设置成scene,然后用transitionManager来启动不同scene之间变化的动画。
2,如果使用TransitionManager.beginDelayedTransition(mView, mFade);
那么可以不设置scene,在接下来的改变布局参数的时候,就自动用动画来展示。