1.前言
随着APP功能的全面化,越来越多的应用都开发了类似微信朋友圈的功能,随时随地分享自己的心情,图片视频!当需要上传图片、视频的时候,就需要一个图片、视频资源选择器,所以接下来将自己实现一个简单的图片选择器。
2.实现思路
①通过contentResolver获取手机中的图片、视频文件,也可以直接拍摄,这个时候不会重新获取手机里的资源(既然把拍的都删除了,还查询出来干嘛)。
②定义一个全局集合,用来存放选中的图片和视频,并用一个变量来表示是视频还是图片。
③将查询出来的图片全部显示的时候,需要防止内存溢出,这是用来一个网上的优化工具类,挺好用的。
④当选择好图片的时候,只需要在Activity显示出选择的集合就可以了。
⑤自定义ImageView实现图片放大缩小,以及解决与Viewpager的滑动冲突
3.效果图
详细的功能实现看下面的效果图片,本来想上传gif图的,但是限制只能上传2M,所以上传不了,这里就截图表示一下,具体的实现效果gif图和源代码将在git中展示。
4.功能代码
①contentResolver获取手机资源代码。
/**
* 获取手机中的所有图片
*/
public ArrayList<SelectFileBean> getAllImage() {
if (imagelist !=null)
return imagelist;
imagelist = new ArrayList<>();
String[] project = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA};
Cursor query = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, project,null,null,null);
if (query.moveToFirst()) {
int dataColumn = query.getColumnIndex(MediaStore.Images.Media.DATA);
do {
SelectFileBean bean = new SelectFileBean();
bean.setFile_path(query.getString(dataColumn));
bean.setImage(true);
imagelist.add(bean);
} while (query.moveToNext());
}
return imagelist;
}
/**
* 获取手机中所有的视频
*
* @return
*/
public ArrayList<SelectFileBean> getAllVedio() {
if (videolist !=null)
return videolist;
videolist = new ArrayList<>();
String[] project = new String[]{MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA};
Cursor cs = cr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, project,null,null,null);
if (cs.moveToFirst()) {
int dataColum = cs.getColumnIndex(MediaStore.Video.Media.DATA);
do {
SelectFileBean bean = new SelectFileBean();
bean.setFile_path(cs.getString(dataColum));
bean.setImage(false);
videolist.add(bean);
} while (cs.moveToNext());
}
return videolist;
}
②在图片预览界面,自定义RelativeLayout,是图片显示正方形
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//设置自己测量的结果
setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), getDefaultSize(0, heightMeasureSpec));
//测量子view
int measuredWidth = getMeasuredWidth();
widthMeasureSpec = MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY);
heightMeasureSpec = widthMeasureSpec;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
③将指定路径的图片转换成bitmap
/**
* 将文件路径的图片转换成bitmap
*
* @param path
* @return
* @throws IOException
*/
public static Bitmap revitionImageSize(String path) throws IOException {
if (path == null) {
return null;
}
BufferedInputStream in = new BufferedInputStream(new FileInputStream(
new File(path)));
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, options);
in.close();
int i = 0;
Bitmap bitmap = null;
while (true) {
if ((options.outWidth >> i <= 1000)
&& (options.outHeight >> i <= 1000)) {
in = new BufferedInputStream(
new FileInputStream(new File(path)));
options.inSampleSize = (int) Math.pow(2.0D, i);
options.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeStream(in, null, options);
break;
}
i += 1;
}
return bitmap;
}
④自定义ImageView实现放大缩小,以及解决滑动冲突的代码由于比较多,这里就不贴出来,可以移步到github中查看
5.项目源码: github地址