安卓全局活动切换动画,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");
    }
}
相关推荐
Carson带你学Android14 小时前
Compose 终于上线 FlexBox:换行与弹性伸缩 都轻松搞定!
android·composer
私人珍藏库14 小时前
[Android] 三维山水全景地图-3D地形全景观测地图
android·3d·app·工具·软件·多功能
dengyuezhe806015 小时前
《C++ 异常机制与智能指针:从原理到实现》
android·java·c++
Wonderful U15 小时前
Python+Django实战|企业办公用品申领管理系统:物资入库、库存预警、申领审批、归还登记、损耗统计、供应商对账
android·python·django
plainGeekDev15 小时前
网络状态监听 → ConnectivityManager + Flow
android·java·kotlin
楠目15 小时前
CVE-2013-4547 Nginx URI解析漏洞利用总结
android
Coffeeee16 小时前
不能用公司的打包机,AI帮我实现了一套比打包机更好用的Android包构建/分发流程
android·人工智能·ai编程
多彩电脑16 小时前
向AIDE(安卓设备上的Android Studio)导入aar库
android·java·开发语言·androidx
恋猫de小郭16 小时前
解析华为 DevEco Code 和小米 MiMo Code,都基于 OpenCode ,有什么区别?
android·前端·ios
2501_9327502617 小时前
Android 控件与布局全面解析
android