说一下触发场景,最近公司产品说了一个常见的功能,就是查看大图,本来这功能做了好几遍了,几乎每入职一家公司都会有这个需求。觉得很简单,不就是用一下photoview嘛。后来在实现中也没什么问题,直到有一天,自己看线上环境,有用户发了那种超长超长图片(最少最少一屏半高),然后发现图片宽度不能撑满屏幕,并且还会把长图压缩到一屏幕。看着就难受。截个图看下效果:
看完这张图,这根本不是我要的效果啊!巨丑,然后我就去看了新浪微博,长图显示规则,别人是从头开始,X轴撑满,Y轴长度跟随图片。这效果才是我想要的,于是我就直接用了github上长图框架subsampling-scale-image-view项目地址:subsampling-scale-image-view(不得不用啊!就我现在技术,写出来也是各种OOM,这种超长大图最容易OOM了。(╯▽╰)好吧!我承认我写不出来)然后很顺利加载出来了,看下效果(也可以参考微博查看长图):
一切都很完美,如果是这样的话那就好了,坏就坏在一般查看大图点击事件上,我们长按图片会从底部弹出保存按钮,点击图片会返回。用subsampling-scale-image-view的时候,我直接加上长按监听,一切感觉也没什么问题。但是但是,我发现我在快速点击这个图片打开图片关闭图片,就会莫名其妙触发长按监听。然后我就去看源码,长按监听是这么写的:
果然是快速点击,就可能存在出发的可能。于是我本想在图片当前的fragment销毁的时候让handler回收一下message。可是一想,别人在up的时候已经回收了。我在销毁回收又有什么用。于是乎幸好看到作者有提供图片是否加载完成的回调。
这两个方法,作者的意思是一般用onReady就可以,onImageLoaded()图像就绪时调用,只显示预览,否则大多数情况下{@link #onReady()}是最好的要听的事件。所以在长按的监听内,先判断下图片是否加载出。
这样增加一层,目前我自己测试是可以避免由于快速点击触发onLongClick的。最后附上其中的一些API。
API | 参数 | |
setMinimumScaleType | SCALE_TYPE_START | 缩放图像,使图像的两个维度都等于或大于视图的相应维度。左上方显示 |
SCALE_TYPE_CUSTOM | 缩放图像,使图像的两个维度都等于或小于maxScale,并等于或大于minScale。然后图像在视图中居中 | |
SCALE_TYPE_CENTER_CROP | 均匀地缩放图像,使图像的两个维度都等于或大于视图的相应维度。然后图像在视图中居中。 | |
SCALE_TYPE_CENTER_INSIDE | 缩放图像,使图像的两个维度都等于或小于视图的相应维度。然后图像在视图中居中。这是默认的行为,对画廊来说是最好的。 | |
setMinScale | float | 最小显示比例 |
setMaxScale | float | 最大显示比例 |
还有其他的API我没用到,暂时先这样。