团队博客
Android 选择图片、上传图片之PictureSelector(测试版)
PictureSelector.create(MainActivity.this) .openGallery()//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio() .theme()//主题样式(不设置为默认样式) 也可参考demo values/styles下 例如:R.style.picture.white.style .maxSelectNum()// 最大图片选择数量 int .minSelectNum()// 最小选择数量 int .imageSpanCount(4)// 每行显示个数 int .selectionMode()// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE .previewImage()// 是否可预览图片 true or false .previewVideo()// 是否可预览视频 true or false .enablePreviewAudio() // 是否可播放音频 true or false .isCamera()// 是否显示拍照按钮 true or false .imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg .isZoomAnim(true)// 图片列表点击 缩放效果 默认true .sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效 .setOutputCameraPath("/CustomPath")// 自定义拍照保存路径,可不填 .enableCrop()// 是否裁剪 true or false .compress()// 是否压缩 true or false .glideOverride()// int glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度 .withAspectRatio()// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定义 .hideBottomControls()// 是否显示uCrop工具栏,默认不显示 true or false .isGif()// 是否显示gif图片 true or false .compressSavePath(getPath())//压缩图片保存地址 .freeStyleCropEnabled()// 裁剪框是否可拖拽 true or false .circleDimmedLayer()// 是否圆形裁剪 true or false .showCropFrame()// 是否显示裁剪矩形边框 圆形裁剪时建议设为false true or false .showCropGrid()// 是否显示裁剪矩形网格 圆形裁剪时建议设为false true or false .openClickSound()// 是否开启点击声音 true or false .selectionMedia()// 是否传入已选图片 List<LocalMedia> list .previewEggs()// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false .cropCompressQuality()// 裁剪压缩质量 默认90 int .minimumCompressSize(100)// 小于100kb的图片不压缩 .synOrAsy(true)//同步true或异步false 压缩 默认同步 .cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效 int .rotateEnabled() // 裁剪是否可旋转图片 true or false .scaleEnabled()// 裁剪是否可放大缩小图片 true or false .videoQuality()// 视频录制质量 0 or 1 int .videoMaxSecond(15)// 显示多少秒以内的视频or音频也可适用 int .videoMinSecond(10)// 显示多少秒以内的视频or音频也可适用 int .recordVideoSecond()//视频秒数录制 默认60s int .isDragFrame(false)// 是否可拖动裁剪框(固定) .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
private void initWidget() { FullyGridLayoutManager manager = new FullyGridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(manager); adapter = new GridImageAdapter(this, onAddPicClickListener); adapter.setList(selectList); adapter.setSelectMax(maxSelectNum); mRecyclerView.setAdapter(adapter); adapter.setOnItemClickListener(new GridImageAdapter.OnItemClickListener() { @Override public void onItemClick(int position, View v) { if (selectList.size() > 0) { LocalMedia media = selectList.get(position); String pictureType = media.getPictureType(); int mediaType = PictureMimeType.pictureToVideo(pictureType); switch (mediaType) { case 1: // 预览图片 可自定长按保存路径 //PictureSelector.create(MainActivity.this).externalPicturePreview(position, "/custom_file", selectList); PictureSelector.create(MainActivity.this).externalPicturePreview(position, selectList); break; case 2: // 预览视频 PictureSelector.create(MainActivity.this).externalPictureVideo(media.getPath()); break; case 3: // 预览音频 PictureSelector.create(MainActivity.this).externalPictureAudio(media.getPath()); break; } } } }); }
private void showPop() { View bottomView = View.inflate(MainActivity.this, R.layout.layout_bottom_dialog, null); TextView mAlbum = bottomView.findViewById(R.id.tv_album); TextView mCamera = bottomView.findViewById(R.id.tv_camera); TextView mCancel = bottomView.findViewById(R.id.tv_cancel); pop = new PopupWindow(bottomView, -1, -2); pop.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); pop.setOutsideTouchable(true); pop.setFocusable(true); WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.alpha = 0.5f; getWindow().setAttributes(lp); pop.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.alpha = 1f; getWindow().setAttributes(lp); } }); pop.setAnimationStyle(R.style.main_menu_photo_anim); pop.showAtLocation(getWindow().getDecorView(), Gravity.BOTTOM, 0, 0); View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View view) { switch (view.getId()) { case R.id.tv_album: //相册 PictureSelector.create(MainActivity.this) .openGallery(PictureMimeType.ofImage()) .maxSelectNum(maxSelectNum) .minSelectNum(1) .imageSpanCount(4) .selectionMode(PictureConfig.MULTIPLE) .forResult(PictureConfig.CHOOSE_REQUEST); break; case R.id.tv_camera: //拍照 PictureSelector.create(MainActivity.this) .openCamera(PictureMimeType.ofImage()) .forResult(PictureConfig.CHOOSE_REQUEST); break; case R.id.tv_cancel: //取消 //closePopupWindow(); break; } closePopupWindow(); } };
protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); List<LocalMedia> images; if (resultCode == RESULT_OK) { if (requestCode == PictureConfig.CHOOSE_REQUEST) {// 图片选择结果回调 images = PictureSelector.obtainMultipleResult(data); selectList.addAll(images); //selectList = PictureSelector.obtainMultipleResult(data); // 例如 LocalMedia 里面返回三种path // 1.media.getPath(); 为原图path // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true // 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的 adapter.setList(selectList); adapter.notifyDataSetChanged(); } } }