首页 > 解决方案 > MaterialContainerTransform 中的 Fresco 图像视图未显示

问题描述

我有一个 Activity-A (RecyclerView) 和 Activity-B (ViewPager),单击 RecyclerView 材料中的项目时,使用 ViewPager 中的项目过渡到 Activity-B。在登陆 Activity-B Fresco 图像视图时不可见。此处过渡顺利,但看不到freso图像视图,如果我在viewPager中滑动页面,我可以看到图像

在活动 A

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS)
        setExitSharedElementCallback(MaterialContainerTransformSharedElementCallback())
        window.sharedElementsUseOverlay = false
        setContentView(R.layout.activity_main)
}

点击

val intent = Intent(context, DetailActivity::class.java)
intent.putExtra(DetailActivity.ARG_POSITION, position)
intent.putExtra(DetailActivity.ARG_TAB, viewModel.selectedTabItem)
val options = ActivityOptions.makeSceneTransitionAnimation(activity,it,it.transitionName)
startActivity(intent, options.toBundle())

关于活动 B

override fun onCreate(savedInstanceState: Bundle?) {
  findViewById<View>(android.R.id.content).transitionName = "shared-container-$position"
  setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback())
  window.sharedElementEnterTransition = MaterialContainerTransform().apply {
      duration = 1000
  }
  window.sharedElementReturnTransition = MaterialContainerTransform().apply {
      duration = 1000
  }
}

标签: androidmaterial-designfresco

解决方案


这是共享元素转换的一个已知问题,无法正确设置 Fresco 用来决定图像是否在屏幕上的可见性(出于内存管理目的),请参阅https://github.com/facebook/fresco/问题/1445

这里的一种解决方法是监听共享元素结束事件并手动将图像的可见性设置为可见,如下所示:

ActivityCompat.setExitSharedElementCallback(this, new SharedElementCallback() {
            @Override
            public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
                super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots);
                if (FP.empty(sharedElements)) {
                    return;
                }
                for (View view : sharedElements) {
                    if (view instanceof SimpleDraweeView) {
                        ((SimpleDraweeView) view).getDrawable().setVisible(true, true);
                    }
                }
            }
        });

推荐阅读