【问题标题】:Exit transition does not work for an ImageView Shared Element in a ViewPager in a Fragment退出过渡不适用于片段中 ViewPager 中的 ImageView 共享元素
【发布时间】:2018-02-26 16:10:45
【问题描述】:

在我的应用程序中,我有一个 Activity 启动另一个带有 Fragment 的 Activity,其中包含一个 ViewPager 图像。我目前所做的是进入转换,第一个活动启动第二个并且转换是正确的。这是因为,在我的 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(及其子视图)在退出转换期间被销毁。

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

【问题讨论】:

  • 嗯...您遇到了一个非常复杂的问题,即正确恢复从可回收视图开始的退出转换。操作指南:android.jlelse.eu/…
  • 这不是一个选择的设计。 ImageViewPager 只是屏幕的一部分。我也不认为这是一个过于复杂的设计,即想象一个电子商务应用程序,其 ViewPager 图像和 TextViews 等如下。
  • 你能分享你的活动和片段类吗?
  • android-developers.googleblog.com/2018/02/… 这应该对你有帮助。

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


【解决方案1】:

当您在转换中间有一个 ViewPager 时,您必须做一些额外的工作才能获得流畅且“漂亮”的转换。为了仅在片段或图像完成加载时播放过渡,您必须使用推迟转换()和开始延迟转换()。 (看来您已经在这样做了)。推荐你看下一篇博客:Shared Element Transitions - Part 4: RecyclerView

那篇文章的目标是更多的 RecyclerView + ViewAdapter + Fragments 过渡,但我相信你可以在你的场景中调整它。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多