【抛转引玉】仿微信朋友圈选择图片及视频的轮子

图片选择,相信大佬们都不屑一顾了,一搜一大片,比如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的轮子(__) 嘻嘻!!
项目目录结构如下:

项目目录结构.png

用法如下:【效果截图见最后】

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;

}

}

}

效果图如下:


分类选择.jpg
拍摄10s小视频.png
拍照.jpg
拍照完成.jpg
相册.jpg
视频选择.jpg

源代码 戳一下~

欢迎大家来交流,d(゚∀゚d)点赞!

你可能感兴趣的:(【抛转引玉】仿微信朋友圈选择图片及视频的轮子)