Material Design 初步
1、Activity设置主题
android:theme="@style/AppTheme.main"
<style name="AppTheme.main" parent="android:Theme.Material.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
2、主题中设置过渡动画
<style name="AppTheme.Details" parent="android:Theme.Material.Light.NoActionBar">
<!-- 指定进入和退出transitions -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>
<item name="android:windowEnterTransition">@transition/details_window_enter_transition</item>
<item name="android:windowReturnTransition">@transition/details_window_return_transition</item>
</style>
3、编写动画文件
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="together"
android:duration="500">
<fade>
<targets>
<target android:excludeId="@android:id/statusBarBackground" />
<target android:excludeId="@android:id/navigationBarBackground" />
</targets>
</fade>
<slide android:slideEdge="top">
<targets>
<target android:targetId="@id/details_header_container" />
</targets>
</slide>
<slide android:slideEdge="bottom">
<targets>
<target android:targetId="@id/details_text_container" />
</targets>
</slide>
</transitionSet>
4、共享元素设置TransitionName
-
第一个Activity
ImageView mAlbumImage = (ImageView) itemView.findViewById(R.id.main_card_album_image);
mAlbumImage.setTransitionName("Pablo Honey");
-
第二个Activity
ImageView mAlbumImage = (ImageView) rootView.findViewById(R.id.details_album_image); mAlbumImage.setTransitionName("Pablo Honey");
也可使用标签设置
android:transitionName="shareName"
5、启动Activity
1、一个共享元素
startActivity(intent,
ActivityOptions.makeSceneTransitionAnimation(MainActivity.this,mAlbumImage,
mAlbumImage.getTransitionName()).toBundle());
2、多个共享元素
ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create(view1, "agreedName1"), Pair.create(view2, "agreedName2"));
6、 若要暂时延迟Transition的使用,等待共享元素加载和
第一个界面
在Activity 的onCreate()中调用postponeEnterTransition(),暂时阻止启动共享元素 Transition。
第二个界面
在共享元素准备好后调用 startPostponedEnterTransition来恢复过渡效果。
mAlbumImage.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mAlbumImage.getViewTreeObserver().removeOnPreDrawListener(this);
getActivity().startPostponedEnterTransition();
return true;
}
});
以延迟共享元素返回 Transition
@Override
public void onActivityReenter(int requestCode, Intent data) {
super.onActivityReenter(requestCode, data);
postponeEnterTransition();
mRecyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mRecyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
// TODO: figure out why it is necessary to request layout here in order to get a smooth transition.
mRecyclerView.requestLayout();
startPostponedEnterTransition();
return true;
}
});
}