我有一个Activity-A(RecyclerView)和Activity-B(ViewPager),在RecyclerView材质上单击该项目,然后在ViewPager中将该项目转换为Activity-B。在活动B上着陆时,壁画图像视图不可见。在这里,过渡过程顺利进行,但无法看到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)
}
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())
关于活动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
这里的一个解决方法是监听共享元素的结束事件,并手动将图像的可见性设置为可见,如下所示:
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);
}
}
}
});