Activity进入和退出时动画的一致性

今天把开发好的产品拿给设计师看,设计师说打开设置菜单的动画在不同的手机上表现不同,有的手机上是从中间展开的,有的手机是从右边出来的,有的手机上压根没有动画,说让最好统一成从右边出来的,那么既然启动设置activity的时候从右边出来,退出设置的时候应该也是从右边消失,这样才能保证动画的一致性。

都知道activity切换动画是通过overridePendingTransition(int enterAnim, int exitAnim)来实现的,重写这个方法然后传递进入和退出动画就可以实现activity启动时候的切换动画了。那假如我们现在是要在activity1启动activity2的时候加入切换动画,要求activity2从右边出现,那么就是在activity1调用startactivity之后和activity2调用finish之后分别调用overridePendingTransition然后传入两个进出动画就好了,如下图所示:


enterAnim和exitAnim分别如下所示

  • slide_in.xml

  • slide_out.xml

也就是要在activity1启动activity2的地方这样写:

1
2
startActivity(intent)
overridePendingTransition(R.anim.slide_in, R.anim.slide_out);

activity2的finish方法改成这样:

1
2
finish();
overridePendingTransition(R.anim.slide_in, R.anim.slide_out);

这样似乎就ok了,测试发现activity2确实是从右边出来

但是,你会发现你在activity2返回activity1的时候,按照道理activity2应该回到右边,然后activity1从左边出来,但是事实是从activity2返回的时候,activity1也是从右边出来

为什么会这样的,搞清楚这个问题之前我们需要先搞清overridePendingTransition(enterAnim,exitAnim)方法的两个参数的对应关系

当我们使用activity1启动activity2的时候如下图所示:

此时目标activity是activity2,对应于activity2的动画是enterAnim也就是上面的slide_in,对应于activity1的动画是exitAnim也就是上面的slide_out,所以顺利成章地activity2是从右边出来(X轴从100%p到0%p),activity1是从左边消失(X轴从0%p到100%p)

当我们从activity2调用finish返回activity1的时候,见下图:

此时activity2是当前activity,activity1是目标activity,所以activity2使用的是exitAnim,activity1使用的是enterAnim,activity2从左边退出,activity1又从右边出现

那么上面的进入和退出activity2的动画就都一样了,都是从右边出现

简单来说就是目标activity(将要出现的activity)用的是进入动画也就是overridePendingTransition的第一个参数,当前activity(将要消失的activity)用的是退出动画,也就是overridePendingTransition的第二个参数

那么为了解决退出activity2的时候希望activity1从左边出来,只需要再加一组动画参数区别于启动activity2的那组动画参数就可以了

下面是我实现返回的时候activity1从左边出来加的一组动画代码,很好理解:

1
2
finish();
overridePendingTransition(R.anim.slide_in_back, R.anim.slide_out_back);
  • slide_in_back.xml

  • slide_out_back.xml