之前的图片浏览器一直都是压缩过的bitmap,在显示一些长图、高清原图的时候就杯具了,全是马赛克,后来需求来了,只好借助第三方库,功夫不负有心人,找到一个不错的库,功能也齐全,效果也好,现在就推荐给大家。
该库的名字:SubsamplingScaleImageView(subsampling-scale-image-view)
GitHub:https://github.com/davemorrissey/subsampling-scale-image-view
下面我们来简单的说说怎么使用。
首先我们需要在 build.gradle 里面加入依赖:
dependencies {
?...?
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.6.0'?
...
}
(之前用的时候导入的版本是 3.5.0, 后来换了 3.6.0,图片处理显示的速度有了明显的提升,所以强烈推荐 3.6.0)
接着在布局 XML 里面跟普通的 imageview 一样去使用:
跟 imageview 不同的是在代码中的操作,先说图片的加载显示:
该库有一个类,ImageSource,调出方法,可以看到有以下几种:
ImageSource.asset(String assetName)
ImageSource.resource(int resId)
ImageSource.uri(String uri)
ImageSource.uri(Uri uri)
ImageSource.bitmap(Bitmap bitmap)
看方法名字不难理解,第一个是取 asset 目录里面的图片,第二个是取 drawable 目录里面的,第三个是通过文件路径取,第四个是通过 Uri,最后一个则是直接显示bitmap。
这里我们需要注意最后一个,官方给出这样的提示:
Or, if you have a Bitmap object in memory, load it into the view. This is unsuitable for large images because it bypasses subsampling - you may get an OutOfMemoryError.
大概意思就是说如果你通过 bitmap 的形式去加载显示图片,那么你得处理 OOM ,因为这种形式会绕过该库本身对图片的处理,所以如果我们要显示高清大图,那么请不要用最后一种。
接下来我们要把这个 ImageSource 传给 view ,下面贴出以第三种通过文件路径方式的代码:
SubsamplingScaleImageView photoView = (SubsamplingScaleImageView) view.findViewById(R.id.iv_pic);
photoView.setImage(ImageSource.uri(fileString));
很简单,这样就可以显示高清大图,同时也默认会开启缩放功能了。
这时有人问了,要是加载超过该库所能承受范围的图片呢,会不会崩掉?其实该库有对应的 OOM catch操作,超过其范围不能显示的图片只会造成图片不显示,不会造成崩溃,所以不需要再自己写 try catch 去捕获 OOM。
当然,如果你不想要缩放功能,那也可以通过 photoView.setZoomEnabled(boolean zoomEnabled) 去开启或关闭缩放功能。
接下来再说说部分可能会经常用到的其它接口:
1、回收
该库提供了回收的方法,调用也很简单:photoView.recycle()
当然也要注意,部分情况是不适合回收的,比如第二种取 drawable 目录里面的图片。对于图片浏览器模块,如果图片浏览器是可以左右滑动切换图片的话那么建议进行回收处理,至于怎么判断是不是适合回收的情况可以通过像 photoView.setContentDescription(String description) 等方法去打上标识,然后回收的时候再根据这个标识去判断是否要进行回收。
2、旋转角度
直接调用:
photoView.setOrientation(int orientation)
参数分别有:
ORIENTATION_USE_EXIF: Attempt to use the file's EXIF data to automatically rotate it. Supported for files only, not assets or resources.(根据文件的EXIF,只适用于文件)
ORIENTATION_0: Display image in its native orientation. (原始的方向)
ORIENTATION_90: Rotate the image 90° clockwise. (顺时针 90 度)
ORIENTATION_180: Rotate the image 180°.(顺时针 180 度)
ORIENTATION_270: Rotate the image 270° clockwise.(顺时针 270 度)
当然还有很多其它的接口,比如图片偏移、缩放的相关设置等,这里就不一一列举,这个得看个人需求去设置了。
【【Android】显示高清大图,可缩放类库 - SubsamplingScaleImageView(可用于做图片浏览器)使用说明】另外再补充一点,该库不支持 GIF,所以如果图片浏览器要同时再处理 GIF 的话那么建议再留出一个 imageview 单独进行处理(可以利用像 Glide 之类的库)。