iielse / imageviewer

A simple and customizable Android full-screen image viewer 一个简单且可自定义的Android全屏图像浏览器

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

默认图片退出过渡效果问题

victorfan336 opened this issue · comments

问题:我的界面时文章详情页,webview加载的图片不是Imageview,没有设置任何跟位置相关的代码。当图片查看时,点击图片退出时的效果,有时候时是放大后消失,有时候会直接就消失,没有动画效果,跟点击图片显示的过渡效果类似。

期望:
点击图片的退出效果稳定是一种,不要随机变化,保持图片显示的过渡效果和图片退出时的效果一致。

谢谢。

使用的Transformer是参照Demo来的:
class MyTransformer : Transformer {
override fun getView(key: Long): ImageView? = TransitionViewsRef.provideTransitionViewsRef(KEY_MAIN)[key]
}

最好是能自定义进入和退出的过渡效果吧,谢谢大佬

commented

你看下 我补充了一个功能 代码在 CustomTransitionHelper 。 需要开发者提供 photo.Id 对应图片执行transition动画所需要的 width/height/location/scaleType. 4类内容。
之前框架需要原图引用完成transition动画无非就是需要以上属性

commented

这个需要新增个版本 我自测没问题了, 稍后 会有 2.1.1

commented

1593679810421_7ADDD228-00F6-47EC-A86E-64FD66C854A7
运行demo后 功能就是下面按钮[customTransition]. 相关代码在这里

感谢提供新的方法,可以解决一些没有ImageView的地方的过渡动画问题。
但是,我这两天在接入的时候,还碰到了一个过渡动画获取到的imageView位置错乱的问题,导致退出时动画出现在了其他图片或者左上角或者右下脚的问题。

使用场景:RecyclerView A 嵌套RecyclerView B,RecyclerView B用于显示图片列表,RecyclerView A有多种样式,每种type里面都有RecyclerView B。

代码调用:
RecyclerView B中的adapter:
// 绑定数据
override fun onBindViewHolder(customViewHolder: RecyclerView.ViewHolder, i: Int) {
loadImage(mData[i].url)
mBinding.image.tag = mData[i]

}
// 点击事件
// 已封装
ImageBrowserHelper(mActivity as? FragmentActivity ?: return)
.provideListBuilder(list, position).show()

使用的是demo中的transformer,未修改:
class DefaultTransformer : Transformer {
override fun getView(key: Long): ImageView? = TransitionViewsRef.provideTransitionViewsRef(KEY_MAIN)[key]
}
TransitionViewsRef类代码也未修改

// 获取所有显示的imageview
override fun onViewAttachedToWindow(holder: RecyclerView.ViewHolder) {
super.onViewAttachedToWindow(holder)
val binding = (holder as MyViewHolder).binding as? LayoutMultImgItemBinding
(binding?.image?.tag as? ImageViewerBean)?.let {
TransitionViewsRef.provideTransitionViewsRef(TransitionViewsRef.KEY_MAIN).put(it.id, binding.image)
}
}

override fun onViewDetachedFromWindow(holder: RecyclerView.ViewHolder) {
    super.onViewDetachedFromWindow(holder)
    val binding = (holder as MyViewHolder).binding as? LayoutMultImgItemBinding
    (binding?.image?.tag as? ImageViewerBean)?.let {
        TransitionViewsRef.provideTransitionViewsRef(TransitionViewsRef.KEY_MAIN).remove(it.id)
    }
}

// BaseActivity和BaseFragment中的onDestroy()中清除
override fun onDestroy() {
super.onDestroy()
TransitionViewsRef.releaseTransitionViewRef(TransitionViewsRef.KEY_MAIN)
}

以上时主要代码。如果代码缺少无法理解我可以补上。

现象就是以上描述的问题。

开始我以为是由于RecyclerView A中的多个样式显示,而使用的是统一个Adapter B,导致获取imageView的时候获取到了Adapter A中其他type的imageView了。
我尝试过从RecyclerView B中的adaper传递一个key过去,用来在onViewAttachedToWindow和onViewDetachedFromWindow中使用,但是还是有问题,退出的动画效果还是异常。
如果不是RecyclerView嵌套RecyclerView,是单独RecyclerView显示图片,过渡效果正常。

可能是我自己没有理解大佬的代码,哪里写错了。
请大佬不吝赐教,谢谢。

commented

你的录屏我看了2,3遍 不是正确的吗

commented

Transformer 接口的职责就是根据当前viewer所展示的 photoId 对应的数据 拿到 过渡前原图的信息. 如果你这里的映射关系是正确的就没有问题. 我看了你的绑定代码 感觉看似没啥问题,【有问题的话就是出在这里,重点】put remove 时机不对. 你可以在 Transformer.getView 这里打端点, 看 photoId 对应的原图信息是否正确. 或者找任意地方打端点 检查 object TransitionViewsRef 里面那个 map 对象维护的view引用是否正确

commented

releaseTransitionViewRef(这里有个参数) 主要是规避多级页面同时使用这个viewer的。 你在base 里面写不对。且TransitionViewsRef.KEY_MAIN 可能有需要有很多key,

你的录屏我看了2,3遍 不是正确的吗

最后那个type的第一个和第二不正确

releaseTransitionViewRef(这里有个参数) 主要是规避多级页面同时使用这个viewer的。 你在base 里面写不对。且TransitionViewsRef.KEY_MAIN 可能有需要有很多key,

那应该在哪里处理呀?麻烦指点下。谢谢

RecyclerView A 嵌套RecyclerView B, RecylcerView A中还有多个type,本身就比较复杂,可以在demo中给个示例吗?麻烦大佬了。

commented

记录界面上绑定photoId展示对应内容的ImageView的引用. 在photoId对应展示的ImageView离开界面时刻移除引用. 根据时机找到对应的相关代码,准确的围绕这个点做就好了.

嗯嗯,多谢,找到思路了,试了下也不会错位了。只是由于我们有个界面过于复杂,不能很好的release key,所有只能使用默认的动画过渡效果。只能后期代码重构了后再加上了。

RecyclerView A 嵌套RecyclerView B,RecyclerView B用于显示图片列表 动画错误怎么解决?能不能给个demo ,对kotiln不熟,万分感激