Android Activity动画填坑

通用策略:

1. overridePendingTransition方法

在startActivity后加上这样一行代码

startActivity(new Intent(MainActivity.this , SelectWiFiActivity.class));
overridePendingTransition(R.anim.up_in, R.anim.up_out);

然后在跳转到的activity里重写finish方法

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

overridePendingTransition的两个参数分别是新的activity进入的动画和当前activity退出的动画。

2.自定义主题style

在style.xml文件夹内加入

    <style name="AnimActivity" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowAnimationStyle">@style/AnimationActivity</item>
        <item name="android:windowNoTitle">true</item>
    </style>

    <style name="AnimationActivity" parent="@android:style/Animation.Activity" >
        <item name="android:activityOpenEnterAnimation">@anim/up_in</item>
        <item name="android:activityOpenExitAnimation">@anim/up_out</item>
        <item name="android:activityCloseEnterAnimation">@anim/down_in</item>
        <item name="android:activityCloseExitAnimation">@anim/down_out</item>
    </style>
A 启动 B 时,A 从屏幕上消失,这时执行的是A的android:activityOpenExitAnimation
A 启动 B 时,B 出现在屏幕上,这时执行的是B的android:activityOpenEnterAnimation
从 B 返回A时,B从屏幕上消失,这时执行的是B的android:activityCloseExitAnimation
从 B 返回A时,A 出现在屏幕上,这时执行的是A的android:activityCloseEnterAnimation
我的动画文件,供参考

up_in.xml

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

up_out.xml

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

down_in.xml

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

down_out.xml

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

至此,一声感叹,animation set居然还有如此之操作?


注意:要想activity之间有动画效果首先是同一个theme,或者整体使用同一个theme,或者继承同一个theme。


3. Android 5.0之后有新的API
Android5.0之后Activity的出入场动画总体上来说可以分为两种,一种就是分解、滑动进入、淡入淡出,另外一种就是共享元素动画,下面我们分别就这两种动画进行说明。


1.分解

先来看一张效果图:

就是这样一种效果,那我们接下来看看这种效果要怎么实现。

首先,把之前启动Activity的代码改成下面的写法:

[java]  view plain  copy
  1. startActivity(new Intent(this, Main2Activity.class), ActivityOptions.makeSceneTransitionAnimation(this).toBundle());  

添加完成之后,在Main2Activity中设置该Activity的进出场动画即可:

[java]  view plain  copy
  1. getWindow().setEnterTransition(new Explode().setDuration(2000));  
  2. getWindow().setExitTransition(new Explode().setDuration(2000));  

OK,就是这么简单,哦,对了,大家一定要记得在styles.xml文件中添加下面一行代码,表示激活Activity中元素的过渡效果:

[java]  view plain  copy
  1. <item name="android:windowContentTransitions">true</item>  

2.滑动进入

有了上面的步骤,再设置滑动进入就很简单了,只需要修改Main2Activity中的两行代码即可:

[java]  view plain  copy
  1. getWindow().setEnterTransition(new Slide().setDuration(2000));  
  2. getWindow().setExitTransition(new Slide().setDuration(2000));  

显示效果如下:


3.淡入淡出

Main2Activity修改代码如下:

[java]  view plain  copy
  1. getWindow().setEnterTransition(new Fade().setDuration(2000));  
  2.         getWindow().setExitTransition(new Fade().setDuration(2000));  

显示效果如下:


2.2 共享元素动画

共享元素动画是一个非常神奇的东东,我们先来看看效果:

可能这个Gif动画还不太清晰,我再来解释一下,在MainActivity和Main2Activity里边都有一个Button,只不过一个大一个小,从MainActivity跳转到Main2Activity时,我并没有感觉到Activity的跳转,只是觉得好像第一个页面的Button放大了,同理,当我从第二个页面回到第一个页面时,也好像Button变小了。OK,这就是我们的Activity共享元素。

当两个Activity中有同一个控件的时候,我们便可以采用共享元素动画。

使用共享元素动画的时候,我们需要首先给MainActivity和Main2Activity中的两个button分别添加android:transitionName="mybtn"属性,并且该属性的值要相同,这样系统才知道这两个控件是共享元素。设置完成之后,接下来就是启动Activity的代码了,如下:

[java]  view plain  copy
  1. startActivity(new Intent(this,Main2Activity.class), ActivityOptions.makeSceneTransitionAnimation(this,view,"mybtn").toBundle());  

还是上面那种启动方式的重载方法,只不过这里多了两个参数,view表示MainActivity中的共享元素(就是那个Button),第二个参数表示布局文件中transitionAnimation属性的值。OK,就这么简单。

这时有的筒子可能有疑问了,那我如果两个页面中有多个共享元素该怎么办呢?简单,android:transitionName属性还像上面一样设置,然后在启动Activity时我们可以通过Pair.create方法来设置多个共享元素,如下:

[java]  view plain  copy
  1. startActivity(new Intent(this, Main2Activity.class),  
  2.                 ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(((View) iv1),"myiv"), create(((View) textView),"mytv")).toBundle());  

Pair.create方法中有两个参数,第一个是共享元素的实例(注意要是View类型),第二个参数是该View的transitionAnimation属性的值。

就这么简单,筒子们快速尝试一下吧。

以上。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值