共享元素转换:embedded到另一个活动中的片段中的活动

我正在尝试添加共享元素转换到我的应用程序。

情景是,用户点击图像缩略图,而不是用全屏图像查看打开另一个活动。

如果共享视图直接托pipe在目标活动的布局中,这可以正常工作。 顺利进入/退出animation。 但是当我试图在嵌套在目标活动中的片段中实现类似的效果时,这种方法不起作用 。 有趣的是,inputanimation没有显示,但退出animation工作正常。

另一个更复杂的视图层次结构是,如果目标视图(ImageView)被托pipe在目标活动的框架布局中的视图寻呼机内。

有人有同样的问题吗?

编辑:我的点击侦听器代码

public class OnClickPicture extends OnClickBase { private ObjectPicture object; public OnClickPicture(Activity_Parent activity, ObjectPicture object) { super(activity); this.object = object; } public void onClick(View v) { picasso.load(object.getFullUrl()).fetch(); Intent intent = new Intent(activity, ActivityPicture.class); intent.putExtra("picture_object", helper.gson.toJson(object)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && v != null) { Pair<View, String> p1 = Pair.create(v, "image"); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, p1); activity.startActivity(intent, options.toBundle()); } else { activity.startActivity(intent); } } } 

Solutions Collecting From Web of "共享元素转换:embedded到另一个活动中的片段中的活动"

转换工作的方式要求在animation发生之前创build,测量和布置新的活动。 这样就可以find想要animation的视图并创build合适的animation。

在你的情况下,这不会发生,因为,如文档中所述 ,所有FragmentTransaction.commit()所做的是安排工作要完成。 这不会立即发生。 因此,当框架创build你的活动,它不能find你想要animation的视图。 这就是为什么你看不到一个条目animation,但你看到一个退出animation。 视图在那里,当你离开的活动。

解决scheme很简单。 首先你可以尝试FragmentManager.executePendingTransactions() 。 这还不够。 转换框架还有另一个解决scheme:

在Activity的onCreate中postponeEnterTransition() 。 这告诉框架要等到你告诉它它安全地创buildanimation。 这意味着你需要告诉它它的安全(通过调用startPostponedEnterTransition() )。 在你的情况下,可能会在碎片onCreateView。

下面是一个如何可能的例子:

活动B

 @Override protected void onCreate(Bundle savedInstanceState) { // etc postponeEnterTransition(); } 

片段B

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View sharedView = root.findViewById(R.id.shared_view); sharedview.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { sharedview.getViewTreeObserver().removeOnPreDrawListener(this); getActivity().startPostponedEnterTransition(); return true; } }); } 

感谢Alex Lockwood 关于Transitions框架的详细博客文章 。