Activity切换常用的动画实现方式

1.overridePendingTransition():

此方式只需要在启动另一个activity和退出activity的时候调用就行,这个方法接收两个参数,一个是新启动的activity进入时的动画,另一个是当前activity消失时的动画。

启动:

startActivity(newIntent(MainActivity.this,TestActivityWithTheme.class));

overridePendingTransition(R.anim.open_in, R.anim.open_out);

退出:

@Override

     public void finish() {

         super.finish();

         overridePendingTransition(R.anim.close_in, R.anim.close_out);

}

2.ActivityOptionsCompat:

这个类是supportv4中新加的一个类,可以为activity添加各种动画效果,这里面的api至少要求4.0以上的系统,部分要求5.0以上,谷歌为我们封装好了的一些拉伸扩散动画,共享元素动画等等,下面只介绍一种简单效果的实现方式。

启动:

ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(MainActivity.this, R.anim.open_in, R.anim.open_out);

ActivityCompat.startActivity(MainActivity.this,intent, compat.toBundle());

退出:

Override

public void onBackPressed() {

    super.onBackPressed();

    ActivityCompat.finishAfterTransition(this);

}

注意:该退出方法不能达到预期的动画效果,还需要使用第一种方式实现退出overridePendingTransition(R.anim.close_in, R.anim.close_out);

3.AppTheme:直接在主题中修改activity动画样式

我们可以在 AndroidManifest.xml 文件中,通过Android:theme 属性设置 Activity 的主题。主题中可以定义 Activity 的切换动画。这是应用 Activity 切换动画的一种方法。下面是通过主题来设置 Activity 间的切换动画的实现方式。

3.1定义包含动画的activity主题

res/values/styles.xml

<style name="AnimActivityTheme" parent="@android:style/Animation.Activity">

    <item name="android:windowAnimationStyle">@style/MyWindowAnimTheme</item>

</style>

就是使用 windowAnimationStyle 这个属性,指定切换动画的style即可。

3.2定义切换动画style

res/values/styles.xml

<style name="MyWindowAnimTheme">

    <item name="android:activityOpenEnterAnimation">@anim/top_to_bottom_in</item>

    <item name="android:activityOpenExitAnimation">@anim/top_to_bottom_out</item>

    <item name="android:activityCloseEnterAnimation">@anim/bottom_to_top_in</item>

    <item name="android:activityCloseExitAnimation">@anim/bottom_to_top_out</item>

</style>

下面具体介绍这4个属性的意思,假设我们有 2 个 Activity,分别是 A 和 B:

  • A 启动 B 时,A 从屏幕上消失,这时执行的是A的
    android:activityOpenExitAnimation
  • A 启动 B 时,B 出现在屏幕上,这时执行的是B的
    android:activityOpenEnterAnimation
  • 从 B 返回A时,B从屏幕上消失,这时执行的是B的
    android:activityCloseExitAnimation
  • 从 B 返回A时,A 出现在屏幕上,这时执行的是A的
    android:activityCloseEnterAnimation

3.3定义具体动画文件

  • res/anmi/res/top_to_bottom_in.xml
  • res/anmi/res/top_to_bottom_out.xml
  • res/anmi/res/bottom_to_top_in.xml
  • res/anmi/res/bottom_to_top_out.xml

这里不再介绍动画文件的实现。

3.4应用到对应activity

AndroidMenifest.xml

<activity android:name=".MainActivity"

    android:theme="@style/AnimActivityTheme”>

3.5在使用AppTheme设置动画时发现了两个问题

A.添加动画后,出现从黑屏到新activity的过渡

原因:没有设置相应的消失动画

解决方法:设置相应的消失动画,如果不想设置消失动画,可以使用写一个假动画,这个动画是没有任何效果,只是为了避免出现黑屏,运行效果为原acticity静止不动,新启动的activity执行进入动画。

B.没有动画,或动画与设置不一致

原因:当页面切换时需要进入和消失两个动画,当没有进入动画时,消失动画也不会执行,会执行系统动画,如果没有系统动画则没有动画,或者某个页面使用第一或第二种方式设置了动画(动画执行优先级,系统动画 < AppTheme < (overridePendingTransition\ActivityOptionsCompat))。

解决方法:为了保证进入和消失都有动画,要将动画主题设置到两个Activity上。也可以将主题设置到application上,这样整个应用都是用该切换动画。如果是某个页面使用第一或第二种方式设置了动画,那么在启动和退出时最好都要设置,不然会造成启动和退出不一致的情况。

4.举例:淡入淡出效果实现

通过在Manifest中为Activity添加Theme实现,具体实现过程如下:

首先在res文件夹下建立anim文件夹,然后在里面建立fade_in.xml和fade_out.xml两个动画资源:

<?xml version="1.0" encoding="utf-8"?>  
<alpha xmlns:android="http://schemas.android.com/apk/res/android"  
    android:duration="500"  
    android:fromAlpha="0.0"  
    android:interpolator="@android:anim/accelerate_interpolator"  
    android:toAlpha="1.0" />
<?xml version="1.0" encoding="utf-8"?>  
<alpha xmlns:android="http://schemas.android.com/apk/res/android"  
    android:duration="1000"  
    android:fromAlpha="1.0"  
    android:interpolator="@android:anim/accelerate_interpolator" 
    android:toAlpha="0.0" />

如上所示,其中常见的interpolator有

  • LinearInterpolator:线性插值器,匀速运动;
  • AccelerateDecelerateInterpolator:加速减速插值器,动画两头慢中间快;
  • DecelerateInterpolator:减速插值器,动画越来越慢;

然后在values文件夹下的styles.xml中的resources标签内写:

   <style name="Anim_fade" parent="android:Theme.NoTitleBar">  
       <item name="android:windowAnimationStyle">@style/fade</item>  
   </style>  
  
   <style name="fade" parent="@android:style/Animation.Activity">  
       <item name="android:activityOpenEnterAnimation">@anim/fade_in</item>  
       <item name="android:activityOpenExitAnimation">@anim/fade_out</item>  
       <item name="android:activityCloseEnterAnimation">@anim/fade_in</item>  
       <item name="android:activityCloseExitAnimation">@anim/fade_out</item>  
   </style>

接下来在Mainfest中的activity中添加上android:theme="@style/Anim_fade"即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值