提问者:小点点

MaterialContainerTransform中的壁画图像视图未显示


我有一个activity-a(回收视图)和activity-B(ViewPager),点击在回收视图材料的项目过渡到activity-B与项目在ViewPager。 降落在activity-B的壁画图像视图是不可见的。 这里的过渡很平滑,但是壁画图像视图是不可见的,如果我在viewPager中滑动页面,我可以看到图像

论activity 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)
}

onclick

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())

论activity 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
  }
}

共1个答案

匿名用户

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

这里的一个修复方法是监听共享元素end事件,并手动将图像的可见性设置为visible,如下所示:

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);
                    }
                }
            }
        });