android - 使用 ViewPager + Glide + PhotoView 恢复分页时的缩放/平移矩阵
问题描述
我的用例是让 ViewPager 显示一系列 PhotoView 实例,其中分页图像应保持缩放和平移的最后状态。
PhotoView 实例由 PagerAdapter 创建
public View instantiateItem(ViewGroup viewGroup, int position) {
PhotoView photoView = new PhotoView(viewGroup.getContext());
viewGroup.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
Glide.with(viewGroup.getContext())//
.load(getImageUri(position))
.into(photoView);
return photoView;
}
我将“OnMatrixChangedListener”附加到 PhotoView 并存储 PhotoViewAttacher#mSuppMatrix。
我遇到的问题是找到适用于存储的 mSuppMatrix 的合适时机。
- 无论 ViewGroup 状态如何,ViewPager#onPageSelected 都会触发,即。PhotoView 可能仍在绘制,或者 Glide 甚至可能仍在加载
- Glide#RequestListener (onResourceReady) 在 Drawable 准备好时触发,但显然在运行 PhotoView#setImageDrawable 之前
- 即使在调用 super.setImageDrawable 之后覆盖 PhotoView#setImageDrawable 并应用 mSuppMatrix 也为时过早,因为稍后调用 layout() 会导致 PhotoViewAttacher 运行 reset(),从而使 mSuppMatrix 无效
因此,给定一个包含缩放/平移信息的目标“mSuppMatrix”,并使用 ViewPager + PhotoView + Glide 的组合,应用 mSuppMatrix 的最佳侦听器/事件处理程序是什么?
解决方案
我还没有找到一个表明我正在寻找的状态的事件。相反,我正在使用以下组合:
- Glide RequestListener#onResourceReady()
- View.OnLayoutChangeListener#onLayoutChange()
这样在 Glide 资源准备好后对 onLayoutChange() 的第一次调用就是触发的。
推荐阅读
- java - How do we measure the total time taken to complete a flow across two different java applications?
- ipython - 氢将“-f”传递给 ArgumentParser
- c# - ASP.NET MVC C# - 使用 URL ACTION 传递动态参数
- java - 如何在 ElasticSearch 中使用相同类型或索引的连接,如 solr
- html - 加载时无法在移动浏览器上播放音频
- hybris - Hybris 商店创建
- django - 无法连接到 amqp://guest:**@127.0.0.1:5672//: [Errno 111] 连接被拒绝
- sql-server - 如何在 MSSQL 中将 YYYY-MM-DD HH:MI:SS 格式转换为 MM-DD-YYYY HH:MI:SS
- ruby - 我怎样才能跳出双'if'块?
- php - 雄辩的关系没有输出