退出转换不适用于片段中ViewPager中的ImageView共享元素

时间:2018-02-26 16:10:45

标签: android android-viewpager shared-element-transition

在我的应用程序中,我有一个Activity启动另一个带有Fragment的Activity,其中包含一个ViewPager图像。我目前工作的是输入转换,其中第一个Activity启动第二个,转换是正确的。这是有效的,因为在我的ViewPager中我放了一个OnPreDrawListener,只在加载了寻呼机中的图像时才恢复活动转换。它看起来像这样:

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(及其子视图)在退出过渡期间被销毁。

我已经尝试在父级活动的ActivityCompat.finishAfterTransition(this)回调中添加onBackPressed,但它似乎没有任何效果。

1 个答案:

答案 0 :(得分:0)

当你在转换过程中有一个ViewPager时,你必须做一些额外的工作才能有一个流畅和“美丽”的过渡。您必须使用postponeTransition()和startPostponedTransition()才能在片段或图像完成加载时播放过渡。 (看来你已经在做了)。我建议您查看下一篇博客:Shared Element Transitions - Part 4: RecyclerView

该文章的目标是更多RecyclerView + ViewAdapter + Fragments转换,但我相信您可以在您的方案中对其进行调整。希望它有所帮助。