我有一个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
}
}
这是共享元素转换中的一个已知问题,共享元素转换没有正确设置可见度,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);
}
}
}
});