轻量级图片选择框架,多选,拍照,支持剪裁,自定义图片加载android
图片选择框架其实已有许多优秀成熟的框架,好比知乎开源的 Matisse,遵循Google提倡的MaterialDesign ,感兴趣的朋友能够查看看下这篇文章,对Matisse的使用有一个粗略的认识。git
既然已经有了这么优化的框架为啥还要重复造轮子呢,估计不少读者都有这样的疑问,对于这个问题我想说如下几点。github
咱们去使用一个开源库,可能咱们只须要当中的某一块功能,有一部分的功能其实咱们是不须要的,可是由于某一个功能而去集成一个库,总感受怪怪的。数组
使用一个开源库,那么对于这个库的的依赖性就比较强,若是做者中止维护,后期新增的需求该框架知足不了,若是引入的是源码,那还能够修改做者的源码,可是前期是得很是了解该框架的总体设计,逻辑等等。bash
我的认为以上两点其实都不是最重要的,我以为最重要的是能够去学习这些优秀框架的设计思想,代码的健壮性,各类骚操做等等,能够增加本身的知识面,能够从中学习成长很多。app
整个框架的入口为PictureSelector,使用方法以下:框架
//图片选择所有功能
PictureSelector.with(this)
.selectSpec() //图片选择属性配置
.setImageLoader(new GlideImageLoader()) //图片加载方案,默认提供了GlideImageLoader
.setSpanCount(3) //图片一行显示几张图片
.setOpenCamera() //开启系统拍照功能
.needCrop() //是不是否须要剪裁
.setOutputX(200) //设置图片剪裁的大小
.setOutputY(200) //设置图片剪裁的大小
.setAuthority("org.lym.picture.selector.fileprovider") //适配Android7.0系统拍照
.setMaxSelectImage(single ? 1 : 9) //设置图片多选
.startForResult(IMAGES_CODE); //开启图片选择
//单选图片
PictureSelector
.with(this)
.selectSpec()
.startForResult(IMAGES_CODE);
//单选图片并开启剪裁并设置图片剪裁的大小
PictureSelector
.with(this)
.selectSpec()
.needCrop()
.setOutputX(200)
.setOutputY(200)
.startForResult(IMAGES_CODE);
//单选图片并开启相册拍照
PictureSelector
.with(this)
.selectSpec()
.setOpenCamera()
//开启拍照功能必定得设置该属性,为了兼容Android7.0相机拍照问题
//在manifest文件中也须要注册该provider
.setAuthority("org.lym.picture.selector.fileprovider")
.startForResult(IMAGES_CODE);
//图片多选
PictureSelector.with(this)
.selectSpec()
.setOpenCamera()
.setMaxSelectImage(3)
.startForResult(IMAGES_CODE);
复制代码
<!-- 兼容android7.0 需配置xml文件路径,可将该框架中的xml拷贝至你的项目下配置便可 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/external_path"/>
</provider>
复制代码
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMAGES_CODE && resultCode == Activity.RESULT_OK) {
if (null != data) {
//图片单选和多选数据都是以ArrayList的字符串数组返回的。
List<String> paths = PictureSelector.obtainPathResult(data);
mResultAdapter.setNewData(paths);
}
}
}
复制代码
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
复制代码
<!-- 兼容android7.0 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/external_path"/>
</provider>
复制代码
建议你们以源码的形式导入到你的项目中,这样你能够只提取你须要的功能,剔除对你无用的功能,也方便你的扩展,固然,你也能够在GitHub上提issues,(提了我也不改),哈哈,开个玩笑,只要提了我都会尽我能力去解决的,欢迎你们start,fork。ide