在App开发过程中,图片选择是一个非常常见的功能。但是,开发者自己去写图片选择功能需要考虑的东西非常多,比如相册和相机的适配问题、权限问题等等。而使用第三方库就可以大大减少开发者的工作量。本文介绍一款Android图片选择器,它可以帮助开发者快速集成图片选择功能。
一、背景介绍
在开发App的时候,图片选择功能是经常被使用的。过去,我们可能需要自己写图片选择功能,这个过程中要考虑的问题很多,比如相册和相机适配、权限管理等等问题。而现在,随着第三方库的不断涌现,我们完全可以使用一个成熟的、高质量的第三方库来实现这一功能,这样我们就可以更专注于业务逻辑的实现,而不必关心底层问题。
万能的Google Play上有很多相关的库供我们使用,如Picasso,Glide等等。但是,当我们需要选择图片时,这些库并不能帮助我们快速的完成这一功能。所以,我们需要使用一款专门的图片选择器库来帮助我们快速的实现选择图片的功能。这个库应该符合以下条件:
- 易于集成。
- 支持多种图片来源(如相册、相机)。
- 能够设置参数,以满足各种需求(如图片的数量、大小等)。
- 提供了良好的UI交互体验。
- 有一定的用户量,经过了时间的考验和验证。
好在市面上有很多这样的图片选择器。在此,我们重点介绍一款名为ImagePicker的图片选择器。
二、ImagePicker介绍
ImagePicker是一款简单易用、功能丰富的图片选择器库。它支持从相册、相机等多种图片来源选择图片,并且提供了一系列的参数设置,如图片的数量限制、大小限制等等。同时,它还提供了良好的UI交互体验,支持多选模式、预览模式、大图预览、裁剪等功能。另外,ImagePicker也有一定的用户量,可以放心使用。
ImagePicker使用起来非常简单。我们可以使用Gradle进行集成:
dependencies { compile 'com.lzy.widget:imagepicker:1.0.0' }
使用ImagePicker的时候,我们只需关心以下几个类:
- ImagePicker:表示图片选择器类,负责管理ImageLoader、Locale、UIConfig等类的实例。
- ImageLoader:表示图片加载器,负责根据图片URL加载图片。
- Locale:表示语言,负责提供一些默认字符串。
- UIConfig:表示UI配置,负责提供一些UI的相关配置。
- ImageItem:表示选中的图片项,里面包含了图片的各种信息。
- ImageFolder:表示图片文件夹,里面包含了该文件夹下的所有图片项。
ImagePicker的使用过程如下:
- 初始化ImagePicker实例。
- 设置ImageLoader实例。
- 设置Locale实例。
- 设置UIConfig实例。
- 调用ImagePicker的start方法,打开相册或相机进行图片选择。
- 在ImagePicker的回调中,获取选中的图片项。
三、使用ImagePicker实现图片选择
1. 初始化ImagePicker
在使用ImagePicker之前,我们需要先初始化一个ImagePicker实例:
ImagePicker imagePicker = ImagePicker.getInstance(); imagePicker.setImageLoader(new GlideImageLoader()); // 设置图片加载器 imagePicker.setMultiMode(true); // 设置为多选模式 imagePicker.setShowCamera(true); // 显示拍照按钮 imagePicker.setSelectLimit(9); // 最多选择9张图片 imagePicker.setCrop(true); // 允许裁剪图片 imagePicker.setFocusWidth(800); // 宽度不超过800 imagePicker.setFocusHeight(800); // 高度不超过800 imagePicker.setOutPutX(1024); // 保存图片的宽度为1024 imagePicker.setOutPutY(1024); // 保存图片的高度为1024
在这里,我们设置了9个参数:
- ImageLoader实例:我们使用GlideImageLoader作为图片加载器,它可以帮助我们快速加载图片。
- MultiMode:表示是否为多选模式。
- ShowCamera:表示是否显示拍照按钮。
- SelectLimit:表示最多选择的图片数量。
- Crop:表示是否允许裁剪图片。
- FocusWidth:表示裁剪框的宽度。
- FocusHeight:表示裁剪框的高度。
- OutPutX:表示保存图片的宽度。
- OutPutY:表示保存图片的高度。
2. 打开相册或相机进行图片选择
当我们点击选择图片按钮后,我们需要调用ImagePicker的start方法,打开相册或相机进行图片选择:
ImagePicker.getInstance().start(this, REQUEST_CODE_SELECT);
这里,我们设置了两个参数:
- Context:表示当前上下文。
- RequestCode:表示调用相册或相机后的返回值。
3. 获取选中的图片项
当我们从相册或相机中选择完图片后,我们需要在ImagePicker的回调中获取选中的图片项:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { // 判断是从相册还是相机返回 if (requestCode == ImagePicker.REQUEST_CODE_PICK) { // 获取选中的图片项 ArrayListimageItems = (ArrayList ) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS); // 将选中的图片项展示出来 // ... } else if (requestCode == ImagePicker.REQUEST_CODE_TAKE) { // 获取拍照后的图片路径 String imagePath = imagePicker.getTakeImageFile().getAbsolutePath(); // 将拍照后的图片展示出来 // ... } } }
在这里,我们可以通过判断RequestCode的值,来确定是从相册中选择图片返回,还是从相机中拍摄图片返回。如果是从相册中选择图片返回,我们可以通过data获取选中的图片项,如果是从相机中返回,则可以从ImagePicker实例中获取拍照后的图片路径。
四、ImagePicker的UI定制
ImagePicker提供了多种UI定制的选项,可以通过设置UIConfig实例来定制UI。UIConfig提供了多种UI主题和样式,如标题栏、底部栏、图片格子、拍照按钮等。我们可以根据自己的需求,选择一个合适的UI主题和样式,并设置到UIConfig实例中。下面是一个简单的UI定制示例:
UIConfig uiConfig = new UIConfig(); uiConfig.setThemeColor(Color.parseColor("#16A5AF")); // 设置主题颜色为蓝色 uiConfig.setTitleBarTextColor(Color.WHITE); // 设置标题栏文字颜色为白色 uiConfig.setNavigationBarColor(Color.parseColor("#222222")); // 设置底部栏背景色为黑色 uiConfig.setNavigationBarTextColor(Color.WHITE); // 设置底部栏文字颜色为白色 uiConfig.setGridItemBackgroundColor(Color.WHITE); // 设置图片格子的背景色为白色 uiConfig.setCheckedBoxDrawable(R.drawable.btn_checkbox); // 设置选中图片项的图片 ImagePicker.getInstance().setUIConfig(uiConfig); // 将UIConfig设置到ImagePicker实例中
在这里,我们设置了6种UI样式,分别是:
- ThemeColor:设置主题颜色为蓝色。
- TitleBarTextColor:设置标题栏文字颜色为白色。
- NavigationBarColor:设置底部栏背景色为黑色。
- NavigationBarTextColor:设置底部栏文字颜色为白色。
- GridItemBackgroundColor:设置图片格子的背景色为白色。
- CheckedBoxDrawable:设置选中图片项的图片。
五、总结
ImagePicker是一款功能强大、易于集成的图片选择器库。它支持多种图片来源、具有优秀的UI交互体验,同时还可以对UI进行定制。我们只需在项目中引入ImagePicker库,就可以轻松地实现图片选择功能,并在业务逻辑上专注于完成更有价值的任务。