基本信息
源码名称:<赞>android 图片/视频选择器 拍摄示例源码
源码大小:5.17M
文件格式:.zip
开发语言:Java
更新时间:2018-02-27
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
package com.luck.pictureselector; import android.Manifest; import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.support.annotation.IdRes; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.permissions.RxPermissions; import com.luck.picture.lib.tools.PictureFileUtils; import com.luck.pictureselector.adapter.GridImageAdapter; import java.io.File; import java.util.ArrayList; import java.util.List; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; public class MainActivity extends AppCompatActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener, CompoundButton.OnCheckedChangeListener { private final static String TAG = MainActivity.class.getSimpleName(); private List<LocalMedia> selectList = new ArrayList<>(); private RecyclerView recyclerView; private GridImageAdapter adapter; private int maxSelectNum = 9; private TextView tv_select_num; private ImageView left_back, minus, plus; private RadioGroup rgb_crop, rgb_style, rgb_photo_mode; private int aspect_ratio_x, aspect_ratio_y; private CheckBox cb_voice, cb_choose_mode, cb_isCamera, cb_isGif, cb_preview_img, cb_preview_video, cb_crop, cb_compress, cb_mode, cb_hide, cb_crop_circular, cb_styleCrop, cb_showCropGrid, cb_showCropFrame, cb_preview_audio; private int themeId; private int chooseMode = PictureMimeType.ofAll(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); themeId = R.style.picture_default_style; minus = (ImageView) findViewById(R.id.minus); plus = (ImageView) findViewById(R.id.plus); tv_select_num = (TextView) findViewById(R.id.tv_select_num); rgb_crop = (RadioGroup) findViewById(R.id.rgb_crop); rgb_style = (RadioGroup) findViewById(R.id.rgb_style); rgb_photo_mode = (RadioGroup) findViewById(R.id.rgb_photo_mode); cb_voice = (CheckBox) findViewById(R.id.cb_voice); cb_choose_mode = (CheckBox) findViewById(R.id.cb_choose_mode); cb_isCamera = (CheckBox) findViewById(R.id.cb_isCamera); cb_isGif = (CheckBox) findViewById(R.id.cb_isGif); cb_preview_img = (CheckBox) findViewById(R.id.cb_preview_img); cb_preview_video = (CheckBox) findViewById(R.id.cb_preview_video); cb_crop = (CheckBox) findViewById(R.id.cb_crop); cb_styleCrop = (CheckBox) findViewById(R.id.cb_styleCrop); cb_compress = (CheckBox) findViewById(R.id.cb_compress); cb_mode = (CheckBox) findViewById(R.id.cb_mode); cb_showCropGrid = (CheckBox) findViewById(R.id.cb_showCropGrid); cb_showCropFrame = (CheckBox) findViewById(R.id.cb_showCropFrame); cb_preview_audio = (CheckBox) findViewById(R.id.cb_preview_audio); cb_hide = (CheckBox) findViewById(R.id.cb_hide); cb_crop_circular = (CheckBox) findViewById(R.id.cb_crop_circular); rgb_crop.setOnCheckedChangeListener(this); rgb_style.setOnCheckedChangeListener(this); rgb_photo_mode.setOnCheckedChangeListener(this); recyclerView = (RecyclerView) findViewById(R.id.recycler); left_back = (ImageView) findViewById(R.id.left_back); left_back.setOnClickListener(this); minus.setOnClickListener(this); plus.setOnClickListener(this); cb_crop.setOnCheckedChangeListener(this); cb_crop_circular.setOnCheckedChangeListener(this); cb_compress.setOnCheckedChangeListener(this); FullyGridLayoutManager manager = new FullyGridLayoutManager(MainActivity.this, 4, GridLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manager); adapter = new GridImageAdapter(MainActivity.this, onAddPicClickListener); adapter.setList(selectList); adapter.setSelectMax(maxSelectNum); recyclerView.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; } } } }); // 清空图片缓存,包括裁剪、压缩后的图片 注意:必须要在上传完成后调用 必须要获取权限 RxPermissions permissions = new RxPermissions(this); permissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Observer<Boolean>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Boolean aBoolean) { if (aBoolean) { PictureFileUtils.deleteCacheDirFile(MainActivity.this); } else { Toast.makeText(MainActivity.this, getString(R.string.picture_jurisdiction), Toast.LENGTH_SHORT).show(); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } private GridImageAdapter.onAddPicClickListener onAddPicClickListener = new GridImageAdapter.onAddPicClickListener() { @Override public void onAddPicClick() { boolean mode = cb_mode.isChecked(); if (mode) { // 进入相册 以下是例子:不需要的api可以不写 PictureSelector.create(MainActivity.this) .openGallery(chooseMode)// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio() .theme(themeId)// 主题样式设置 具体参考 values/styles 用法:R.style.picture.white.style .maxSelectNum(maxSelectNum)// 最大图片选择数量 .minSelectNum(1)// 最小选择数量 .imageSpanCount(4)// 每行显示个数 .selectionMode(cb_choose_mode.isChecked() ? PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选 .previewImage(cb_preview_img.isChecked())// 是否可预览图片 .previewVideo(cb_preview_video.isChecked())// 是否可预览视频 .enablePreviewAudio(cb_preview_audio.isChecked()) // 是否可播放音频 .isCamera(cb_isCamera.isChecked())// 是否显示拍照按钮 .isZoomAnim(true)// 图片列表点击 缩放效果 默认true //.imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg //.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径 .enableCrop(cb_crop.isChecked())// 是否裁剪 .compress(cb_compress.isChecked())// 是否压缩 .synOrAsy(true)//同步true或异步false 压缩 默认同步 //.compressSavePath(getPath())//压缩图片保存地址 //.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效 .glideOverride(160, 160)// glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度 .withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义 .hideBottomControls(cb_hide.isChecked() ? false : true)// 是否显示uCrop工具栏,默认不显示 .isGif(cb_isGif.isChecked())// 是否显示gif图片 .freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽 .circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪 .showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false .showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false .openClickSound(cb_voice.isChecked())// 是否开启点击声音 .selectionMedia(selectList)// 是否传入已选图片 // .videoMaxSecond(15) // .videoMinSecond(10) //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) //.cropCompressQuality(90)// 裁剪压缩质量 默认100 .minimumCompressSize(100)// 小于100kb的图片不压缩 //.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效 //.rotateEnabled() // 裁剪是否可旋转图片 //.scaleEnabled()// 裁剪是否可放大缩小图片 //.videoQuality()// 视频录制质量 0 or 1 //.videoSecond()//显示多少秒以内的视频or音频也可适用 //.recordVideoSecond()//录制视频秒数 默认60s .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code } else { // 单独拍照 PictureSelector.create(MainActivity.this) .openCamera(chooseMode)// 单独拍照,也可录像或也可音频 看你传入的类型是图片or视频 .theme(themeId)// 主题样式设置 具体参考 values/styles .maxSelectNum(maxSelectNum)// 最大图片选择数量 .minSelectNum(1)// 最小选择数量 .selectionMode(cb_choose_mode.isChecked() ? PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选 .previewImage(cb_preview_img.isChecked())// 是否可预览图片 .previewVideo(cb_preview_video.isChecked())// 是否可预览视频 .enablePreviewAudio(cb_preview_audio.isChecked()) // 是否可播放音频 .isCamera(cb_isCamera.isChecked())// 是否显示拍照按钮 .enableCrop(cb_crop.isChecked())// 是否裁剪 .compress(cb_compress.isChecked())// 是否压缩 .glideOverride(160, 160)// glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度 .withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义 .hideBottomControls(cb_hide.isChecked() ? false : true)// 是否显示uCrop工具栏,默认不显示 .isGif(cb_isGif.isChecked())// 是否显示gif图片 .freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽 .circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪 .showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false .showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false .openClickSound(cb_voice.isChecked())// 是否开启点击声音 .selectionMedia(selectList)// 是否传入已选图片 .previewEggs(false)//预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) //.cropCompressQuality(90)// 裁剪压缩质量 默认为100 .minimumCompressSize(100)// 小于100kb的图片不压缩 //.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效 //.rotateEnabled() // 裁剪是否可旋转图片 //.scaleEnabled()// 裁剪是否可放大缩小图片 //.videoQuality()// 视频录制质量 0 or 1 //.videoSecond()////显示多少秒以内的视频or音频也可适用 .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code } } }; @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: // 图片选择结果回调 selectList = PictureSelector.obtainMultipleResult(data); // 例如 LocalMedia 里面返回三种path // 1.media.getPath(); 为原图path // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true // 如果裁剪并压缩了,已取压缩路径为准,因为是先裁剪后压缩的 for (LocalMedia media : selectList) { Log.i("图片-----》", media.getPath()); } adapter.setList(selectList); adapter.notifyDataSetChanged(); break; } } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.left_back: finish(); break; case R.id.minus: if (maxSelectNum > 1) { maxSelectNum--; } tv_select_num.setText(maxSelectNum ""); adapter.setSelectMax(maxSelectNum); break; case R.id.plus: maxSelectNum ; tv_select_num.setText(maxSelectNum ""); adapter.setSelectMax(maxSelectNum); break; } } @Override public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { switch (checkedId) { case R.id.rb_all: chooseMode = PictureMimeType.ofAll(); cb_preview_img.setChecked(true); cb_preview_video.setChecked(true); cb_isGif.setChecked(false); cb_preview_video.setChecked(true); cb_preview_img.setChecked(true); cb_preview_video.setVisibility(View.VISIBLE); cb_preview_img.setVisibility(View.VISIBLE); cb_compress.setVisibility(View.VISIBLE); cb_crop.setVisibility(View.VISIBLE); cb_isGif.setVisibility(View.VISIBLE); cb_preview_audio.setVisibility(View.GONE); break; case R.id.rb_image: chooseMode = PictureMimeType.ofImage(); cb_preview_img.setChecked(true); cb_preview_video.setChecked(false); cb_isGif.setChecked(false); cb_preview_video.setChecked(false); cb_preview_video.setVisibility(View.GONE); cb_preview_img.setChecked(true); cb_preview_audio.setVisibility(View.GONE); cb_preview_img.setVisibility(View.VISIBLE); cb_compress.setVisibility(View.VISIBLE); cb_crop.setVisibility(View.VISIBLE); cb_isGif.setVisibility(View.VISIBLE); break; case R.id.rb_video: chooseMode = PictureMimeType.ofVideo(); cb_preview_img.setChecked(false); cb_preview_video.setChecked(true); cb_isGif.setChecked(false); cb_isGif.setVisibility(View.GONE); cb_preview_video.setChecked(true); cb_preview_video.setVisibility(View.VISIBLE); cb_preview_img.setVisibility(View.GONE); cb_preview_img.setChecked(false); cb_compress.setVisibility(View.GONE); cb_preview_audio.setVisibility(View.GONE); cb_crop.setVisibility(View.GONE); break; case R.id.rb_audio: chooseMode = PictureMimeType.ofAudio(); cb_preview_audio.setVisibility(View.VISIBLE); break; case R.id.rb_crop_default: aspect_ratio_x = 0; aspect_ratio_y = 0; break; case R.id.rb_crop_1to1: aspect_ratio_x = 1; aspect_ratio_y = 1; break; case R.id.rb_crop_3to4: aspect_ratio_x = 3; aspect_ratio_y = 4; break; case R.id.rb_crop_3to2: aspect_ratio_x = 3; aspect_ratio_y = 2; break; case R.id.rb_crop_16to9: aspect_ratio_x = 16; aspect_ratio_y = 9; break; case R.id.rb_default_style: themeId = R.style.picture_default_style; break; case R.id.rb_white_style: themeId = R.style.picture_white_style; break; case R.id.rb_num_style: themeId = R.style.picture_QQ_style; break; case R.id.rb_sina_style: themeId = R.style.picture_Sina_style; break; } } private int x = 0, y = 0; @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { switch (buttonView.getId()) { case R.id.cb_crop: rgb_crop.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_hide.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_crop_circular.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_styleCrop.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_showCropFrame.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_showCropGrid.setVisibility(isChecked ? View.VISIBLE : View.GONE); break; case R.id.cb_crop_circular: if (isChecked) { x = aspect_ratio_x; y = aspect_ratio_y; aspect_ratio_x = 1; aspect_ratio_y = 1; } else { aspect_ratio_x = x; aspect_ratio_y = y; } rgb_crop.setVisibility(isChecked ? View.GONE : View.VISIBLE); if (isChecked) { cb_showCropFrame.setChecked(false); cb_showCropGrid.setChecked(false); } else { cb_showCropFrame.setChecked(true); cb_showCropGrid.setChecked(true); } break; } } /** * 自定义压缩存储地址 * * @return */ private String getPath() { String path = Environment.getExternalStorageDirectory() "/Luban/image/"; File file = new File(path); if (file.mkdirs()) { return path; } return path; } }