在泡网上看到一篇2016年制的学习的五个开源项目
第一篇是一个讲究动画的项目,其中transition这个属性之前一直没有学习到,啊,感觉好多东西都落伍了,老师教的东西还停留在上个世纪。于是自己来慢慢发掘用法吧,捣鼓activity之间的切换都让我用尽洪荒之力了。
个人的基本概念理解
在两个activity之间切换的时候,transition把这个过程分成了四种类型
假定有a和b两个activity
从a调用b 这里会产生a的退出(exit)
b的进入 (enter)
从b返回a 这里会产生b的返回(return)
a的再进入(reenter)
基本动画就是在这四个阶段做处理(但是我一直不知道为什么a的退出没有效果)
动画设置
首先当然是建立两个activity啦
各自有一个button来触发事件
在activity a里面
setContentView之前调用Window下的方法设置活动a的退出和再进入
同理在activity b里面
setContentView之前调用Window下的方法设置活动b的进入和返回
这是activity a的相关
super.onCreate(savedInstanceState);
getWindow().setExitTransition(new Fade());
getWindow().setReenterTransition(new Slide().setDuration(1000));
setContentView(R.layout.activity_main);
可以看到,a里面设置的行为是Exit和Reenter的属性,设置exit的动画为fade,设置 Reenter的属性为slide并设置动画时长为2000ms,这和Animation的属性设置一个意思一个意思。
这是activity b的相关
super.onCreate(savedInstanceState);
getWindow().setEnterTransition(new Explode().setDuration(2000));
getWindow().setReturnTransition(new Fade().setDuration(1));
setContentView(R.layout.activity_main2);
这个就很容易理解了,分别设置了enter和return的动画为explode和fade,并分别设置了相应的动画时间。
不同的跳转方法
接下来就是从活动a跳转到活动b,再从b返回到活动a来看效果
这里因为设置了动画,所以代码和普通的intent跳转不太一样,也不能直接finish
在活动a里面,startActivity方法需要用一个重载
Intent intent=new Intent(MainActivity.this,Main2Activity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
活动b里面则需要执行另外一个方法
finishAfterTransition();
在a和b之间跳转就能够依次看到a的exit和b的enter,b的return和a的reenter,两两对应,一起执行。但是实际测试中发现,a的exit我没有效果,不知道怎么回事。
代码片段(指定布局里面的view的动画)
当然这个transition也是可以用在activity托管的viewgroup的view的
TransitionManager.beginDelayedTransition(rootView,new Fade());
toggleVisibility(bt1,bt2,bt3,bt4);
private static void toggleVisibility(View... views){
for (View v:views) {
boolean isVisible = v.getVisibility()==View.VISIBLE;
v.setVisibility(isVisible?View.INVISIBLE:View.VISIBLE);
}
}
rootView是一个viewgroup,比如你的LinearLayout啊之类的,bt1…bt4则是viewGroup上面的控件,这里做的事情是,判断view是否处于可见状态,如果可见,则点击之后变为不可见,如果不可见,点击之后变为可见,而这个可见和不可见切换的时候,则触发设置好的transition属性(这里是fade)
这个fade仅仅适用于设置的viewGroup,因为这里的view都是在这个viewGroup上,所以才能适用。