小编这里介绍三种Activity间的动画切换方式:

1.  overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);

2.  Them中设置<item name="android:windowAnimationStyle">@style/activityAnim</item>(可用于21之前版本);

3.  采用API 21(5.0)后系统内置的Activity之间的切换动画,这里介绍4种;

对这三种动画的个人理解:

第一种:其中R.anim.exit_anim指的是当前退出的Activity的动画,R.anim.enter_anim指将要进入的Activity的动画,也就是说这个方法只能设置当前Activity的退出动画,并且使用时必须在startActivity()或者 finish()方法的后面。若还想设置当前Activity的两种进入动画效果,可以采用Them的设计方式;

第二种:能用于多个Activity,可以自定义自己喜欢的样式,但对于复杂的动画效果,代码会有点多;

第三种:有版本要求,但代码相对效果来说较少,而且挺酷的;

废话不在说,直接从第二种方式走起,主要代码如下:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

    <!--低版本也可使用的自定义型Activities间动画切换方式-->
    <item name="android:windowAnimationStyle">@style/activityAnim</item>
</style>

<style name="activityAnim">
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_from_top</item>
    <item name="android:activityCloseExitAnimation">@anim/exit_anim</item>
    <item name="android:activityOpenEnterAnimation">@anim/enter_anim</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_bottom</item>
</style>

退出动画举例,@anim/exit_anim文件代码:

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

    <rotate
        android:fromDegrees="0"
        android:toDegrees="720"
        android:pivotX="50%"
        android:pivotY="50%" />
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0" />
    <scale
        android:pivotY="50%"
        android:pivotX="50%"
        android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="0"
        android:toYScale="0" />

    <translate
        android:fromXDelta="0%p"
        android:fromYDelta="0%p"
        android:toXDelta="100%p"
        android:toYDelta="0%p" />
</set>

搞定,那让我们进入第三种方式吧,这个我是在网上找了个比较好的,就直接拿过来了,网址: 点我

先看效果吧:

第一个Activity,退出时用的是Explode效果,第二个Activity进入时用的是Slide效果。这些效果无需我们自己去实现,都是内置的效果,接下来看看都有哪些内置效果。

1 使用内置Activity之间切换动画代码步骤

Activity之间的切换期间,对于某个Activity来说,无非就是“进入”和“退出”两种情景下的动画。而“进入”分为“第一次进入Activity”和“返回当前Activity”这两种情况。另外系统还提供了一种动画,即共享元素,这是让两个Activity中的View有个过渡切换的效果。执行动画的状态如下所示:

enter:用于决定第一次打开当前Activity时的动画 
exit : 用于决定退出当前Activity时的动画 
reenter: 用于决定如果当前Activity已经打开过,并且再次打开该Activity时的动画 
shared elements:用于决定在两个Activity之间切换时,指定两个Activity中对应的View的过渡效果

1.首先在setContentView()之前执行,用于告诉Window页面切换需要使用动画

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
  • 1
  • 1

2.接下来就是加载切换动画 
其中R.transition.explode就是要执行的动画,是在res/transition目录下的xml文件,我们使用的是系统内置的Explode效果动画,关于怎么去写explode.xml,我们接下来小节去讲解。

  Transition explode = TransitionInflater.from(this).inflateTransition(R.transition.explode);
  • 1
  • 1

3.告诉Window,当前的Activity在什么情况下使用上面的动画 
上面我们创建好了切换动画,接下来就是要告诉当前窗口,在什么情况下去使用动画效果啦,你可以根据你的需求在不同的切换情景中选择不同的效果:

//退出时使用
getWindow().setExitTransition(explode);
//第一次进入时使用
getWindow().setEnterTransition(explode);
//再次进入时使用
getWindow().setReenterTransition(explode); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

当然了,你也可以不使用代码的方式,直接在你使用的主题

<item name="android:windowExitTransition">@transition/explode</item>
<item name="android:windowEnterAnimation">@transition/explode</item>
<item name="android:windowReenterTransition">@transition/explode</item>
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

4.调用startActivity 
跟我们之前使用的startActivity(Intent intent);不同,这里多了一个参数Bundle,是先通过makeSceneTransitionAnimation函数创建一个ActivityOptions对象,再将其转为Bundle对象:

startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
  • 1
  • 1

2 Explode效果

Explode即爆炸效果, 在res/transition目录下新建一个xml文件(如explode.xml),内容如下:

<explode xmlns:android="http://schemas.android.com/apk/res/android"android:duration="300" />
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

其中duration表示Explode动画持续时间,由于是Activity之间的切换,最好不要把动画时间设置过大,一般取200~500毫秒比较合适。 
我们看看效果吧~ 

3 Slide滑动效果

使用Slide跟Explode类似,都是在res/transition目录下新建一个xml文件(如slide.xml),内容如下:

<slide xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:interpolator/decelerate_cubic"android:slideEdge="end"/>
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

其中,slideEdge表示起始滑动的侧边位置,end表示右侧,start表示左侧,top表示顶部,bottom表示底侧,各种效果你可以亲自试试~,一起看看滑动效果吧

 
GIF 效果看的比较死板,可以下载源码实际运行一下~

如果你不希望顶部的状态栏以及底部的导航栏一起执行动画,可以在xml中指定:

<slide xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:interpolator/decelerate_cubic"android:slideEdge="end"><targets><target android:excludeId="@android:id/navigationBarBackground" /><target android:excludeId="@android:id/statusBarBackground" /></targets>
</slide>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4 Fade淡化效果

使用淡化效果依然是很简单,在res/transition目录下新建一个xml文件(如fade.xml),内容如下:

<fade xmlns:android="http://schemas.android.com/apk/res/android"android:duration="300" />
  • 1
  • 2
  • 1
  • 2

5 Shared Element共享元素效果

与前面几种效果不同的是,共享元素效果是将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果,我们先看看动态图感受一下:

从动态图中看到,第一个Activity的小绿色方块到第二个Activity大绿色方块有个过渡效果~

那如何实现这个效果呢?

1.将两个Activity中需要过渡的View加上Android:transitionName属性

两个View的android:transitionName属性取值要一致,比如: 
第一个Activity布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><View
        android:id="@+id/firstSharedView"android:layout_width="100dp"android:layout_height="100dp"android:background="#00cc00"android:onClick="onClick"android:transitionName="sharedView" />
</RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

第二个Activity布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><View
        android:layout_width="match_parent"android:layout_height="300dp"android:layout_alignParentBottom="true"android:background="#00cc00"android:onClick="onClick"android:transitionName="sharedView" /></RelativeLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

两个绿色的View都添加android:transitionName属性,并且取名一致。

2.调用startActivity 
ActivityOptionsmakeSceneTransitionAnimation函数第一个参数Activity没啥解释的,第二个参数就是第一个Activity中的View对象,第三个参数就是两个ActivityView的 android:transitionName属性的值。

 startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, firstSharedView, "sharedView").toBundle());
  • 1
  • 2
  • 1
  • 2

现在就可以实现这种Shared Element效果啦,但是可能你会想实现同时让两个View有这样的效果,可是makeSceneTransitionAnimation函数却只能让我们设置一个View和一个transitionName属性。如何添加多个呢?接下来我们一起学习让多个View同时有切换效果。

除了需要将两个Activity中需要过渡的View对应取相同的名称外,还需将需要过渡的View和transitionName取值对应的String这两个对象封装到一个Pair对象中:

 Pair first = new Pair<>(firstSharedView, ViewCompat.getTransitionName(firstSharedView));Pair second = new Pair<>(secondSharedView, ViewCompat.getTransitionName(secondSharedView));
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

然后调用ActivityOptionsCompat类的makeSceneTransitionAnimation的另一个重载函数makeSceneTransitionAnimation(Activity activity, 
Pair<View, String>... sharedElements)
,第一个参数不解释,后面参数为不定长度的形参,即你可以传递任意多个Pair对象。

 ActivityOptionsCompat transitionActivityOptions =ActivityOptionsCompat.makeSceneTransitionAnimation(this, first, second);
  • 1
  • 2
  • 1
  • 2

最后调用startActivity

 ActivityCompat.startActivity(this,intent, transitionActivityOptions.toBundle());
  • 1
  • 2
  • 1
  • 2

说了这么多步骤,我们来看看效果吧~ 

5.1 自定义 Shared Element切换动画

如果你对内置的 Shared Element还不够满意,你还可以定制View的过渡切换效果。步骤如下:

1.创建一个View的过渡移动的轨迹路径PathMotion类

我们可以创建ArcMotion对象,ArcMotion是PathMotion子类,是个曲线路径。想要了解更多ArcMotion可以查看【ArcMotion官方文档】

ArcMotion arcMotion = new ArcMotion();
arcMotion.setMinimumHorizontalAngle(50f);
arcMotion.setMinimumVerticalAngle(50f);
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

2.定义ChangeBounds类

我们自定义一个继承ChangeBounds的类,主要重写createAnimator函数,即创建你要执行的动画。这个函数由3个参数:

1.ViewGroup sceneRoot:屏幕根View,即DecorView,第二个Activity的DecorView。 
2. TransitionValues startValues :属性动画的起始属性值,TransitionValues 对象内部有各Map类型的属性values,用于保存需要执行属性动画的属性。这个里面的属性值是在函数captureStartValues里放置,因此你可以重写captureStartValues函数,并把你自定义的属性动画中的属性放进去。 
3. TransitionValues endValues :与startValues类似,表示属性动画结束时的属性值。可以通过重写captureEndValues函数,并把你自定义的属性动画里面的最终属性值放进去。

我们先看一个最简单的示例:

package com.hc.util;import android.animation.Animator;
import android.transition.ChangeBounds;
import android.transition.TransitionValues;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;public class CustomChangeBounds extends ChangeBounds {@Overridepublic Animator createAnimator(final ViewGroup sceneRoot,TransitionValues startValues,final TransitionValues endValues) {Animator changeBounds = super.createAnimator(sceneRoot, startValues, endValues);if (startValues == null || endValues == null || changeBounds == null) return null;changeBounds.setDuration(300);changeBounds.setInterpolator(AnimationUtils.loadInterpolator(sceneRoot.getContext(),android.R.interpolator.fast_out_slow_in));return changeBounds;}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

看看效果吧~

最后,再献上源码:http://download.csdn.net/detail/huachao1001/9550440

参考资料:

https://labs.ribot.co.uk/exploring-meaningful-motion-on-android-1cd95a4bc61d#.cf6pub9xu 
https://github.com/hitherejoe/animate

另外为防弄混, 顺便留一下ViewPager的动画切换方法及相关文档:
ViewPager切换动画可用:setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer)实现,(为兼容Android3.0以下可用nineoldandroids中的viewhelper.setScale()实现动画),
参考网址: http://blog.csdn.net/lmj623565791/article/details/40411921/

Activity动画切换3种方案相关推荐

  1. android 那几种动画,Android 动画实现几种方案

    Android 动画实现几种方案 在 Android 的 FrameWork 中,为我们提供三种动画的实现方式:逐帧(Frame)动画.视图/补间动画(View Animation)和属性动画(Pro ...

  2. Xamarin.android Activity动画切换效果实现

    http://blog.csdn.net/esunshine1985/article/details/44302903 1.在Resources--values下新建styles.xml,添加内容如下 ...

  3. Android动画效果 translate、scale、alpha、rotate 切换Activity动画 控件位置调整

    2011.10.28注:如果需要控件停在动画后的位置,需要设置android:fillAfter属性为true,在set节点中.默认在动画结束后回到动画前位置.设置android:fillAfter后 ...

  4. Github项目解析(九)--实现Activity跳转动画的五种方式

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了在Activity ...

  5. android 向左滑动动画,Android Activity左边滑出,右边滑入的动画切换

    Activity的切换动画实际上是Android的View Animation(视图动画)中的Tween Animation效果,Tween Animation分为4种动画效果,分别是:alpha ( ...

  6. Android的Activity屏幕切换动画左右滑动切换

    在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...

  7. Android -- 基础篇 -- Activity跳转动画的五种方式(下)

    上一篇文章中我们讲解了在Activity启动过程中获取组件宽高的五种方式.在Activity的启动过程中如果我们直接在生命周期方法中通过view.getWidth()或者是view.getHeight ...

  8. android activity的跳转动画,实现activity跳转动画的若干种方式

    第一种: (使用overridePendingTransition方法实现Activity跳转动画) 在Activity中代码如下 /** * 点击按钮实现跳转逻辑 */ button1.setOnC ...

  9. android动画变黑,Activity添加进入和退出动画的两种方式,解决黑色区域问题

    Activity添加进入和退出动画的两种方式,解决黑色区域问题 给Activity添加进入和退出动画的操作,大家一定不会陌生.常见的有两种方式,一种是通过style文件给Activity设置Theme ...

最新文章

  1. 从源码分析DEARGUI之背变换
  2. ChildTuning:试试把Dropout加到梯度上去?
  3. dataset_flickr8k.json与dataset_flickr30k.json的比较
  4. zabbix--分布式监控proxy
  5. Apache Camel教程– EIP,路由,组件,测试和其他概念的简介
  6. pandas 不要编号 加一行_文科生带你学Python|Pandas读取数据
  7. 搭建Harbor docker镜像仓库
  8. python字符串format格式化
  9. Core官方DI解析(3)-ServiceCallSite.md
  10. easypoi excel:Cannot add merged region X to sheet because it overlaps with an existing merged region
  11. 企业招聘大数据人才 看重的是哪些方面?
  12. 英语发音规则---L字母
  13. (2)勾股数组与单位圆
  14. 为什么巴西买家更喜欢用Boleto付款?
  15. unity复现中的错误
  16. Nodejs xlsx导出导出
  17. 会声会影X10视频制作软件中文密钥激活版
  18. 微信小程序文字超出显示省略号
  19. PTA L1-013:计算阶乘和 (python)
  20. 公众号如何关注回复多图文?

热门文章

  1. pg_ctl开启pg数据库时出现未找到命令
  2. 仿百度云网盘面包屑导航
  3. 【转】桌面图标文字 透明
  4. 2021CBC街舞冠军赛北部赛区收官!飒爽的舞姿融入灵魂,彰显炙热初心
  5. 图片(矩阵)相似度计算
  6. 全方位解读抖音推荐审核机制!
  7. Windows下电脑如何开启高性能模式 - CPU合理升频 - 显卡开满优先独立显卡功耗开满
  8. Android Activity(活动)学习记录
  9. JS 判断一个数组是否包含另一个数组
  10. M7650DNF 打印机 word打印时候提示手动进纸的解决方法