我正在开发一个使用 Fragment 导航模式(一个 Activity 包含多个 Fragment)的 Android 应用。我按照这个指南成功实现了共享元素过渡效果,但是这只能够在前进时工作,返回时无法正常工作。
我的 Fragment(名为 UserFragment
)由一个带有 3 个包含 RecyclerView 的 Fragment 的 ViewPager 组成。单击 RecyclerView 中的任何项都会打开另一个具有相同视图的 UserFragment
。当切换到新的 Fragment 时,过渡效果完美地工作,但是当关闭它时,我无法让它正常工作。在点击后退按钮时,该 Fragment 会简单地淡出并且前一个 Fragment 淡入。
简短概括:
- 所涉及的共享元素是顶部的圆形图片视图
- 其
transitionName
是 profile SharedItemTransition
是一个扩展了TransitionSet
的自定义类- 我为每个 RecyclerView 中的每个项都设置了唯一的过渡名称,包括它们的用户 ID、列表类型和位置索引(如果它们不是唯一的,则前进时也无法工作)
这是我 RecyclerView Adapter 的 onBindViewHolder
方法:
public void onBindViewHolder(final UserViewHolder uvh, int position) {
final LocUser user = users.get(position);
String transition = "user_" + user.id() + "_type_" + type + "_item_" + position + "_profile_image";
uvh.name.setText(user.name());
uvh.username.setText(user.handle());
Global.setImage(uvh.userImage, user.profileImage());
ViewCompat.setTransitionName(uvh.userImage, transitionName(position));
uvh.root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activity.openUserProfile(user, uvh.userImage);
}
});
}
这是我的activity方法,它调用FragmentManager
并启动动画:public void openUserProfile(LocUser user, ImageView view) {
UserProfileFragment uf = UserProfileFragment.create(user);
uf.setExitTransition(new Fade());
uf.setEnterTransition(new Fade());
uf.setSharedElementEnterTransition(new SharedItemTransition());
uf.setSharedElementReturnTransition(new SharedItemTransition());
getSupportFragmentManager()
.beginTransaction()
.addSharedElement(view, "profile")
.replace(R.id.container, uf)
.addToBackStack(null)
.commit();
}
这是它的外观: