关于Activity动画那些事
关于activity的动画,相信大家再熟悉不过了,我们开发中经常用到,网上资料也很多,但是也有一些小细节需要我们注意,今天这篇文章我总结了几种常用的动画实现方式,通过这篇文章,你可以了解到:
- 几种常见的activity动画实现方式
- activity动画中需要注意的细节
- 这几种方式的优缺点比较,我们如何取舍
- 对这几种方式进行简易封装,提高我们的开发效率
几种常见的实现方式:
1. activity.overridePendingTransition()
这种方式相信大家一定非常熟悉了,简单回忆一下,我们只需要在start另一个activity启动的时候调用就行,这个方法接收两个参数,一个是我们新启动的activity进入时的动画,另一个是当前activity退出时的动画(很多时候我们是不需要这个动画的,只需要另一个activity进入的效果),首先我们在我们res文件目录下新建一个anim文件夹,随便建一个动画效果,我这里以从右边划入为例,首先我建一个slide_in_right.xml的文件:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="100.0%p"
android:toXDelta="0.0" />
</set>
我们最熟悉的平移动画,用法:
private void start() {
startActivity(new Intent(MainActivity.this, TestActivity.class));
overridePendingTransition(R.anim.slide_in_right, 0);
}
效果如图:
这样写似乎是我们要的效果,然而,在有些手机上却出现了很奇怪的黑色平移块,此时我们需要保持前一个页面不同,所以我们假写一个动画 animo_no:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="300"
android:fromAlpha="1"
android:toAlpha="1" />
</set>
这个动画是没有任何效果的,我们拿来抵消动画效果,现在跑起来就像是另一个页面执行动画,前面一个页面不动的效果了:
private void start() {
startActivity(new Intent(MainActivity.this, TestActivityWithTheme.class));
overridePendingTransition(R.anim.slide_in_right, R.anim.animo_no);
}
结束动画:
进入之后,为了保证动画的一致连贯性,所以我们需要在已经启动的activity中也覆盖同样的方法来执行结束动画,我们再建一个slide_out_right.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="0"
android:toXDelta="100.0%p" />
</set>
使用:
我们重写finish方法,在finish的时候加上我们的动画效果:
@Override
public void finish() {
super.finish();
overridePendingTransition(