图片选择器是Android开发中会经常用到的一个功能,特别对于社交类的应用,比如头像设置,比如发图片。自然ImagePicker的轮子很多,今天介绍一个功能强大的轮子SImagePicker https://github.com/martin90s/ImagePicker 介绍首先功能强大之处
废话不说,先看效果 第一张头像模式,第二张选择多张图片(包括动画和顺畅的跳转),第三张是分片加载超大图(19.5M,10000*5000px)
头像模式,支持裁剪
多选图片,流畅的页面跳转
超大图预览,可以看到渐变加载 如何使用1.首先初始化(推荐在Application的oncreate中调用)SImagePicker.init(new PickerConfig.Builder().setAppContext(this)
.setImageLoader(new FrescoImageLoader())
.setToolbaseColor(getColor(R.color.colorPrimary))
.build());
2.在需要选择图片的地方调用SImagePicker
.from(MainActivity.this)
.maxCount(9)
.rowCount(3)
.pickMode(SImagePicker.MODE_IMAGE)
.fileInterceptor(new SingleFileLimitInterceptor())
.forResult(REQUEST_CODE_IMAGE);
可配置项1.全局配置(即初始化时传入的PickerConfig,此配置作用于SImagePicker整个使用过程)
2.单次配置(即每次调用SImagePicker时传入的参数,此参数只对这次调用生效)
获取结果在调用图片选择器的Fragment或者Activity中 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_IMAGE) {
final ArrayList<String> pathList =
data.getStringArrayListExtra(PhotoPickerActivity.EXTRA_RESULT_SELECTION);
final boolean original =
data.getBooleanExtra(PhotoPickerActivity.EXTRA_RESULT_ORIGINAL, false);
}
}
实现图片数据库读取CursorLoader Android3.0中引入了加载器/装载器(Loader)的功能,主要用于异步的方式加载数据库。装载器Loader的特点:
此项目也是使用loader去加载和监控图片数据,对于Photo和Album即图片和相册分别有一个loader和一个controller,loader主要用于加载对应的数据,controller主要用于数据读取到后的刷新已经loader的释放。 源码中的对应
PhotoLoader初始化 public static CursorLoader newInstance(Context context, Album album, long minSize) {
if (album == null || album.isAll()) {
return new PhotoLoader(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PROJECTION,
SELECTION_SIZE, new String[] {minSize + ""}, ORDER_BY);
}
return new PhotoLoader(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PROJECTION,
MediaStore.Images.Media.BUCKET_ID + " = ? and (" + SELECTION_SIZE + ")", new String[] {
album.getId(), minSize + ""}, ORDER_BY);
}
超大图片加载对于超大的图片如何展示,这个是个比较棘手的问题 比如这张图 http://7xpb9x.com1.z0.glb.clouddn.com/2017/01/20/b578e4755a32ac56a9c4b9a1f7e2822d.jpg 10000*5000的像素,接近20M。 这种图片肯定无法一次全部load到内存中,可以稍微计算一下即使是RGB_565的方式全部load进内存也要占用几乎90M的内存,显然是不太可能。可以回头看一下第三张demo gif,显然用户打开一张图时,在默认情况下,并不要求能看到细节,当用户点击某区域放大时此时才会需要这一块的清晰图。那么如何展示这种超大图的思路基本基本就是
在SImagePicker项目中主要是用了subsamplingImageView 并且根据picker的需求做了些修改,来实现超大图的预览 图片列表展示展示由于使用了cursorLoader,对于ListView的话有CursorAdapter可以使用,但是对于RecyclerView确没有对应的Adapter,所以在源码中可以看到实现了一个RecycleCursorAdapter,用于实现从cursor获取数据已经自动刷新。 兼容为了能够兼容多个图片加载器,SImagePicker抽象了一个ImageLoader接口用于让使用者自定义对应的图片加载器。 使用建议SImagePicker提供了jitpack上的依赖库,可以很快的接入业务中,但是由于大部分的APP对于ImagePicker的使用都有各种业务需求,且SImagePicker只是抽象出了比较通用的一些配置,用于让使用者能快速集成,所以此处还是建议使用者尽可能源码引用的方式的使用SImagePicker,既方便做一些调试,也可以很快的了解实现原理,说起来这种UI组件代码应该是很好读的,因为本身并不复杂。 | ||||||||||||||||||||||||||||||
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|