自定义activity切换动画

activity切换效果即当startActivity()或finish()时显示一个动画效果,使切换显得不那么生硬.这里介绍的是常用切换效果,适用于Android2.0+(我不信还有2.0以下的老古董在用).

此外,还有更酷的Material Design定制动画可翻墙参考
https://developer.android.com/training/material/animations.html
以后也会讲解

切换动画使用overridePendingTransition()方法,传入的两个值分别是
int enterAnim 新Activity进入动画
int exitAnim 当前Activity退出动画

放置位置:

1
2
3
4
startActivity(new Intent(this, BtnActivity.class));
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

1
2
3
4
5
6
7
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.normal_out, R.anim.finish_out);
}

系统提供的动画效果有

淡入浅出

1
2
3
4
startActivity(new Intent(this, BtnActivity.class));
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

由左向右滑入的效果

1
2
3
4
startActivity(new Intent(this, BtnActivity.class));
overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);

若要实现更多的动画效果就需要自定义了,以下

activity在手机屏幕上显示时,activity位置如图所示,activity左下角与坐标原点x=0,y=0重合.可以以此定义出我们想要的动画效果.

在res/anim下(Android Studio在res右键Android resource file,选择Resource type为Animation)新建slide_in.xml和slide_out.xml

新activity进入效果
slide_in.xml

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="100%p"
android:toXDelta="0" />
</set>

当前activity退出效果
slide_out.xml

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="0"
android:toXDelta="-100%p" />
</set>

新进入时从右往左即100%位置移动到0
当前离开从原点0移动到-100%位置
p表示参照父层View
fromXDelta: x轴开始位置,可以为%也可以是具体像素
formYDelta: y轴开始位置,可以为%也可以是具体像素
toXDelta: x轴结束位置,可以为%也可以是具体像素
toXDelta: y轴结束位置,可以为%也可以是具体像素

android:duration定义了动画持续时间
android:startOffset延迟一定时间后运行动画

android:interpolator加速器,有以下系统属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!--越来越快-->
@android:anim/accelerate_interpolator
<!--越来越慢-->
@android:anim/decelerate_interpolator
<!--先快后慢-->
@android:anim/accelerate_decelerate_interpolator
<!--先后退一小步然后向前加速-->
@android:anim/anticipate_interpolator
<!--快速到达终点超出一小步然后回到终点-->
@android:anim/overshoot_interpolator
<!--到达终点超出一小步然后回到终点-->
@android:anim/anticipate_overshoot_interpolator
<!--到达终点产生弹球效果,弹几下回到终点-->
@android:anim/bounce_interpolator
<!--均匀速度-->
@android:anim/linear_interpolator

自定义activity动画效果支持四种动画类型

  • tweened animation(渐变动画)
    alpha 渐变透明度动画效果
    scale 渐变尺寸伸缩动画效果
  • frame by frame(画面转换动画)
    translate 画面转换位置移动动画效果
    rotate 画面转移旋转动画效果

Demo: https://github.com/liompei/CutActivityDemo