Android 共享元素返回过渡到上一个 Activity

标签 android transition android-transitions

我有 3 个 Activity :ActivityA --> ActivityB --> ActivityC

我有一个从 ActivityAActivityB 的共享元素转换,一个缩略图逐渐成为 ActivityB 的背景。如果我在 ActivityB 中点击“后退”,返回共享元素转换被调用:背景 View 收缩回其在 ActivityA 中的缩略图位置。

如果我不点击“返回”,ActivityB 加载一些数据,导航到 ActivityC 并完成。

ActivityC 的 View 与 ActivityAActivityB 之间共享的 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).

最佳答案

作为documentation

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/

相关文章:

android - fragment 上的 constraintLayout 关键帧动画

android - 将 pdf 附加到电子邮件,授予权限

android - 如何从数据数组(或其他形式)自动创建和填充 android 中的 sqlite 数据库

java - Android ListView 和复选框问题

objective-c - iOS 核心动画加速

javascript - 新创建的元素javascript的过渡

android - 动画 Activity 变化为循环显示

android - 如何在 Android 布局中将 View 定位在屏幕外

android - 谷歌云消息 : duplicate token in database

jquery - 哈希导航;使用 CSS3 动画转换或禁用 CSS3 标签导航并使用 jQuery。但是怎么办?