Skip to content
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)