600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Android自定义图片选择器

Android自定义图片选择器

时间:2018-07-13 13:18:51

相关推荐

Android自定义图片选择器

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地址

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。