欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-24 20:38:34
...

两种方式:

他们的共性是无论哪种写法,都要先将动画文件写好,即现在res目录下创建anim文件夹,并在该文件夹下创建animation文件。
安卓全局活动切换动画,windowAnimationStyle与overridePendingTransition两种实现
我们看两个文件中的内容:
这是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两种实现
总共有这几种变换,顾名思义就知道这几个属性分别是干什么的了,然后他们一般都包含一个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里面执行才生效。