安卓全局活动切换动画,windowAnimationStyle与overridePendingTransition两种实现
两种方式:
他们的共性是无论哪种写法,都要先将动画文件写好,即现在res目录下创建anim文件夹,并在该文件夹下创建animation文件。
我们看两个文件中的内容:
这是open_enter的内容,即打开活动,进入新活动的动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="0.1"
android:fromYScale="0.1"
android:toXScale="1.0"
android:toYScale="1.0"
android:duration="@integer/animation_duration"
/>
</set>
这是open_enter的内容,即打开活动,退出的活动动画:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="0.1"
android:toYScale="0.1"
android:duration="@integer/animation_duration"/>
</set>
总共有这几种变换,顾名思义就知道这几个属性分别是干什么的了,然后他们一般都包含一个fromX/Y和toX/Y分别表示初末变换状态。
1.完全用xml实现,即windowAnimationStyle:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimaryDark">@color/myColor</item>
<item name="android:navigationBarColor">@color/myColor</item>
</style>
<style name="animAppTheme" parent="AppTheme">
<item name="android:windowAnimationStyle">@style/animationActivty</item>
</style>
<style name="animationActivty" parent="@android:style/Animation.Activity">
<!-- 打开activity时,新进入的activity执行的动画-->
<item name="android:activityOpenEnterAnimation">@anim/open_enter</item>
<!-- 打开activity时,原来的activity执行的动画-->
<item name="android:activityOpenExitAnimation">@anim/open_exit</item>
<!-- 退出activity时,退出的activity执行的动画-->
<item name="android:activityCloseExitAnimation">@anim/close_exit</item>
<!-- 退出activity时,重新显示的activity执行的动画-->
<item name="android:activityCloseEnterAnimation">@anim/close_enter</item>
</style>
</resources>
可以看到,我们新建了animAppTheme继承自AppTheme。并且设置它的windowAnimationStyle属性为下方的一个自定义style,定义了切换时的四种动态效果,即我们写的anim下的动画文件。然后我们只需要在AndriodManifest文件下将android:theme="@style/AppTheme"改成android:theme="@style/animAppTheme"就可以了。
但是,由于兼容性问题,部分手机会不产生动画效果,比如我的华为nova3e
2.overridePendingTransition实现:
这个时候我们引入第二种方法,也是我比较喜欢的方法,我这里介绍一种我喜欢的写法。首先,我创建一个BaseActivity继承Activity。然后,之后创建的MainActiity均继承自BaseActivity。这样,我就可以将共性操作写在BaseActivity中。最后,写如如下代码:
package com.example.myapplication1.activities;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.Nullable;
import com.example.myapplication1.R;
public class BaseActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.open_enter,R.anim.open_exit);
Log.w("activity","has been created");
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.close_enter,R.anim.close_exit);
Log.w("activity","has been finish");
}
@Override
protected void onDestroy() {
super.onDestroy();
//这里面定义的动画并未生效
//overridePendingTransition(R.anim.close_enter,R.anim.close_exit);
Log.w("activity","has been Destroyed");
}
}
overridePendingTransition接收两个参数,一个是进入时的动画,一个是退出时的动画。那么我在活动创建的时候设置一个动画,活动完成时设置一个动画,就可以实现切换时的活动动画。
需要注意:我做过测试,finish方法比onDestroy方法先执行,我们的overridePendingTransition需要在finish里面执行才生效。