Android中Activity切换动画

通过代码来设置Activity的切换动画

当我们启动一个新的Activity的时候,需给当前Activity设置一个出去的动画,也要给进入的新的Activity一个进入的动画。当我们返回上一个Activity的时候,要给自己一个出去的动画,和上一个Activity的进入动画。如下:

这里写图片描述

定义Alpha动画

进入的动画 anim_alpha_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="400"
        android:fromAlpha="0"
        android:toAlpha="1.0"/>
</set>

表示从alpha=0 变成 alpha=1 持续时长400 毫秒

退出的动画 anim_alpha_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="400"
        android:fromAlpha="1.0"
        android:toAlpha="0"/>
</set>

我们定义了两个动画,同时还要使用动画。
启动新Activity应该在startActivity()的后面调用overridePendingTransition()如:

findViewById(R.id.btn_alpha).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, AlphaActivity.class);
                startActivity(intent);
                //设置当前Activity退出的动画和新Activity进入的动画
                overridePendingTransition(R.anim.anim_alpha_in, R.anim.anim_alpha_out);
            }
        });

从新的Activity回到旧的Activity时,应该在finish()后面调用overridePendingTransition()如:
新建AlphaActivity.java

public class AlphaActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alpha);
    }

    @Override
    public void finish() {
        super.finish();
        //设置当前Activity退出的动画和新Activity进入的动画
        overridePendingTransition(R.anim.anim_alpha_in, R.anim.anim_alpha_out);
    }
}

我重写finish() 方法在super.finish() 后面执行动画,这样我们在当前Activity按返回键的时候就可以执行动画了。
效果如下:
这里写图片描述

可以看的两个Activity有切换有一个渐变效果,说明我们的动画设置成功。下面我们试试Translate动画。

定义Translate动画

与alpha动画不一样的是新Activity进入和退出走的动画是不一样的如下分析:

这里写图片描述

当启动新Activity时:旧Activity 从0移到-100% 而新Activity从 100% 到 0 如下:

anim_enter_translate_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="400"
        android:fromXDelta="0"
        android:toXDelta="-100%"
        />
</set>

anim_enter_translate_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="400"
        android:fromXDelta="100%"
        android:toXDelta="0"/>
</set>

这里写图片描述

当启动回到旧Activity时:旧Activity 从-100%移到0 而新Activity从 0 到 100% 如下:
anim_exit_translate_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="400"
        android:fromXDelta="-100%"
        android:toXDelta="0"
        />
</set>

anim_exit_translate_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="400"
        android:fromXDelta="0"
        android:toXDelta="100%"
        />
</set>

动画定义完了,使用和上面使用Alpha一样的如下:
启动:

findViewById(R.id.btn_translate).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, TranslateActivity.class);
                startActivity(intent);
                overridePendingTransition(R.anim.anim_enter_translate_in, R.anim.anim_enter_translate_out);
            }
        });

结束:

public class TranslateActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_translate);
    }

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.anim_exit_translate_in, R.anim.anim_exit_translate_out);
    }
}

效果:

这里写图片描述

下面将Tranlate动画和Alpha动画结合使用如下:
启动:

findViewById(R.id.btn_TranslateInAndAlphaOut).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, TranslateInAndAlphaOutActivity.class);
                startActivity(intent);
                overridePendingTransition(R.anim.anim_enter_translate_in, R.anim.anim_enter_translate_out);
            }
        });

结束:

public class TranslateInAndAlphaOutActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_translate_in_and_alpha_out);
    }

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.anim_alpha_in, R.anim.anim_alpha_out);
    }
}

效果:
这里写图片描述

可以看的进入的时候是平移,而出去的时候是Alpha效果。

至于scale和rotate 这里就不演示了,基本一样。下面用style来指定Activity切换动画。

使用styles来设置Activity切换动画

像上面那样在代码里每次需要动画我们都要多写两个方法来实现效果,现在通过定义的主题来实现切换动画,这样只需要在用到的Activity里引用主题即可实现效果,非常方便。
我们这里就演示Tranlate动画如下:
1、定义动画,参考上面的四个动画文件

2、在values/styles.xml下定义动画

<!-- Base application theme. -->
<style name="AppAnimationTheme" parent="AppTheme">
    <!--设置Activity切换动画-->
    <item name="android:windowAnimationStyle">@style/ActivityAnimation</item>
</style>

<!--定义Activity切换动画  -->
<style name="ActivityAnimation">
    <item name="android:activityOpenEnterAnimation">@anim/anim_enter_translate_in</item>
    <item name="android:activityOpenExitAnimation">@anim/anim_enter_translate_out</item>
    <item name="android:activityCloseEnterAnimation">@anim/anim_exit_translate_in</item>
    <item name="android:activityCloseExitAnimation">@anim/anim_exit_translate_out</item>
</style>

3、这样我们只需要在使用动画的Activity里配置主题即可如下:

<activity
    android:name=".MainActivity"
    android:theme="@style/AppAnimationTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

<activity
    android:name=".AnimXmlActivity"
    android:theme="@style/AppAnimationTheme">
</activity>

效果:
这里写图片描述

到此为止,Activity的切换动画已经介绍完了,我们可以定制自己动画来实现各种效果。

源码地址https://github.com/cskun/ActivityAnimation.git

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值