安卓全局活动切换动画,windowAnimationStyle与overridePendingTransition两种实现

两种方式:

他们的共性是无论哪种写法,都要先将动画文件写好,即现在res目录下创建anim文件夹,并在该文件夹下创建animation文件。
安卓全局活动切换动画,windowAnimationStyle与overridePendingTransition两种实现_第1张图片
我们看两个文件中的内容:
这是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>

安卓全局活动切换动画,windowAnimationStyle与overridePendingTransition两种实现_第2张图片
总共有这几种变换,顾名思义就知道这几个属性分别是干什么的了,然后他们一般都包含一个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里面执行才生效。

你可能感兴趣的:(Android实战,android,全局动画效果)