Android 共享元素 return 过渡到上一个 activity
Android shared element return transition to previous activity
我有 3 个活动:ActivityA
--> ActivityB
--> ActivityC
.
我有一个从 ActivityA
到 ActivityB
的共享元素过渡,一个缩略图会变成 ActivityB
的背景。如果我在 ActivityB
中点击 "back",则会调用 return 共享元素转换:背景视图缩小回其在 ActivityA
中的缩略图位置。
如果我没有点击 "back",ActivityB
加载一些数据,导航到 ActivityC
并完成。
ActivityC
的观点与 ActivityA
和 ActivityB
的观点相同(transitionName
也一样)。当我从 ActivityC
中点击 "back" 时,我希望调用 return 共享元素转换的方式与从 [=17= 中点击 "back" 时调用的方式相同] 到 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);
}
活动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));
ActivityC
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
的缩略图视图保存在某个静态变量中。然后,当导航到 ActivityC
时,我以与在 navigateToActivityB
中相同的方式使用此视图生成了 options
参数,在这种情况下,return 转换有效。但这不是一个可行的解决方案,因为以这种方式保存视图非常糟糕(但我没有其他方法在活动之间传递视图),而且因为它导致了一些奇怪的伪像(缩略图在 ActivityB
).
setSharedElementReturnTransition
Sets the Transition that will be used for shared elements transferred back to a calling Activity.
到此你完成了调用activityActivityB
。这意味着它不会返回调用 activity。所以Transition不显示。
您可能想使用 setSharedElementExitTransition。
我有 3 个活动:ActivityA
--> ActivityB
--> ActivityC
.
我有一个从 ActivityA
到 ActivityB
的共享元素过渡,一个缩略图会变成 ActivityB
的背景。如果我在 ActivityB
中点击 "back",则会调用 return 共享元素转换:背景视图缩小回其在 ActivityA
中的缩略图位置。
如果我没有点击 "back",ActivityB
加载一些数据,导航到 ActivityC
并完成。
ActivityC
的观点与 ActivityA
和 ActivityB
的观点相同(transitionName
也一样)。当我从 ActivityC
中点击 "back" 时,我希望调用 return 共享元素转换的方式与从 [=17= 中点击 "back" 时调用的方式相同] 到 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);
}
活动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));
ActivityC
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
的缩略图视图保存在某个静态变量中。然后,当导航到 ActivityC
时,我以与在 navigateToActivityB
中相同的方式使用此视图生成了 options
参数,在这种情况下,return 转换有效。但这不是一个可行的解决方案,因为以这种方式保存视图非常糟糕(但我没有其他方法在活动之间传递视图),而且因为它导致了一些奇怪的伪像(缩略图在 ActivityB
).
setSharedElementReturnTransition
Sets the Transition that will be used for shared elements transferred back to a calling Activity.
到此你完成了调用activityActivityB
。这意味着它不会返回调用 activity。所以Transition不显示。
您可能想使用 setSharedElementExitTransition。