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
protectedvoid 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
*/
publicstatic Bitmap revitionImageSize(String path)throws IOException {
if (path ==null) {
returnnull;
}
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地址新聞熱點
疑難解答