Activity切换动画 动效

Quibbler 2020-2-24 2075

Activity切换动画

         Activity之间切换的时候有动画效果,不同手机系统效果不一样,因为系统框架做了改进。而APP开发者也可以自定义Activity切换动画,让自己的应用变得高大上。



1、overridePendingTransition(有效)

        Activity类中提供了Activity跳转动画方法,通过该方法可以实现Activity跳转时的动画效果。在Activity中定义的部分源码如下

    / **
      *在{@link #startActivity(Intent)}或{@link #finish}中的一种之后立即调用,以指定要执行的显式过渡动画。
      *
      *从{@link android.os.Build.VERSION_CODES#JELLY_BEAN}也就是Android 4.1开始,
      *an alternative to using this with starting activities is to supply the desired animation 
      *information through a {@link ActivityOptions} bundle to {@link #startActivity(Intent, Bundle)} or 
      *a related function.  This allows you to specify a custom animation even when starting an activity 
      *from outside the context of the current top activity.
      *
      * @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) {
        }
    }

        overridePendingTransition方法需要在startAtivity方法或者是finish方法调用之后立即执行

        参数enterAnim表示的是从Activity a跳转到Activity b,进入b时的动画效果

        参数exitAnim表示的是从Activity a跳转到Activity b,离开a时的动过效果

        若进入b或者是离开a时不需要动画效果,则可以传值为0


1.1、使用overridePendingTransition

        在启动Activity后调用该方法设置动画效果参数,这个方法必须放在startActivityfinish之后才能调用

    Intent intent = new Intent(this, SecondActivity.class);
    startActivity(intent);
    //设置Activity动画
    overridePendingTransition(R.anim.bottom_in, R.anim.top_out)


1.2、定义动画

        Android预定义了很多出色的动画anim文件,可以直接使用

    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
    //里面结合了translate和alpha变化
    overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);

        也可以在res/文件夹下新建anim文件夹,将动画文件定义在res/anim/下,比如新建一个平移动画:

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="300"
        android:fromYDelta="100%p"
        android:toYDelta="0" />

        只有退出或者进入动画并不能得到效果,注意动画间的合理搭配,否则还会出现闪屏、黑屏体验不好的动画。



2、style定义Activity切换动画(没有效果)

        在res/values/styles.xml文件中定义了Application和Activity的主题,关于主题参考《Android主题Theme style》。Activity切换动画的4个属性如下:

        activityOpenEnterAnimation: 打开新的Activity并进入新的Activity展示的动画

        activityOpenExitAnimation:    打开新的Activity并销毁之前的Activity展示的动画

        activityCloseEnterAnimation: 关闭当前Activity进入上一个Activity展示的动画

        activityCloseExitAnimation:    关闭当前Activity时展示的动画

        定义好style后,设置给Activity。但是实际效果似乎这种方式已经废弃不管用了。



3、ActivityOptions切换动画

        启动Activity的方法startActivity()有很多重载方法,其中一个传入的就是Intent和ActivityOptions参数

    public void startActivity(Intent intent, @Nullable Bundle options)


3.1、使用ActivityOptions(不知道哪一步不对,无效果

        用该方法启动Activity,ActivityOptions.makeSceneTransitionAnimation(this).toBundle()

    Intent intent = new Intent(this, SecondActivity.class);
    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

        在被启动的Activity的onCreate()方法中添加

    // 设置contentFeature,可使用切换动画
    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
    Transition explode = TransitionInflater.from(this).inflateTransition(R.transition.explode);
    getWindow().setEnterTransition(explode);
    
    setContentView(R.layout.activity_second);

        注意:requestFeature()方法必须要在setContentView()之前调用,否则报错


3.2、ActivityOptions之style的方式(不知道哪一步不对,无效果

        在res/目录下新建transition目录,在res/transition/目录下建transition动画文件:

    <?xml version="1.0" encoding="utf-8"?>
    <explode 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="300" />

        再给要跳转的Activity主题style设置进入和出去transition动画:

    <item name="Android:windowEnterTransition">@transition/activity_explode</item>
    <item name="Android:windowExitTransition">@transition/activity_explode</item>


3.3、Shared Element效果(有效)

        前后两个Activity切换时,控件像发生交互一样。

        前后两个Activity的布局中的控件都加上android:transitionName属性。

    ... ....
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:transitionName="quibbler" />

    //另一个布局中
    ... ....
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:transitionName="quibbler" />

        在启动Activity的ActivityOptions.makeSceneTransitionAnimation方法中传入控件,和android:transitionName值。

    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, mButton, "quibbler").toBundle());

        效果所示,类似过渡动画:



参考资料:

        《酷炫的Activity切换动画,打造更好的用户体验》

        《Activity过渡(跳转)动画》

        《Android——Activity切换炫酷动画实现》

        《Android四大组件——Activity跳转动画、淡出淡入、滑出滑入、自定义退出进入》

        《Android5.0Activity的转场动画、过渡动画、过场动画、跳转动画》


不忘初心的阿甘
最新回复 (0)
    • AI笔记本-欢迎来到 AI 驱动博客时代 🚀
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com