小松的技术博客

六和敬

若今生迷局深陷,射影含沙。便许你来世袖手天下,一幕繁华。 你可愿转身落座,掌间朱砂,共我温酒煮茶。

Android转场动画

Android最开始一个activity基本就是一个页面,但是没切换一次页面都要重新切换一个activity,这非常耗性能,并且随着平板的出现,更多时候我们只想切换一个页面的局部区域,因此fragment在Android3.0应运而生,fragment有自己的生命周期,但是比activity轻量和节约性能,因此现在更多是在一个activity上切换fragment来更新页面内容,和前端上单页面技术有共通之处了。

用户体验总是非常重要的,所以好的页面转场动画也能给用户一种好的用户体验。android中存在activity和fragment两种切换页面的方式,因此页面转场动画也要分别讨论了。

一、Activity的页面转场动画

  • 资源文件:资源文件放在res/anim文件夹下,是view animation,xml文件根节点可以是<alpha>、<scale><translate>、<rotate>interpolator element,或者是set

  • 调用方法:Activity的转场动画是通过overridePendingTransition(int enterAnim, int exitAnim)实现的。enterAnim为进入界面的activity所用到的anim资源文件,设为0则代表新界面进入时无动画;exitAnim是退出界面的activity所用到的anim资源文件,参数设为0则退出旧界面时无动画。

  • 调用时间:该方法在startActivity(Intent)或者finish()之后调用。

  • 兼容性:该方法是API Level 5加入的,故只支持Level 5 以上的android系统。

二、Fragment的页面转场动画

fragment是android3.0(API level 11)后引入的,由于兼容的复杂性和后期引入时更多的考虑,因此其转场动画相比Activity要复杂得多。

首先,按照动画是否是自定义的可以将动画划分为”标准转场动画“和”自定义转场动画“。

标准转场动画

  • 调用方法:用setTransition(int transit) 方法来调用;
  • 可传参数:
TRANSIT_NONE(无动画形式)  
TRANSIT_UNSET(未设置形式)  
TRANSIT_FRAGMENT_OPEN(打开形式)  
TRANSIT_FRAGMENT_CLOSE(关闭形式)  
TRANSIT_FRAGMENT_FADE(fade形式)  

注意这些参数并不止影响参数名上所表示的情况下的动画,例如设置了open也会导致close有匹配的动画。

自定义转场动画

  • 调用方法:用setCustomAnimations() 来调用
  • 转场场景:这里需要单独列出的原因是因为fragment在添加时可以指定加入到某一个back stack中,因此转场场景出了一般的添加和移除外,还有进入back stack中和从back stack中push出来这两种场景,因此共四种转场场景,而这和setCustomAnimations()的传入参数是息息相关的。(需要back stack的原因:当用户按下activity地返回键时,存在于back stack中得transactions将被pop出来,并阻止activity结束自己,当back stack中已经没有transaction时,activity才回结束自己。)
  • 注意点:setCustomAnimations()需要在add、remove、replace前调用,否则无效。

然后我们需要根据自己的app所需的兼容程度决定是否要使用google提供的v4包和使用其对应的转场动画形式,如果不使用,则Fragment及其动画只能用于API Level 11以上的android系统。

android.app.Fragment

  • 动画类型:Property Animation
  • 资源文件:需要放置于res\animator\目录下,且根节点为:<set/><objectAnimator/><valueAnimator/>之一
  • 自定义动画:setCustomAnimations,这个方法共有两个多态形式
    • setCustomAnimations(int enter,inter exit),该方法在API Level 11以上都得到了支持,但是只能用于fragment的add、remove、replace,不能用于back stack的进入和pop出来的动画。
    • setCustomAnimations(int enter,int exit,int popenter,int popout),该方法在API Level 13以上得到支持,功能更强大,前两个参数是fragment的进入和退出,后两个参数用于从back stack的进入和退出。
  • 注意点: A:back stack 是对transaction存储的堆栈
    B:setCutomAnimations(int enter,int exit,int popenter,int popout)的后两个参数都是pop操作,一个是pop到屏幕上,另一个是pop出屏幕,而不是进入back stack和出back stack,而添加入back stack 的动作addToBackStack(String name)是在add或者replace fragment的时候就完成了的。

android.support.v4.app.Fragment

  • 动画类型:View Animation
  • 资源文件:需要放置于res\anim\目录下,根节点与Acitivity的xml文件一致,是<alpha><scale><translate><rotate>interpolator element,或者是set之一
  • 方法:同android.app.Fragment,但没有API Level的限制
←支付宝← →微信 →
comments powered by Disqus