这个类的作用是让两个页面之间转跳附带动画
Activity之间转跳和Fragment之间转跳不太一样
Fragment转跳Activity和Activity之间转跳是一样的
这里主要讲Fragment转跳Activity的方法和细节
首先在Fragment中添加容器变换的开始控件
实现点击事件
card_.setOnClickListener(this::toActivity);
转跳方法
Intent intent = new Intent(getContext(), TimeTableAcivity.class);
ActivityOptions options =
ActivityOptions.makeSceneTransitionAnimation(getActivity(), sharedElement, "shared_element_end_root");
startActivity(intent, options.toBundle());
}
接着在要转跳的Activity中的Window中请求功能
而且必须在添加内容之前调用哦
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
findViewById(android.R.id.content).setTransitionName("shared_element_end_root");
setEnterSharedElementCallback(new MaterialContainerTransformSharedElementCallback());
getWindow().setSharedElementEnterTransition(buildContainerTransform(true));
getWindow().setSharedElementReturnTransition(buildContainerTransform(false));
super.onCreate(savedInstanceState);
}
private MaterialContainerTransform buildContainerTransform(boolean entering) {
MaterialContainerTransform transform = new MaterialContainerTransform(this, entering);
transform.setAllContainerColors(
MaterialColors.getColor(findViewById(android.R.id.content), R.attr.colorSurface));
transform.addTarget(android.R.id.content);
//设置动画持续时间(毫秒)
transform.setDuration(666);
return transform;
}
最后在fragment的Activity的window也要请求功能,否则从Activity返回后,开始容器的控件会闪烁
在fragment的Activity加上即可
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
setExitSharedElementCallback(new MaterialContainerTransformSharedElementCallback());
getWindow().setSharedElementsUseOverlay(false);
super.onCreate(savedInstanceState);