关于SubsamplingScaleImageView实现微博查看超长图片快速点击图片会触发OnLongClick异常

       说一下触发场景,最近公司产品说了一个常见的功能,就是查看大图,本来这功能做了好几遍了,几乎每入职一家公司都会有这个需求。觉得很简单,不就是用一下photoview嘛。后来在实现中也没什么问题,直到有一天,自己看线上环境,有用户发了那种超长超长图片(最少最少一屏半高),然后发现图片宽度不能撑满屏幕,并且还会把长图压缩到一屏幕。看着就难受。截个图看下效果:

小米8显示效果
小米8显示效果

看完这张图,这根本不是我要的效果啊!巨丑,然后我就去看了新浪微博,长图显示规则,别人是从头开始,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我没用到,暂时先这样。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值