package com.luck.pictureselector; import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.RadioGroup; import android.widget.TextView; import com.luck.picture.lib.compress.Luban; import com.luck.picture.lib.model.FunctionConfig; import com.luck.picture.lib.model.FunctionOptions; import com.luck.picture.lib.model.PictureConfig; import com.luck.pictureselector.adapter.GridImageAdapter; import com.luck.pictureselector.util.FullyGridLayoutManager; import com.yalantis.ucrop.entity.LocalMedia; import java.util.ArrayList; import java.util.List; /** * author:luck * project:PictureSelector * package:com.luck.picture.ui * email:邮箱->893855882@qq.com * data:16/12/31 */ public class MainActivity extends Activity implements RadioGroup.OnCheckedChangeListener, View.OnClickListener { public static final String TAG = "MainActivity"; private RecyclerView recyclerView; private GridImageAdapter adapter; private RadioGroup rgbs, rgbs01, rgbs0, rgbs1, rgbs2, rgbs3, rgbs4, rgbs5, rgbs6, rgbs7, rgbs8, rgbs9, rgbs10, rgbs11; private int selectMode = FunctionConfig.MODE_MULTIPLE; private int maxSelectNum = 9;// 图片最大可选数量 private ImageButton minus, plus; private TextView tv_select_num; private EditText et_w, et_h, et_compress_width, et_compress_height; private LinearLayout ll_luban_wh; private boolean isShow = true; private int selectType = FunctionConfig.TYPE_IMAGE; private int copyMode = FunctionConfig.CROP_MODEL_DEFAULT; private boolean enablePreview = true; private boolean isPreviewVideo = true; private boolean enableCrop = true; private boolean theme = false; private boolean selectImageType = false; private int cropW = 0; private int cropH = 0; private int maxB = 0; private int compressW = 0; private int compressH = 0; private boolean isCompress = false; private boolean isCheckNumMode = false; private int compressFlag = 1;// 1 系统自带压缩 2 luban压缩 private List<LocalMedia> selectMedia = new ArrayList<>(); private EditText et_kb; private int themeStyle; private int previewColor, completeColor, previewBottomBgColor, previewTopBgColor, bottomBgColor, checkedBoxDrawable; private boolean mode = false;// 启动相册模式 private boolean clickVideo = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recycler); rgbs = (RadioGroup) findViewById(R.id.rgbs); rgbs01 = (RadioGroup) findViewById(R.id.rgbs01); rgbs0 = (RadioGroup) findViewById(R.id.rgbs0); rgbs1 = (RadioGroup) findViewById(R.id.rgbs1); rgbs2 = (RadioGroup) findViewById(R.id.rgbs2); rgbs3 = (RadioGroup) findViewById(R.id.rgbs3); rgbs4 = (RadioGroup) findViewById(R.id.rgbs4); rgbs5 = (RadioGroup) findViewById(R.id.rgbs5); rgbs6 = (RadioGroup) findViewById(R.id.rgbs6); rgbs7 = (RadioGroup) findViewById(R.id.rgbs7); rgbs8 = (RadioGroup) findViewById(R.id.rgbs8); rgbs9 = (RadioGroup) findViewById(R.id.rgbs9); rgbs10 = (RadioGroup) findViewById(R.id.rgbs10); et_kb = (EditText) findViewById(R.id.et_kb); rgbs11 = (RadioGroup) findViewById(R.id.rgbs11); findViewById(R.id.left_back).setOnClickListener(this); ll_luban_wh = (LinearLayout) findViewById(R.id.ll_luban_wh); et_compress_width = (EditText) findViewById(R.id.et_compress_width); et_compress_height = (EditText) findViewById(R.id.et_compress_height); et_w = (EditText) findViewById(R.id.et_w); et_h = (EditText) findViewById(R.id.et_h); minus = (ImageButton) findViewById(R.id.minus); plus = (ImageButton) findViewById(R.id.plus); tv_select_num = (TextView) findViewById(R.id.tv_select_num); FullyGridLayoutManager manager = new FullyGridLayoutManager(MainActivity.this, 4, GridLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manager); adapter = new GridImageAdapter(MainActivity.this, onAddPicClickListener); adapter.setList(selectMedia); adapter.setSelectMax(maxSelectNum); recyclerView.setAdapter(adapter); rgbs.setOnCheckedChangeListener(this); rgbs0.setOnCheckedChangeListener(this); rgbs1.setOnCheckedChangeListener(this); rgbs2.setOnCheckedChangeListener(this); rgbs3.setOnCheckedChangeListener(this); rgbs4.setOnCheckedChangeListener(this); rgbs5.setOnCheckedChangeListener(this); rgbs6.setOnCheckedChangeListener(this); rgbs7.setOnCheckedChangeListener(this); rgbs8.setOnCheckedChangeListener(this); rgbs9.setOnCheckedChangeListener(this); rgbs01.setOnCheckedChangeListener(this); rgbs10.setOnCheckedChangeListener(this); rgbs11.setOnCheckedChangeListener(this); minus.setOnClickListener(this); plus.setOnClickListener(this); adapter.setOnItemClickListener(new GridImageAdapter.OnItemClickListener() { @Override public void onItemClick(int position, View v) { switch (selectType) { case FunctionConfig.TYPE_IMAGE: // 预览图片 可长按保存 也可自定义保存路径 //PictureConfig.getInstance().externalPicturePreview(MainActivity.this, "/custom_file", position, selectMedia); PictureConfig.getInstance().externalPicturePreview(MainActivity.this, position, selectMedia); break; case FunctionConfig.TYPE_VIDEO: // 预览视频 if (selectMedia.size() > 0) { PictureConfig.getInstance().externalPictureVideo(MainActivity.this, selectMedia.get(position).getPath()); } break; } } }); } /** * 删除图片回调接口 */ private GridImageAdapter.onAddPicClickListener onAddPicClickListener = new GridImageAdapter.onAddPicClickListener() { @Override public void onAddPicClick(int type, int position) { switch (type) { case 0: // 进入相册 /** * type --> 1图片 or 2视频 * copyMode -->裁剪比例,默认、1:1、3:4、3:2、16:9 * maxSelectNum --> 可选择图片的数量 * selectMode --> 单选 or 多选 * isShow --> 是否显示拍照选项 这里自动根据type 启动拍照或录视频 * isPreview --> 是否打开预览选项 * isCrop --> 是否打开剪切选项 * isPreviewVideo -->是否预览视频(播放) mode or 多选有效 * ThemeStyle -->主题颜色 * CheckedBoxDrawable -->图片勾选样式 * cropW-->裁剪宽度 值不能小于100 如果值大于图片原始宽高 将返回原图大小 * cropH-->裁剪高度 值不能小于100 * isCompress -->是否压缩图片 * setEnablePixelCompress 是否启用像素压缩 * setEnableQualityCompress 是否启用质量压缩 * setRecordVideoSecond 录视频的秒数,默认不限制 * setRecordVideoDefinition 视频清晰度 Constants.HIGH 清晰 Constants.ORDINARY 低质量 * setImageSpanCount -->每行显示个数 * setCheckNumMode 是否显示QQ选择风格(带数字效果) * setPreviewColor 预览文字颜色 * setCompleteColor 完成文字颜色 * setPreviewBottomBgColor 预览界面底部背景色 * setBottomBgColor 选择图片页面底部背景色 * setCompressQuality 设置裁剪质量,默认无损裁剪 * setSelectMedia 已选择的图片 * setCompressFlag 1为系统自带压缩 2为第三方luban压缩 * 注意-->type为2时 设置isPreview or isCrop 无效 * 注意:Options可以为空,默认标准模式 */ String ws = et_w.getText().toString().trim(); String hs = et_h.getText().toString().trim(); String b = et_kb.getText().toString().trim();// 压缩最大大小 单位是b if (!isNull(ws) && !isNull(hs)) { cropW = Integer.parseInt(ws); cropH = Integer.parseInt(hs); } if (!isNull(b)) { maxB = Integer.parseInt(b); } if (!isNull(et_compress_width.getText().toString()) && !isNull(et_compress_height.getText().toString())) { compressW = Integer.parseInt(et_compress_width.getText().toString()); compressH = Integer.parseInt(et_compress_height.getText().toString()); } if (theme) { // 设置主题样式 themeStyle = ContextCompat.getColor(MainActivity.this, R.color.blue); } else { themeStyle = ContextCompat.getColor(MainActivity.this, R.color.bar_grey); } if (selectImageType) { checkedBoxDrawable = R.drawable.select_cb; } else { checkedBoxDrawable = 0; } if (isCheckNumMode) { // QQ 风格模式下 这里自己搭配颜色 previewColor = ContextCompat.getColor(MainActivity.this, R.color.blue); completeColor = ContextCompat.getColor(MainActivity.this, R.color.blue); } else { previewColor = ContextCompat.getColor(MainActivity.this, R.color.tab_color_true); completeColor = ContextCompat.getColor(MainActivity.this, R.color.tab_color_true); } FunctionOptions options = new FunctionOptions.Builder() .setType(selectType) // 图片or视频 FunctionConfig.TYPE_IMAGE TYPE_VIDEO .setCropMode(copyMode) // 裁剪模式 默认、1:1、3:4、3:2、16:9 // .setOffsetX() // 自定义裁剪比例 // .setOffsetY() // 自定义裁剪比例 .setCompress(isCompress) //是否压缩 .setEnablePixelCompress(true) //是否启用像素压缩 .setEnableQualityCompress(true) //是否启质量压缩 .setMaxSelectNum(maxSelectNum) // 可选择图片的数量 .setMinSelectNum(0)// 图片或视频最低选择数量,默认代表无限制 .setSelectMode(selectMode) // 单选 or 多选 .setShowCamera(isShow) //是否显示拍照选项 这里自动根据type 启动拍照或录视频 .setEnablePreview(enablePreview) // 是否打开预览选项 .setEnableCrop(enableCrop) // 是否打开剪切选项 .setCircularCut(false)// 是否采用圆形裁剪 .setPreviewVideo(isPreviewVideo) // 是否预览视频(播放) mode or 多选有效 .setCheckedBoxDrawable(checkedBoxDrawable) .setRecordVideoDefinition(FunctionConfig.HIGH) // 视频清晰度 .setRecordVideoSecond(60) // 视频秒数 .setCustomQQ_theme(0)// 可自定义QQ数字风格,不传就默认是蓝色风格 .setGif(false)// 是否显示gif图片,默认不显示 .setCropW(cropW) // cropW-->裁剪宽度 值不能小于100 如果值大于图片原始宽高 将返回原图大小 .setCropH(cropH) // cropH-->裁剪高度 值不能小于100 如果值大于图片原始宽高 将返回原图大小 .setMaxB(maxB) // 压缩最大值 例如:200kb 就设置202400,202400 / 1024 = 200kb .setPreviewColor(previewColor) //预览字体颜色 .setCompleteColor(completeColor) //已完成字体颜色 .setPreviewBottomBgColor(previewBottomBgColor) //预览图片底部背景色 .setPreviewTopBgColor(previewTopBgColor)//预览图片标题背景色 .setBottomBgColor(bottomBgColor) //图片列表底部背景色 .setGrade(Luban.THIRD_GEAR) // 压缩档次 默认三档 .setCheckNumMode(isCheckNumMode) .setCompressQuality(100) // 图片裁剪质量,默认无损 .setImageSpanCount(4) // 每行个数 .setVideoS(0)// 查询多少秒内的视频 单位:秒 .setSelectMedia(selectMedia) // 已选图片,传入在次进去可选中,不能传入网络图片 .setCompressFlag(compressFlag) // 1 系统自带压缩 2 luban压缩 .setCompressW(compressW) // 压缩宽 如果值大于图片原始宽高无效 .setCompressH(compressH) // 压缩高 如果值大于图片原始宽高无效 .setThemeStyle(themeStyle) // 设置主题样式 .setNumComplete(false) // 0/9 完成 样式 .setClickVideo(clickVideo)// 点击声音 .setFreeStyleCrop(false) // 裁剪是移动矩形框或是图片 // .setRotateEnabled(false) // 裁剪时是否旋转图片 // .setScaleEnabled(false)// 裁剪时是否放大小图片 // .setPicture_title_color(ContextCompat.getColor(MainActivity.this, R.color.black)) // 设置标题字体颜色 // .setPicture_right_color(ContextCompat.getColor(MainActivity.this, R.color.black)) // 设置标题右边字体颜色 // .setLeftBackDrawable(R.mipmap.back2) // 设置返回键图标 // .setStatusBar(ContextCompat.getColor(MainActivity.this, R.color.white)) // 设置状态栏颜色,默认是和标题栏一致 // .setImmersive(false)// 是否改变状态栏字体颜色(黑色) .create(); if (mode) { // 只拍照 PictureConfig.getInstance().init(options).startOpenCamera(MainActivity.this, resultCallback); } else { // 先初始化参数配置,在启动相册 PictureConfig.getInstance().init(options).openPhoto(MainActivity.this, resultCallback); } break; case 1: // 删除图片 selectMedia.remove(position); adapter.notifyItemRemoved(position); break; } } }; /** * 图片回调方法 */ private PictureConfig.OnSelectResultCallback resultCallback = new PictureConfig.OnSelectResultCallback() { @Override public void onSelectSuccess(List<LocalMedia> resultList) { // 多选回调 selectMedia = resultList; Log.i("callBack_result", selectMedia.size() + ""); LocalMedia media = resultList.get(0); if (media.isCut() && !media.isCompressed()) { // 裁剪过 String path = media.getCutPath(); } else if (media.isCompressed() || (media.isCut() && media.isCompressed())) { // 压缩过,或者裁剪同时压缩过,以最终压缩过图片为准 String path = media.getCompressPath(); } else { // 原图地址 String path = media.getPath(); } if (selectMedia != null) { adapter.setList(selectMedia); adapter.notifyDataSetChanged(); } } @Override public void onSelectSuccess(LocalMedia media) { // 单选回调 selectMedia.add(media); if (selectMedia != null) { adapter.setList(selectMedia); adapter.notifyDataSetChanged(); } } }; @Override public void onCheckedChanged(RadioGroup radioGroup, int i) { switch (i) { case R.id.rb_photo: mode = false; break; case R.id.rb_camera: mode = true; break; case R.id.rb_ordinary: isCheckNumMode = false; break; case R.id.rb_qq: isCheckNumMode = true; break; case R.id.rb_single: selectMode = FunctionConfig.MODE_SINGLE; break; case R.id.rb_multiple: selectMode = FunctionConfig.MODE_MULTIPLE; break; case R.id.rb_image: selectType = FunctionConfig.TYPE_IMAGE; break; case R.id.rb_video: selectType = FunctionConfig.TYPE_VIDEO; break; case R.id.rb_photo_display: isShow = true; break; case R.id.rb_photo_hide: isShow = false; break; case R.id.rb_default: copyMode = FunctionConfig.CROP_MODEL_DEFAULT; break; case R.id.rb_to1_1: copyMode = FunctionConfig.CROP_MODEL_1_1; break; case R.id.rb_to3_2: copyMode = FunctionConfig.CROP_MODEL_3_2; break; case R.id.rb_to3_4: copyMode = FunctionConfig.CROP_MODEL_3_4; break; case R.id.rb_to16_9: copyMode = FunctionConfig.CROP_MODEL_16_9; break; case R.id.rb_preview: enablePreview = true; break; case R.id.rb_preview_false: enablePreview = false; break; case R.id.rb_preview_video: isPreviewVideo = true; break; case R.id.rb_preview_video_false: isPreviewVideo = false; break; case R.id.rb_yes_copy: enableCrop = true; break; case R.id.rb_no_copy: enableCrop = false; break; case R.id.rb_theme1: theme = false; break; case R.id.rb_theme2: theme = true; break; case R.id.rb_select1: selectImageType = false; break; case R.id.rb_select2: selectImageType = true; break; case R.id.rb_compress_false: isCompress = false; rgbs10.setVisibility(View.GONE); et_kb.setVisibility(View.GONE); ll_luban_wh.setVisibility(View.GONE); et_compress_height.setText(""); et_compress_width.setText(""); break; case R.id.rb_compress_true: isCompress = true; et_kb.setVisibility(View.VISIBLE); if (compressFlag == 2) { ll_luban_wh.setVisibility(View.VISIBLE); } rgbs10.setVisibility(View.VISIBLE); break; case R.id.rb_system: compressFlag = 1; ll_luban_wh.setVisibility(View.GONE); et_compress_height.setText(""); et_compress_width.setText(""); break; case R.id.rb_luban: compressFlag = 2; ll_luban_wh.setVisibility(View.VISIBLE); break; case R.id.rb_off: clickVideo = false; break; case R.id.rb_open: clickVideo = true; break; } } /** * 判断 一个字段的值否为空 * * @param s * @return * @author Michael.Zhang 2013-9-7 下午4:39:00 */ public boolean isNull(String s) { if (null == s || s.equals("") || s.equalsIgnoreCase("null")) { return true; } return false; } @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 protected void attachBaseContext(Context newBase) { super.attachBaseContext(new ContextWrapper(newBase) { @Override public Object getSystemService(String name) { if (Context.AUDIO_SERVICE.equals(name)) return getApplicationContext().getSystemService(name); return super.getSystemService(name); } }); } }