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

关于android:windowAnimationStyle

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

Android动画全篇系列(十一)------Activity转场动画

Android Activity跳转动画 - overridePendingTransition用法及原理分析

一、overridePendingTransition 介绍 :

java 复制代码
/**
/**
*在{@link#startActivity(Intent)}的一种风格之后立即调用
*或{@link#finish}来指定一个显式过渡动画
*接下来执行。
*<p>截至{@linkandroid.os.Build.VERSION_CODES#JELLY_BEAN}的替代方案
*将其用于启动活动就是提供所需的动画
*通过{@link ActivityOptions}捆绑包将信息发送到
*{@link#startActivity(Intent,Bundle)}或相关函数。这允许
*您可以指定自定义动画,即使在从开始活动时也是如此
*在当前顶级活动的上下文之外。
*@param enterAnim : 要用于的动画资源的资源ID
*传入活动。使用0表示没有动画。
*@param exitAnim : 要用于的动画资源的资源ID
*传出的活动。使用0表示没有动画。
 */
public void overridePendingTransition(int enterAnim, int exitAnim) {
    try {
        ActivityTaskManager.getService().overridePendingTransition(
                mToken, getPackageName(), enterAnim, exitAnim);
    } catch (RemoteException e) {
    }
}

上面的注释中可以看到,

  • 这个方法需要在startActivity()或者finish()方法之后立即被调用。

启动后:

java 复制代码
startActivity(new Intent(A.this, B.class));
overridePendingTransition(inAnim, outAnim);

结束时:

java 复制代码
finish();
activity.overridePendingTransition(inAnim, outAnim);
  • 第一个参数enterAnim:设置下一个即将到来的Activity的进入动画;
  • 第二个参数exitAnim:设置当前即将退出的这个Activity的退出动画。

第一个参数就是进入时的动画,第二个参数就是离开时的参数。不管是startActivity()还是finish()时使用,都遵循这个原则

  • 当设置为0时表示没有动画。

二、demo

1、定义动画

anim/open_enter :

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:duration="@android:integer/config_longAnimTime"
        android:fromXScale="0.1"
        android:fromYScale="0.1"
        android:toXScale="1.0"
        android:toYScale="1.0" />
</set>

anim/open_exit :

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:duration="@android:integer/config_longAnimTime"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="0.1"
        android:toYScale="0.1" />
</set>

anim/close_exit :

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="@android:integer/config_longAnimTime"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>

anim/close_enter:

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="@android:integer/config_longAnimTime"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>

2、使用方式一:

xml 复制代码
<style name="AnimAppTheme" parent="@style/Theme.AppCompat.DayNight.NoActionBar">
    <item name="android:windowAnimationStyle">@style/ActivityAnimationTheme</item>
</style>

<style name="ActivityAnimationTheme" 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>
  • 从A1启动A2:

    • android:activityOpenEnterAnimation:A2进入动画
    • android:activityOpenExitAnimation:A1退出动画
  • 从A2返回A1:

    • android:activityCloseEnterAnimation:A1进入动画
    • android:activityCloseExitAnimation:A2退出动画

3、使用方式二:

java 复制代码
public class BaseActivity extends AppCompatActivity {
    private static final String TAG = BaseActivity.class.getSimpleName();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        overridePendingTransition(R.anim.open_enter, R.anim.open_exit);
        Log.e(TAG, "has been created : 【缩放】");
    }

    /**
     * finish方法比onDestroy方法先执行,
     * 我们的overridePendingTransition需要在finish里面执行才生效。
     */
    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.close_enter, R.anim.close_exit);
        Log.e(TAG, "has been finish : 【透明度】");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //这里面定义的动画并未生效
        //overridePendingTransition(R.anim.close_enter,R.anim.close_exit);
        Log.e(TAG, "has been Destroyed");
    }
}
相关推荐
普通网友4 小时前
Android Jetpack 架构组件最佳实践之“网抑云”APP
android·架构·android jetpack
普通网友4 小时前
原创_Android Jetpack Compose 最全上手指南
android·android jetpack
FDoubleman4 小时前
Android Jetpack之Compose入门(一)
android·android jetpack
普通网友5 小时前
Android Jetpack从入门到精通,干货满满
android·android jetpack
子云心5 小时前
Android Jetpack 系列(七)App Startup 启动优化
android·android jetpack·jetpack·initializer·startup·appstartup
嫩嫩的猿5 小时前
android jetpack compose Model对象更新变量 UI不更新、不刷新问题
android·ui·android jetpack
普通网友5 小时前
Android Jetpack 之 LifeCycle 组件_android 自定义view lifecycle
android·gitee·android jetpack
_codemonster5 小时前
数据库字符集编码问题
android·数据库·oracle
Pika11 小时前
深入浅出Compose HitTest 机制
android·android jetpack