效果图
基本实现
在 5.0 之前,Activity 的跳转动画都是通过自身的 overridePendingTransition 来实现的:
public void overridePendingTransition(int enterAnim, int exitAnim) {
try {
ActivityManagerNative.getDefault().overridePendingTransition(
mToken, getPackageName(), enterAnim, exitAnim);
} catch (RemoteException e) {
}
}
int enterAnim, int exitAnim 都是通过 animation 资源来定义的。
需要注意的是对于 Activity 跳转动画的统一管理,以及退出动画的特殊处理。
伪代码
A —> B 的情况下
R.anim.activity_pop_in —> B 的进入动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:duration="300"
android:fromXScale=".5"
android:fromYScale=".5"
android:pivotX="50%p"
android:pivotY="50%p"
android:toXScale="1.0"
android:toYScale="1.0" />
<alpha
android:duration="300"
android:fromAlpha=".4"
android:toAlpha="1" />
</set>
R.animation.pop_out —> A 的退出动画
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fromAlpha="1.0"
android:toAlpha="1.0" />
R.anim.activity_pop_out —> B 的退出动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="300"
android:fromXScale="1"
android:fromYScale="1"
android:pivotX="50%p"
android:pivotY="50%p"
android:toXScale=".8"
android:toYScale="0.8" />
<alpha
android:duration="300"
android:fromAlpha="1"
android:toAlpha="0" />
</set>
需要注意的是三个动画的 duration 要一致。
BaseActivity 对 Actiivty 跳转动画的统一管理
public class BaseActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
if (isOverride()) {
overridePendingTransition(R.anim.activity_pop_in, R.anim.pop_out);
}
super.onCreate(savedInstanceState);
}
@Override
public void finish() {
super.finish();
if (isOverride()) {
overridePendingTransition(0, R.anim.activity_pop_out);
}
}
protected boolean isOverride() {
return true;
}
}
总结
步骤很简单,主要是对 animation 参数的调整。