。..true前言所谓转场动画,通俗地说就是从一个Activity跳转到另一个Activity的动画;Activity的过渡动画很早就存在了,5.0之前就是用overridePendingTransition()这种方式。5.0之后,谷歌采用了MaterialDesign的设计风格,然后诞生了一种新的过渡动画。效果很酷;今天我们将解释它。一、转场动画兼容性1、API21之前的Activity转场动画使用API??21之前的Activity转场动画有两种实现方式:在样式主题中统一设置,使用代码overridePendingTransition函数单独设置;在theme的style文件中统一定义,并全局为所有Activity设置转场动画效果;Customer"parent="@android:style/Animation.Activity">@anim/right_in@anim/left_out@anim/left_in@anim/right_outcodeoverridePendingTransition(enterAnim,exitAnim);关于覆盖PendingTransition函数需要注意的一点是,它必须在startActivity()或finish()或onBackPressed()函数之后调用,否则可能无效;2.API21之后,Activity转场动画使用googleAPI21之后又引入了一个效果比之前更好的转场动画;Activity转场动画是通过ActivityOptions+Transition实现的;所以使用前需要进行版本判断当版本API大于21时使用过渡动画,否则不使用;//Checkifwe'rerunningonAndroid5.0orhigherif(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){//Applyactivitytransition}else{//Swapwithouttransition}ActivityOptions+Transition在实现Activity转场动画之前,我们先了解一下ActivityOptions中几个函数的含义;/***类似overridePendingTransition,设置跳转时的进入动画和退出动画*/publicstaticActivityOptionsmakeCustomAnimation(Contextcontext,interestResId,intexitResId);/***通过放大效果过渡要进入的Activity*举个简单的例子理解source=view,startX=view.getWidth(),startY=view.getHeight(),startWidth=0,startHeight=0*表示新的Activity从视图的中心开始缓慢放大*/publicstaticActivityOptionsmakeScaleUpAnimation(Viewsource,intstartX,intstartY,宽度,高度);/***通过放大一张图片过渡到一个新的Activity*/publicstaticActivityOptionsmakeThumbnailScaleUpAnimation(Viewsource,Bitmapthumbnail,intstartX,intstartY);/***场景动画,体现在两个Activity中的一些view来完成过渡动画效果,后面的例子可以更好的看到效果*/publicstaticActivityOptionsmakeSceneTransitionAnimation(Activityactivity,ViewsharedElement,StringsharedElementName);/***场景动画,同上,同时作用于多个View*/publicstaticActivityOptionsmakeSceneTransitionAnimation(Activityactivity,android.util.Pair...sharedElements);对于TransitionActivity转场动画的使用,我们简单的分为三步:告诉系统启动Transition形式的Activity,定义转场动画,设置转场动画3、转场动画的使用场景有Android中过渡动画的三种主要场景:两个activity之间切换时界面的过渡效果;两个活动或片段之间共享元素的切换效果;以下是详细介绍。二、转场动画的使用场景1、两个activity切换时界面的转场效果。在两个活动之间切换时,有两个动画。从ActivityA切换到ActivityB时,会有A和B的退出动画Google提供的android.transition.Transition包中有三种从ActivityA切换到ActivityB的方式:Explode、Slide和Fade;爆炸:从屏幕中间进入或退出;滑动:从屏幕的一侧向另一侧进入或退出;Fade:通过改变透明度出现或消失;以上三种动画有两种实现方式:①通过xml声明;在res目录下新建transition文件夹,在transition文件夹下新建activity_fade.xml文件;activity_fade.xmlactivity_slide.xmlActivityA代码如下:因为从ActivityA切换到ActivityB,ActivityA退出动画使用的方法是:getWindow().setExitTransition(slide);@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_transition);setupWindowAnimations();}privatevoidsetupWindowAnimations(){Slideslide=TransitionInflater.from(this).inflateTransition(R.transition.activity_slide);getWindow().setExitTransition(slide);}ActivityB是进入动画方法:getWindow().setEnterTransition(fade);,ActivityB的代码如下@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_transition);setupWindowAnimations();}privatevoidsetupWindowAnimations(){Fadefade=TransitionInflater.from(this).inflateTransitionR.transition.activity_fade);getWindow().setEnterTransition(fade);}②代码方法ActivityA代码如下:实现一个Slide对象,设置时间为1000毫秒@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_transition);setupWindowAnimations();}privatevoidsetupWindowAnimations(){Slideslide=newSlide();slide.setDuration(1000);getWindow().setExitTransition(slide);}ActivityB实现一个Fide对象,设置时间为1000毫秒;@OverrideprotectedvoidonCre吃(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_transition);setupWindowAnimations();}privatevoidsetupWindowAnimations(){Fadefade=newFade();fade.setDuration(1000);getWindow().setEnterTransition(fade);}2.两个activity或Fragments之间的共享元素切换效果共享元素转换决定了两个activity之间共享的view如何在这两个activity之间进行转换;如果两个Activity的位置和大小不同,对于同一张图片,通过Sharedelements的转换会平滑的在两个Activity之间转换缩放图片;从ActivityA跳转到ActivityB时,ActivityA和ActivityB中的两个item有动画变化,但要注意ActivityA和ActivityB中的item是两个独立的item;共享元素转换包括以下类型:changeBounds改变目标布局中视图的边界changeClipBounds裁剪目标布局中视图的边界changeTransform实现旋转或缩放动画changeImageTransform实现目标布局的旋转或缩放动画ImageView需要三个实现上述效果的步骤:①WindowContentTransition设置styles.xml文件,允许windowContentTransitions如下:value/style.xml。..true②在ActivityA和ActivityB的布局文件中分别定义一个相同的transitionname和定义item,这两个item的属性可以不同,但??是android:transitionName必须相同如下:activity_b.xml③在activity中启动共享元素使用ActivityOptions.makeSceneTransitionAnimation()方法ActivityA.javablueIconImageView.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Intenti=newIntent(MainActivity.this,SharedElementActivity.class);ViewsharedView=blueIconImageView;StringtransitionName=getString(R.string.blue_name);ActivityOptionstransitionActivityOptions=ActivityOptions.makeSceneTransitionAnimation(MainActivity.this,sharedView,transitionName);startActivity(i,transitionActivityOptions.toBundle());}});FragmenSharedelementsFragment和Activity之间Shared元素的使用过程类似,分为三步:①AllowwindowContentTransitions...true...②定义一个通用的transition名称layout/fragment_a.xmllayout/fragment_b.xml③使用FragmentTransactionFragmentBfragmentB=FragmentB.newInstance(sample);//定义entertransitionforallfragmentviewsSlideslideTransition=newSlide(Gravity.RIGHT);slideTransition.setDuration(1000);sharedElementFragment2.setEnterTransition(slideTransition);//DefinesentertransitiononlyforsharedelementChangeBoundschangeBoundsTransition=TransitionInflater.from(this).inflateTransition(R.transition.change_bounds);fragmentB.setSharedElementEnterTransition(changeBoundsTransition);getFragmentManager().beginTransaction().replace(R.id.content,fragmentB).addSharedElement(blueView,getString(R.string.blue_name)).commit();