我有 3 个 Activity :ActivityA
--> ActivityB
--> ActivityC
。
我有一个从 ActivityA
到 ActivityB
的共享元素转换,一个缩略图逐渐成为 ActivityB
的背景。如果我在 ActivityB
中点击“后退”,返回共享元素转换被调用:背景 View 收缩回其在 ActivityA
中的缩略图位置。
如果我不点击“返回”,ActivityB
加载一些数据,导航到 ActivityC
并完成。
ActivityC
的 View 与 ActivityA
和 ActivityB
之间共享的 View 相同(具有相同的 transitionName
也是)。当我从 ActivityC
中点击“返回”时,我希望返回共享元素转换的调用方式与从 ActivityB
中点击“返回”到ActivityA
- 背景缩小到 ActivityA
中的缩略图位置。
导航代码:
/* thumbnailView is the view in ActivityA that grows into ActivityB */
void navigateToActivityB(Activity activityA, View thumbnailView) {
// Build options
List<Pair<View, String>> pairs = new ArrayList<>();
pais.add(Pair.create(thumbnailView, "thumbnailTransition"));
Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(activityA, pairs.toArray(new Pair[pairs.size()])).toBundle();
// Navigate
Intent intent = new Intent(activityA, ActivityB.class);
ActivityCompat.startActivity(activityA, intent, options);
}
/**
* Here I don't have thumbnailView anymore (since it's in ActivityA
* and I'm coming from ActivityB, so I can't include it in the
* shared element pairs.
*/
void navigateToActivityC(Activity activityB) {
// Build options - I wish I could use the pairs but I don't know how
// List<Pair<View, String>> pairs = new ArrayList<>();
// pais.add(Pair.create(thumbnailView, "thumbnailTransition"));
Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(activityB).toBundle();
// Navigate
Intent intent = new Intent(activityB, ActivityC.class);
ActivityCompat.startActivity(activityB, intent, options);
}
Activity B
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TransitionInflater inflater = TransitionInflater.from(context);
getWindow().setSharedElementEnterTransition(inflater.inflateTransition(R.transition.shared_element_enter));
getWindow().setSharedElementReturnTransition(inflater.inflateTransition(R.transition.shared_element_return));
Activity C
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TransitionInflater inflater = TransitionInflater.from(context);
// This transition doesn't work :(
getWindow().setSharedElementReturnTransition(inflater.inflateTransition(R.transition.shared_element_return));
编辑:
值得一提的是,我做了一个测试,将 ActivityA
的缩略图 View 保存在某个静态变量中。然后当导航到 ActivityC
时,我用这个 View 生成了 options
参数,就像我在 navigateToActivityB
中做的一样,在这种情况下返回转换工作了。但这不是一个可行的解决方案,因为以这种方式保存 View 非常糟糕(但我没有其他方法在 Activity 之间传递 View ),并且因为它导致了一些奇怪的伪像(缩略图在 ActivityB
).
最佳答案
setSharedElementReturnTransition
Sets the Transition that will be used for shared elements transferred back to a calling Activity.
在这里,您完成了调用 Activity ActivityB
。这意味着它不会返回调用 Activity 。所以不显示Transition。
您可能想使用 setSharedElementExitTransition .
关于Android 共享元素返回过渡到上一个 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608929/