在Fragment中的ViewPager中,ImageView共享元素的退出过渡不起作用。

9

在我的应用程序中,我有一个Activity启动另一个包含图片ViewPager的Fragment的Activity。目前,我已经实现了进入转换,当第一个Activity启动第二个Activity时,过渡是正确的。这个工作是因为,在我的ViewPager中,我放置了一个OnPreDrawListener,仅当pager中的图像加载完毕时才恢复activity的转换。代码如下:

public class ImagePagerAdapter extends PagerAdapter {
  // Constructor and other things..

  @Override
  public Object instantiateItem(ViewGroup container, final int position) {
    ImageView imageView;
    if (position == 0) {
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        // Shared element is the first one.
        ViewCompat.setTransitionName(imageView, "sharedImage");
      }
    }
    imageView = new ImageView(activity);

    // Just a reusable static Helper class.
    HelperPicasso.loadImage(images.get(position), imageView, false, new Callback() {
      @Override
      public void onSuccess() {
        imageView.getViewTreeObserver()
          .addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
              imageView.getViewTreeObserver()
                .removeOnPreDrawListener(this);
              // When the ImageView is ready to be drawn, we can continue our activity/fragment's postponed transition animation.
              // Why? Because we want have the first image be the shared element, and we can only set it after instantiation.
              ActivityCompat.startPostponedEnterTransition(activity);
              return true;
            }
          });
      }

      @Override
      public void onError() {
        ActivityCompat.startPostponedEnterTransition(activity);
      }
    });    
  }
}

除了ImageView,我还有一个FrameLayout,它也是一个共享元素,但我在片段的onCreateView中用它的过渡名称标记它。
这样,进入转换对我很有效。然而,当我按返回按钮时,FrameLayout的退出转换正常工作,但ViewPager图像变空白。
我的猜测是片段的生命周期导致ViewPager(及其子视图)在退出转换期间被销毁。
我尝试在父活动的onBackPressed回调中添加ActivityCompat.finishAfterTransition(this),但似乎没有任何影响。

好的...您遇到了一个非常复杂的问题,即如何正确恢复从可回收视图启动的退出转换。如何操作的指南请参考: https://android.jlelse.eu/dynamic-shared-element-transition-23428f62a2af - R. Zagórski
这不是一个选择的设计。ImageViewPager只是屏幕的一部分。我也不认为这是一个过于复杂的设计,例如想象一个带有图片ViewPager和下方TextView等的电子商务应用程序。 - jonalmeida
你能分享一下你的Activity和Fragment类吗? - Abdul Wahab
这篇文章应该会对你有所帮助:https://android-developers.googleblog.com/2018/02/continuous-shared-element-transitions.html - goodev
1个回答

0

当你在进行ViewPager的过渡中时,你需要做一些额外的工作才能实现流畅和“美观”的过渡效果。你必须使用postponeTransition() 和 startPostponedTransition() 来控制只有在片段或图片完成加载后才播放转换效果。(看起来你已经在这样做了)。我建议你查看以下博客:共享元素过渡 - 第4部分:RecyclerView

该文章的目标更多是RecyclerView + ViewAdapter + 片段过渡,但我相信你可以将其适应到你的场景中。希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接