图片选择,相信大佬们都不屑一顾了,一搜一大片,比如github上的前三甲:
1、GitHub - crazycodeboy/TakePhoto: 一款用于在Android设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库
2、GitHub - LuckSiege/PictureSelector: Picture Selector Library for Android or 多图片选择器
3、【项目中使用过】GitHub - jeasonlzy/ImagePicker: 完全仿微信的图片选择,并且提供了多种图片加载接口,选择图片后可以旋转,可以裁剪成矩形或圆形,可以配置各种其他的参数
视频选择,10s视频录制(涉及视频裁剪,压缩),网上的资料相对较少,找到了一个相对跟微信差不多的轮子,如下(star 仅有19):
GitHub - yangyong915/AlbumSelectionManager: 一个功能完善的相册库,包含选择图片、视频;拍摄图片、视频;裁剪压缩、多选等内容,参考项目PictureSelector,整体实现上类似微信朋友圈相册
在此非常感谢该作者,在此基础上,将代码整理了一下,跟大家分享,也希望大佬们能够在此基础上封装出更牛B的轮子(__) 嘻嘻!!
项目目录结构如下:
用法如下:【效果截图见最后】
1、引入moudle :picctureAndVideoSelector
2、在需要使用的页面中调用即可,代码如下:
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)// 主题样式设置 具体参考 libray中values/styles
.maxSelectNum(9)// 最大图片选择数量
.minSelectNum(1)// 最小选择数量
.imageSpanCount(4)// 每行显示个数
.selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE : PictureConfig.SINGLE
.previewImage(true)// 是否可预览图片
.previewVideo(true)// 是否可预览视频
.enablePreviewAudio(false)// 是否预览音频
// .compressGrade(Luban.THIRD_GEAR)// luban压缩档次,默认3档 Luban.FIRST_GEAR、Luban.CUSTOM_GEAR
.isCamera(true)// 是否显示拍照按钮
.isZoomAnim(true)// 图片列表点击 缩放效果 默认true
.setOutputCameraPath(Constant.IMAGE_CACHE)// 自定义拍照保存路径
.compress(true)// 是否压缩
.compressMode(PictureConfig.LUBAN_COMPRESS_MODE)//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE
// //.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
.glideOverride(160,160)// glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度
.isGif(false)// 是否显示gif图片
.openClickSound(false)// 是否开启点击声音
// .selectionMedia(selectList)// 是否传入已选图片
// //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
// .compressGrade(Luban.CUSTOM_GEAR)
.compressGrade(Luban.CUSTOM_GEAR)
.compressMaxKB(1024)//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
.minimumCompressSize(500)//add by tanhaiqin, 图片大小 <= 500KB(数字可变) 不需要压缩
// //.compressWH() // 压缩宽高比 compressGrade()为Luban.CUSTOM_GEAR有效
// //.videoQuality()// 视频录制质量 0 or 1
.videoSecond(5 *60)//显示多少秒以内的视频
// //.recordVideoSecond()//录制视频秒数 默认60秒
.forResult(PictureConfig.CHOOSE_REQUEST);
}
/**
* 处理 PictureSelectorActivity.java 返回的数据
* 注意 图片压缩 已经是在picture lib中处理, 界面仅仅是展示获取的LocalMedia数据,不做再次压缩!
*
* @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:
// 图片选择,共用一个数据通道:返回时图片,可能为列表,视频只能有一个
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;
}
}
}
效果图如下:
源代码 戳一下~
欢迎大家来交流,d(゚∀゚d)点赞!