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

jon*_*ida 8 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);
      }
    });    
  }
}
Run Code Online (Sandbox Code Playgroud)

除了ImageView之外,我还有一个FrameLayout,它也是一个共享元素,但是我用它onCreateView在片段中的转换名称来标记它.

有了这个,输入过渡对我来说很有效.但是,当我按下后退按钮时,FrameLayout的退出转换正常工作,但ViewPager图像变为空白.

我的猜测是片段的生命周期导致ViewPager(及其子视图)在退出转换期间被销毁.

我已经尝试添加父Activity ActivityCompat.finishAfterTransition(this)onBackPressed回调,但似乎没有任何效果.

Pet*_*les 0

当 ViewPager 处于转换过程中时,您必须做一些额外的工作才能获得流畅且“美观”的转换。您必须使用推迟Transition() 和 startPostponedTransition() 以便仅在片段或图像完成加载时播放过渡。(看来你已经在这样做了)。我建议您查看下一篇博客:共享元素转换 - 第 4 部分:RecyclerView

\n\n

该文章的目标是更多 RecyclerView + ViewAdapter + Fragments 转换,但我\xc2\xb4m 确信你可以在你的场景中调整它。希望能帮助到你。

\n