美文网首页Animation精选案例Android
Android activity跳转动画的5种方式

Android activity跳转动画的5种方式

作者: ana生 | 来源:发表于2017-05-18 12:05 被阅读886次

进入正文前来一波福利:633600411(Android技术交流群)

方式一.使用overridePendingTransition方法实现Activity跳转动画

//点击按钮实现跳转逻辑
button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            /**
             * 在调用了startActivity方法之后立即调用overridePendingTransition方法
             */
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_in_left);
        }
    });

可以看到我们在调用了startActivity方法之后又执行了overridePendingTransition方法,而在overridePendingTransition方法中传递了两个动画布局文件,我们首先看一下这里的动画文件具体是怎么实现的:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shareInterpolator="false"
Android:zAdjustment="top">
<translate
    Android:duration="200"
    Android:fromXDelta="-100.0%p"
    Android:toXDelta="0.0" />
</set>

那么下面我们来看一下overridePendingTransition方法的定义,我们在overridependingTransition方法在定义的时候有这样的一段注释说明:

 /**
 * Call immediately after one of the flavors of {@link #startActivity(Intent)}
 * or {@link #finish} to specify an explicit transition animation to
 * perform next.
 */

/**
 * @param enterAnim A resource ID of the animation resource to use for
 * the incoming activity.  Use 0 for no animation.
 * @param exitAnim A resource ID of the animation resource to use for
 * the outgoing activity.  Use 0 for no animation.
 */

好吧,这段注释,告诉通过注释我们能够知道:

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

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

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

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

方式二.使用style的方式定义Activity的切换动画

1.定义Application的style

<!-- 系统Application定义 -->
<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">

2.定义具体的AppTheme样式
其中这里的windowAnimationStyle就是我们定义Activity切换动画的style。而@anim/slide_in_top就是我们定义的动画文件,也就是说通过为Appliation设置style,然后为windowAnimationStyle设置动画文件就可以全局的为Activity的跳转配置动画效果。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="Android:windowAnimationStyle">@style/activityAnim</item>
</style>


<style name="activityAnim">
<item name="Android:activityOpenEnterAnimation">@anim/slide_in_top</item>
<item name="Android:activityOpenExitAnimation">@anim/slide_in_top</item>
</style>
而在windowAnimationStyle中存在四种动画:

activityOpenEnterAnimation // 用于设置打开新的Activity并进入新的Activity展示      的动画
activityOpenExitAnimation  // 用于设置打开新的Activity并销毁之前的Activity展示的动画
activityCloseEnterAnimation  // 用于设置关闭当前Activity进入上一个Activity展示的动画
activityCloseExitAnimation  // 用于设置关闭当前Activity时展示的动画

方式三.使用style的方式定义Activity的切换动画

上面我们讲解的通过overridePendingTransition方法基本上可以满足我们日常中对Activity跳转动画的需求了,但是MD风格出来之后,overridePendingTransition这种老旧、生硬的方式怎么能适合我们的MD风格的App呢?好在google在新的sdk中给我们提供了另外一种Activity的过度动画——ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一个静态类,提供了相应的Activity跳转动画效果,通过其可以实现不少炫酷的动画效果。

1.在跳转的Activity中设置contentFeature

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

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

    setContentView(R.layout.activity_three);
}

这里我们在Activity的setContentView之前调用了:

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

这里的setFeature就是为activity的窗口设置特性,不同的特性对应不同的布局方式,比如可以设置无toolbar模式,有toolbar模式等等。而这里设置的是需要过渡动画,并且我们获取了Android中内置的explode动画,并设值给了Activity的window窗口对象,这样当Activity被启动的时候就会执行explode所带便的动画效果了。

2.在startActivity执行跳转逻辑的时候调用startActivity的重写方法,执行ActivityOptions.makeSceneTransitionAnimation方法

/**
     * 点击按钮,实现Activity的跳转操作
     * 通过Android5.0及以上代码的方式实现activity的跳转动画
     */
    button3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, ThreeActivity.class);
            startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
        }
    });

这里我们调用了startActivity的重载方法:

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

并且我们传入了ActivityOptions.makeSceneTransitionAnimation,该方法表示将Activity a平滑的切换到Activity b,其还有几个重载方法可以指定相关的View,即以View为焦点平滑的从Activity a切换到Activity b。

方式四.使用ActivityOptions之后内置的动画效果通过style的方式

这种方式其实就是通过style的方式展示和使用ActivityOptions过度动画,下面是实现通过定义style方式定义过度动画的步骤:
1.编写过度动画文件

<explode xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:duration="300" />

首先我们需要在Application项目res目录下新建一个transition目录,然后创建资源文件,然后使用这些系统自带的过渡动画效果,这里设置了过度时长为300ms。
2.定义style文件

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

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

在Application的style文件中添加:

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

3.执行跳转逻辑

/**
     * 点击按钮,实现Activity的跳转操作
     * 通过Android5.0及以上style的方式实现activity的跳转动画
     */
    button4.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            /**
             * 调用ActivityOptions.makeSceneTransitionAnimation实现过度动画
             */
            Intent intent = new Intent(MainActivity.this, FourActivity.class);
            startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
        }
    });

方式五.使用ActivityOptions动画共享组件的方式实现跳转Activity动画

这里的共享组件动画效果是指将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果,即在这种过度效果下实现Activity的跳转操作。那么如何实现两个组件View之间实现过渡效果呢?
1.定义共享组件
在Activity a中的button按钮点击transitionName属性:

<Button
    Android:id="@+id/button5"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/button4"
    Android:layout_marginTop="10dp"
    Android:layout_marginRight="10dp"
    Android:layout_marginLeft="10dp"
    Android:text="组件过度动画"
    Android:background="@color/colorPrimary"
    Android:transitionName="shareNames"
    />

在Activity b的布局文件中为组件定义transitionName属性,这样这两个组件相当于有了过度对应关系,这里需要注意的是这两个组件的transitionName属性的值必须是相同的。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/activity_second"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:gravity="center_horizontal"
Android:orientation="vertical"
Android:transitionName="shareNames"
>

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@color/colorAccent"
    Android:layout_marginTop="10dp"
    Android:layout_marginBottom="10dp"
    />
</LinearLayout>

2.调用startActivity执行跳转动画

/**
     * 点击按钮,实现Activity的跳转操作
     * 通过Android5.0及以上共享组件的方式实现activity的跳转动画
     */
    button5.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, FiveActivity.class);
            startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, button5, "shareNames").toBundle());
        }
    });

需要说明的是这里调用的ActivityOptions.makeSceneTransitionAnimation方法,传递了三个参数,其中第一个参数为context对象,第二个参数为启动Activity的共享组件,第三个参数为启动Activity的共享组件transitionName属性值。

相关文章

网友评论

    本文标题:Android activity跳转动画的5种方式

    本文链接:https://www.haomeiwen.com/subject/atlsxxtx.html