Home
Freeman edited this page Dec 26, 2018
·
8 revisions
- 图片加载库的二次封装;
- 相册功能
- 从相册/相机选择照片并裁剪;
- 图片压缩;
- 上传图片到服务器;
对Fresco, ImageLoader, Glide进行了统一的封装,只需要一行代码即可实现快速替换。
// 使用Fresco作为默认的图片库
ImageLoaderManager.getInstance().init(getApplicationContext(), new FrescoInstance());
// 使用Universal ImageLoader作为默认图片库
ImageLoaderManager.getInstance().init(getApplicationContext(), new UILInstance());
// 使用Glide作为默认图片库
ImageLoaderManager.getInstance().init(getApplicationContext(), new GlideInstance());
类似朋友圈选择照片,只需要简单的配置即可实现选择多张照片的功能:
PhotoPicker picker = new PhotoPicker.Builder()
.setMaxPhotoCount(9)
.setSelectedPhotos(selectedPhotos)
.builder();
picker.chooseImage(context, new OnSelectPhotoListener() {
@Override
public void onSelected(ArrayList<String> selectedPhotoList) {
// 展示选择的图片
}
});
相册页面展示如下:
同时提供了丰富的接口,以便开发者自定义需要的样式,为了验证这些接口的扩展性,实现了一个仿微信的图片选择组件,界面显示如下:
说明: 对于页面样式,每个APP都有特定的风格,所以对图片选择器中的每个页面提供了自定义布局样式的接口,上面的仿微信图片选择器就是使用这些接口实现的,与前面的图片选择器共用了一套逻辑。
这可能是APP不可或缺的一个小功能,不过其中也存在许多兼容性的问题,为了便于使用,将其封装成了一个简单的类,通过简单的几行代码即可实现更换头像的操作。
// 拍照并裁剪(第二个参数表示是否需要裁剪)
ChoosePhotoManager.getInstance().takePicture(context, true);
// 从相册选择照片并裁剪(第二个参数表示是否需要裁剪)
ChoosePhotoManager.getInstance().choosePhotoFromAlbum(context, true);
// 监听选择图片的每个步骤(拍照/选择图片,裁剪)
ChoosePhotoManager.getInstance().setChoosePhotoListener(new OnSimpleChoosePhotoListener() {
@Override
public void cropPhoto(Uri uri) {
if (uri != null) {
filePath = uri.getPath();
imageView.setImageURI(uri);
}
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 将onActivityResult中返回的结果交给ChoosePhotoManager处理
ChoosePhotoManager.getInstance().onActivityResult(this, requestCode, data);
}
为了更好的用户体验,减小服务器的存储压力,在上传图片之前通常需要适当的压缩,这里采用Luban库,通过简单的调用即可实现图片压缩。
UploadUtils.compressImage(context, filePath, listener)
上传图片通常有2种方式:
- 直接上传到图床,获取图片URL后将URL提交给内部服务器;
- 先上传到内部服务器,由内部服务器上传到图床,然后将图片的URL发送给客户端;
这里对这两种上传方式都提供了支持,对于上传到内部服务器,直接使用了HttpURLConnection实现(为了减少对其他开源库的依赖):
// 默认开启了图片压缩
UploadUtils.uploadToInnerServer(context, serverAddress, filePath, listener)
对于图床,这里选择了七牛云,直接使用它的SDK中提供的方式实现上传功能:
UploadUtils.uploadToQiNiu(context, token, filePath, listener)