Android的Activity/Fragment切换有两种方式
不带共享元素:Content Transition
带共享元素的:Shared Element Transition
刚刚整理了一下Content Transition,记录一下自己的所得
要实现Content Transition分为下面几步
·在style.xml添加
<item name="android:windowActivityTransitions">true</item>
PS.我试了试,在最新的Android Studio3.0里不加也可以.
·页面切换
Bundle bundle= ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity).toBundle();
Intent intent=new Intent(Context context,Class class);
startActivity(intent,bundle);
·切换效果
可以通过XML和代码,两种方式实现。不过在此之前要先介绍一下一个重要概念
从活动A打开活动B
活动A退出 exitTransition
活动B进入 enterTransition
从活动B回到活动A
活动B退出 returnTransition
活动A进入 reenterTransition
I.XML
在style.xml里设置
<item name="android:windowExitTransition"></item>
<item name="android:windowEnterTransition"></item>
<item name="android:windowReturnTransition"></item>
<item name="android:windowReenterTransition"></item>
例如:
<item name="android:windowExitTransition">@transition/exit</item>
res/transition/exit.xml
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<slide
android:duration="2000"
android:slideEdge="top">
<targets>
<target
android:targetId="@+id/btn"/>
</targets>
</slide>
</transitionSet>
II.代码
getWindow().setExitTransition();//写在活动A
getWindow().setEnterTransition();//活动B
getWindow().setReturnTransition();//活动B
getWindow().setReenterTransition();//活动A
例如:
Slide slide=new Slide();
slide.setSlideEdge(Gravity.BOTTOM);
slide.addTarget(R.id.btn);
getWindow().setExitTransition(slide);
补充:
在进行页面切换的时候,切换的速度过快,导致切换效果无法完全显示
这时候,只要在style.xml加上下面的东西就行了
<item name="android:windowAllowEnterTransitionOverlap">false</item>
<item name="android:windowAllowReturnTransitionOverlap">false</item>
但是我发现,这样会使reenterTransition的动画效果无法显示,
而这时候只要删除
<item name="android:windowAllowReturnTransitionOverlap">false</item>
就可以了