我正在尝试将共享元素转换添加到我的应用中。
情景是用户点击图片缩略图,而不是使用全屏图片视图打开其他活动。
如果共享视图直接托管在目标活动的布局中,则此方法可以正常工作。适用于进入/退出动画。 但是,当我试图在目标活动中嵌套 嵌套中实现类似效果时,此方法不起作用。有趣的是,没有显示输入动画,但退出动画工作正常。
另一个更复杂的视图层次结构是,如果目标视图(ImageView)托管在目标活动的框架布局中托管的视图寻呼机中。
有人有同样的问题吗?
编辑: 我的点击监听器代码
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);
}
}
}
答案 0 :(得分:32)
转换工作的方式需要在任何动画发生之前创建,测量和布置新的Activity。这样它就可以找到你想要动画的视图并创建适当的动画。
在你的情况下,这不会发生,因为,stated in the docs,所有FragmentTransaction.commit()所做的都是安排工作。它不会立即发生。因此,当框架创建您的Activity时,它无法找到您想要设置动画的视图。这就是为什么你没有看到一个条目动画,但你确实看到一个退出动画。当你离开活动时,视图就在那里。
解决方案很简单。首先,您可以尝试FragmentManager.executePendingTransactions()。这仍然可能还不够。转换框架有另一个解决方案:
在onCreate of Activity postponeEnterTransition()中。这告诉框架要等到你告诉它创建动画是安全的。这确实意味着你需要在某个时候告诉它安全(通过调用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的detailed blog posts about the Transitions framework。