圖片選擇浸锨,相信大佬們都不屑一顧了澡为,一搜一大片驾荣,比如github上的前三甲:
1撑柔、GitHub - crazycodeboy/TakePhoto: 一款用于在Android設(shè)備上獲取照片(拍照或從相冊(cè)鲜结、文件中選擇)展运、裁剪圖片、壓縮圖片的開源工具庫
2精刷、GitHub - LuckSiege/PictureSelector: Picture Selector Library for Android or 多圖片選擇器
3拗胜、【項(xiàng)目中使用過】GitHub - jeasonlzy/ImagePicker: 完全仿微信的圖片選擇,并且提供了多種圖片加載接口怒允,選擇圖片后可以旋轉(zhuǎn)埂软,可以裁剪成矩形或圓形,可以配置各種其他的參數(shù)
視頻選擇纫事,10s視頻錄制(涉及視頻裁剪勘畔,壓縮),網(wǎng)上的資料相對(duì)較少丽惶,找到了一個(gè)相對(duì)跟微信差不多的輪子炫七,如下(star 僅有19):
在此非常感謝該作者伍绳,在此基礎(chǔ)上,將代碼整理了一下乍桂,跟大家分享冲杀,也希望大佬們能夠在此基礎(chǔ)上封裝出更牛B的輪子(__) 嘻嘻!睹酌!
項(xiàng)目目錄結(jié)構(gòu)如下:
項(xiàng)目目錄結(jié)構(gòu).png
用法如下:【效果截圖見最后】
1权谁、引入moudle :picctureAndVideoSelector
2、在需要使用的頁面中調(diào)用即可憋沿,代碼如下:
public class MainActivity extends AppCompatActivity {
private Buttonpicture;
private Buttonvideo;
private LinearLayoutresult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
picture=findViewById(R.id.picture);
video=findViewById(R.id.video);
result=findViewById(R.id.result);
picture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initPictureSelector(PictureMimeType.ofImage());
}
});
video.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initPictureSelector(PictureMimeType.ofVideo());
}
});
}
public void initPictureSelector(int chooseMode) {
PictureSelector.create(this)
.openGallery(chooseMode)// 全部.PictureMimeType.ofAll()旺芽、圖片.ofImage()、視頻.ofVideo()
.theme(R.style.picture_default_style)// 主題樣式設(shè)置 具體參考 libray中values/styles
.maxSelectNum(9)// 最大圖片選擇數(shù)量
.minSelectNum(1)// 最小選擇數(shù)量
.imageSpanCount(4)// 每行顯示個(gè)數(shù)
.selectionMode(PictureConfig.MULTIPLE)// 多選 or 單選 PictureConfig.MULTIPLE : PictureConfig.SINGLE
.previewImage(true)// 是否可預(yù)覽圖片
.previewVideo(true)// 是否可預(yù)覽視頻
.enablePreviewAudio(false)// 是否預(yù)覽音頻
// .compressGrade(Luban.THIRD_GEAR)// luban壓縮檔次,默認(rèn)3檔 Luban.FIRST_GEAR采章、Luban.CUSTOM_GEAR
.isCamera(true)// 是否顯示拍照按鈕
.isZoomAnim(true)// 圖片列表點(diǎn)擊 縮放效果 默認(rèn)true
.setOutputCameraPath(Constant.IMAGE_CACHE)// 自定義拍照保存路徑
.compress(true)// 是否壓縮
.compressMode(PictureConfig.LUBAN_COMPRESS_MODE)//系統(tǒng)自帶 or 魯班壓縮 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE
// //.sizeMultiplier(0.5f)// glide 加載圖片大小 0~1之間 如設(shè)置 .glideOverride()無效
.glideOverride(160,160)// glide 加載寬高运嗜,越小圖片列表越流暢,但會(huì)影響列表圖片瀏覽的清晰度
.isGif(false)// 是否顯示gif圖片
.openClickSound(false)// 是否開啟點(diǎn)擊聲音
// .selectionMedia(selectList)// 是否傳入已選圖片
// //.previewEggs(false)// 預(yù)覽圖片時(shí) 是否增強(qiáng)左右滑動(dòng)圖片體驗(yàn)(圖片滑動(dòng)一半即可看到上一張是否選中)
// .compressGrade(Luban.CUSTOM_GEAR)
.compressGrade(Luban.CUSTOM_GEAR)
.compressMaxKB(1024)//壓縮最大值kb compressGrade()為L(zhǎng)uban.CUSTOM_GEAR有效
.minimumCompressSize(500)//add by tanhaiqin, 圖片大小 <= 500KB(數(shù)字可變) 不需要壓縮
// //.compressWH() // 壓縮寬高比 compressGrade()為L(zhǎng)uban.CUSTOM_GEAR有效
// //.videoQuality()// 視頻錄制質(zhì)量 0 or 1
.videoSecond(5 *60)//顯示多少秒以內(nèi)的視頻
// //.recordVideoSecond()//錄制視頻秒數(shù) 默認(rèn)60秒
.forResult(PictureConfig.CHOOSE_REQUEST);
}
/**
* 處理 PictureSelectorActivity.java 返回的數(shù)據(jù)
* 注意 圖片壓縮 已經(jīng)是在picture lib中處理悯舟, 界面僅僅是展示獲取的LocalMedia數(shù)據(jù)担租,不做再次壓縮!
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode,int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode ==RESULT_OK) {
switch (requestCode) {
case PictureConfig.CHOOSE_REQUEST:
// 圖片選擇,共用一個(gè)數(shù)據(jù)通道:返回時(shí)圖片抵怎,可能為列表奋救,視頻只能有一個(gè)
List selectList = PictureSelector.obtainMultipleResult(data);
DebugUtil.i("TEST===> selectList.size = " + selectList.size());
for (int i =0; i < selectList.size(); i++) {
handleLocalMedia(selectList.get(i));
}
break;
}
}
}
private void handleLocalMedia(LocalMedia media) {
int pictureType = PictureMimeType.isPictureType(media.getPictureType());
switch (pictureType) {
case PictureConfig.TYPE_IMAGE:
DebugUtil.i("TEST===> media path = " + media.getPath()
+", compressPath = " + media.getCompressPath()
+", height = " + media.getHeight()
+", width = " + media.getWidth());
TextView textView =new TextView(this);
textView.setText(" media path =" + media.getPath());
result.addView(textView);
break;
case PictureConfig.TYPE_VIDEO:
if (TextUtils.isEmpty(media.getPath()))return;
if (!FileUtil.fileIsExists(media.getPath())) {
DebugUtil.e("文件可能不存在了~");
return;
}
DebugUtil.e("TEST===> video path = " + media.getPath()
+", compressPath = " + media.getCompressPath()
+", height = " + media.getHeight()
+", width = " + media.getWidth());
TextView textView1 =new TextView(this);
textView1.setText(" video path =" + media.getPath());
result.addView(textView1);
break;
}
}
}
效果圖如下:
分類選擇.jpg
拍攝10s小視頻.png
拍照.jpg
拍照完成.jpg
相冊(cè).jpg
視頻選擇.jpg
源代碼 戳一下~
歡迎大家來交流,d(???d)點(diǎn)贊!