您需要使用唯一的 transitionName 标记您的两个视图。
ViewCompat.setTransitionName(imageView, "some_unique_transitionName");
使用这些新信息开始新活动
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, imageView, ViewCompat.getTransitionName(imageView));
activity.startActivity(intent, options.toBundle());
现在,关于新活动:
根据您打开下一个活动的方式以及它的视图层次结构的复杂程度,您可能希望在 onCreate 期间利用 supportPostponeEnterTransition(); 并在稍后设置时利用 supportStartPostponedEnterTransition();。我会让你阅读它的文档
除此之外,找到需要动画的新活动的视图并在其上设置过渡名称
activityImage.setTransitionName(transitionName);
让它撕裂。
您可能想要修改的其他一些东西可能是动画持续时间、插值器等。
getWindow().getSharedElementEnterTransition().setDuration(200);
getWindow().getSharedElementReturnTransition().setDuration(200)
.setInterpolator(new DecelerateInterpolator());
还有,你的活动的进入/退出转换(你需要这个)
Fade fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setEnterTransition(fade);
getWindow().setExitTransition(fade);
请记住,共享元素转换遍历整个视图层次结构以找出源视图和目标视图,并且只有在目标活动完全放置后,框架反向转换才能给您想要实现的错觉,所以是的,如果视图层次结构很复杂或活动需要时间来设置等(取决于网络),您可能需要多做一些修改。