android - 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
}
}
解决方案
这是共享元素转换的一个已知问题,无法正确设置 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);
}
}
}
});
推荐阅读
- node.js - 如何让 node.js lambda 函数写入 postgresql 并返回错误/响应?
- python - 如果列匹配,则合并数据框
- c# - 用 BouncyCastle 加密文件,只有 C# 中的公钥?
- smalltalk - 不理解基本符号'|'
- javascript - 如何使用 Javascript 刷新上传的文本文件
- walmart-api - 来自 WalmartLabs API 的零星 504 网关超时错误
- r - 如何使用 data.table 根据条件计算列总和?
- php - 如何获取用户的 IP,然后在缓存的 amp 表单上定位?
- jquery - Fullcalendar 资源未在版本 4 中显示
- python - 将 VBA 转换为 Python - 文件结构问题