图片选择器
来源:互联网 发布:软件挖玩客币 编辑:程序博客网 时间:2024/06/01 21:28
github上有一个很好的库,叫imagepicker,地址:https://github.com/jeasonlzy/ImagePicker,下载了Demo,稍微改了改,实现效果如下:
1、compile,都懂,不解释。
compile 'com.lzy.widget:imagepicker:0.6.1'compile 'com.squareup.picasso:picasso:2.5.2'compile 'com.android.support:recyclerview-v7:26+'
2、初始化Application,需要啥就设置啥,别忘了清单文件name一下。
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); ImagePicker imagePicker = ImagePicker.getInstance(); imagePicker.setImageLoader(new PicassoImageLoader()); //设置图片加载器 imagePicker.setShowCamera(true); //显示拍照按钮 imagePicker.setCrop(false); //不允许裁剪(单选才有效) imagePicker.setSaveRectangle(true); //是否按矩形区域保存 imagePicker.setSelectLimit(9); //选中数量限制// imagePicker.setStyle(CropImageView.Style.RECTANGLE); //裁剪框的形状// imagePicker.setFocusWidth(800); //裁剪框的宽度。单位像素(圆形自动取宽高最小值)// imagePicker.setFocusHeight(800); //裁剪框的高度。单位像素(圆形自动取宽高最小值)// imagePicker.setOutPutX(1000);//保存文件的宽度。单位像素// imagePicker.setOutPutY(1000);//保存文件的高度。单位像素 }}
3、第二步中需要一个imageloader
public class PicassoImageLoader implements ImageLoader { @Override public void displayImage(Activity activity, String path, ImageView imageView, int width, int height) { Picasso.with(activity) .load(Uri.fromFile(new File(path))) //.memoryPolicy(MemoryPolicy.NO_CACHE)//不缓存本地图片 .resize(width, height) .centerInside() .into(imageView); } @Override public void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height) { Picasso.with(activity) .load(Uri.fromFile(new File(path))) .resize(width, height) .centerInside() .into(imageView); } @Override public void clearMemoryCache() { //这里是清除缓存的方法,根据需要自己实现 }}
4、MainActivity中使用
public class MainActivity extends Activity implements ImagePickerAdapter.OnRecyclerViewItemClickListener { public static final int IMAGE_ITEM_ADD = -1; public static final int REQUEST_CODE_SELECT = 100; public static final int REQUEST_CODE_PREVIEW = 101; private ImagePickerAdapter adapter; private ArrayList<ImageItem> selImageList; //当前选择的所有图片 private int maxImgCount = 9; //允许选择图片最大数 private Dialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); initView(); } private void initView() { RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); selImageList = new ArrayList<>(); adapter = new ImagePickerAdapter(this, selImageList, maxImgCount); adapter.setOnItemClickListener(this); recyclerView.setLayoutManager(new GridLayoutManager(this, 4)); recyclerView.setHasFixedSize(true); recyclerView.setAdapter(adapter); } @Override public void onItemClick(View view, int position) { switch (position) { case IMAGE_ITEM_ADD: //添加图片 showAddPicDialog(); break; default: //预览图片 Intent intentPreview = new Intent(this, ImagePreviewDelActivity.class); intentPreview.putExtra(ImagePicker.EXTRA_IMAGE_ITEMS, (ArrayList<ImageItem>) adapter.getImages()); intentPreview.putExtra(ImagePicker.EXTRA_SELECTED_IMAGE_POSITION, position); intentPreview.putExtra(ImagePicker.EXTRA_FROM_ITEMS, true); startActivityForResult(intentPreview, REQUEST_CODE_PREVIEW); break; } } private void showAddPicDialog() { dialog = new Dialog(this); View v = LayoutInflater.from(this).inflate(R.layout.dialog, null); dialog.setContentView(v); dialog.show(); //打开相机拍照 v.findViewById(R.id.tv_camera).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); ImagePicker.getInstance().setSelectLimit(maxImgCount - selImageList.size()); Intent intent = new Intent(MainActivity.this, ImageGridActivity.class); intent.putExtra(ImageGridActivity.EXTRAS_TAKE_PICKERS, true); startActivityForResult(intent, REQUEST_CODE_SELECT); } }); //打开相册选择图片 v.findViewById(R.id.tv_album).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); ImagePicker.getInstance().setSelectLimit(maxImgCount - selImageList.size()); Intent intent1 = new Intent(MainActivity.this, ImageGridActivity.class); startActivityForResult(intent1, REQUEST_CODE_SELECT); } }); } ArrayList<ImageItem> images = null; @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == ImagePicker.RESULT_CODE_ITEMS) { //添加图片返回 if (data != null && requestCode == REQUEST_CODE_SELECT) { images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS); //1、不压缩直接显示 if (images != null) { selImageList.addAll(images); adapter.setImages(selImageList); } //2、开启子线程压缩后再显示// new Thread(new Runnable() {// @Override// public void run() {// for (ImageItem item : images) {// String sourceImagePath = item.path;// File file = new File(item.path);// String targetImagePath = getExternalFilesDir(null).getAbsolutePath() + "/Pic/" + file.getName();// boolean save = PicCompressUtil.imageCompress(sourceImagePath, targetImagePath, 200);//压缩程度// if (save) {// Message message = Message.obtain();// message.obj = targetImagePath;// message.what = 1;// handler.sendMessage(message);// }// }// }// }).start(); } } else if (resultCode == ImagePicker.RESULT_CODE_BACK) { //预览图片返回 if (data != null && requestCode == REQUEST_CODE_PREVIEW) { images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_IMAGE_ITEMS); if (images != null) { selImageList.clear(); selImageList.addAll(images); adapter.setImages(selImageList); } } } } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { ImageItem item = new ImageItem(); item.path = (String) msg.obj; selImageList.add(item); //这里我是压缩一张,显示一张(也可以设置一个ProgressDialog待全部压缩完后,一起显示) adapter.setImages(selImageList); } } }; /** * 上传图片文件 */ public void upLoadPic(View view) { Map<String, File> fileMap = new HashMap<>(); List<ImageItem> list = adapter.getImages(); for (ImageItem item : list) { fileMap.put(new File(item.path).getName(), new File(item.path)); } //然后上传文件的map }}
5、适配器部分
public class ImagePickerAdapter extends RecyclerView.Adapter<ImagePickerAdapter.SelectedPicViewHolder> { private int maxImgCount; private Context mContext; private List<ImageItem> mData; private LayoutInflater mInflater; private OnRecyclerViewItemClickListener listener; private boolean isAdded; //是否额外添加了最后一个图片 public interface OnRecyclerViewItemClickListener { void onItemClick(View view, int position); } public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.listener = listener; } public void setImages(List<ImageItem> data) { mData = new ArrayList<>(data); if (getItemCount() < maxImgCount) { mData.add(new ImageItem()); isAdded = true; } else { isAdded = false; } notifyDataSetChanged(); } public List<ImageItem> getImages() { //由于图片未选满时,最后一张显示添加图片,因此这个方法返回真正的已选图片 if (isAdded) return new ArrayList<>(mData.subList(0, mData.size() - 1)); else return mData; } public ImagePickerAdapter(Context mContext, List<ImageItem> data, int maxImgCount) { this.mContext = mContext; this.maxImgCount = maxImgCount; this.mInflater = LayoutInflater.from(mContext); setImages(data); } @Override public SelectedPicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new SelectedPicViewHolder(mInflater.inflate(R.layout.list_item_image, parent, false)); } @Override public void onBindViewHolder(SelectedPicViewHolder holder, int position) { holder.bind(position); } @Override public int getItemCount() { return mData.size(); } public class SelectedPicViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private ImageView iv_img; private int clickPosition; public SelectedPicViewHolder(View itemView) { super(itemView); iv_img = (ImageView) itemView.findViewById(R.id.iv_img); } public void bind(int position) { //设置条目的点击事件 itemView.setOnClickListener(this); //根据条目位置设置图片 ImageItem item = mData.get(position); if (isAdded && position == getItemCount() - 1) { iv_img.setImageResource(R.drawable.btn_add_photos); clickPosition = MainActivity.IMAGE_ITEM_ADD; } else { ImagePicker.getInstance().getImageLoader().displayImage((Activity) mContext, item.path, iv_img, 600, 600); clickPosition = position; } } @Override public void onClick(View v) { if (listener != null) listener.onItemClick(v, clickPosition); } }}
到此就结束了,作者的库中实现了显示高清原图的功能,但是项目中有可能需求显示压缩图,我就在上面就顺便添加了。压缩图额外用到的两个Util:
public class PicCompressUtil { public PicCompressUtil() { } public static boolean imageCompress(String sourcePath, String targetPath, int targetSize) { Bitmap sourceBitmap = BitmapFactory.decodeFile(sourcePath); if (sourceBitmap == null) { return false; } else { targetSize = targetSize <= 0 ? 600 : targetSize; sourceBitmap = imageCompress(targetSize, sourceBitmap); ByteArrayOutputStream baos = new ByteArrayOutputStream(); sourceBitmap.compress(Bitmap.CompressFormat.JPEG, 5, baos); byte[] bitmapDatas = baos.toByteArray(); for (int tempSize = targetSize; bitmapDatas.length / 1024 >= targetSize; bitmapDatas = baos.toByteArray()) { tempSize -= 5; sourceBitmap = imageCompress(tempSize, sourceBitmap); baos = new ByteArrayOutputStream(); sourceBitmap.compress(Bitmap.CompressFormat.JPEG, 6, baos); } BitmapUtil.saveBitmap(targetPath, sourceBitmap); if (!sourceBitmap.isRecycled()) { sourceBitmap.recycle(); } return true; } } public static Bitmap imageCompress(int imageSize, Bitmap bitmap) { if (imageSize <= 0) { imageSize = 600; } if (bitmap == null) { throw new NullPointerException("The bitmap cannot be null from ImageUtil ImageCompress()"); } else { double targetwidth = Math.sqrt((double) (imageSize * 1000)); if ((double) bitmap.getWidth() > targetwidth || (double) bitmap.getHeight() > targetwidth) { Matrix matrix = new Matrix(); double x = Math.max(targetwidth / (double) bitmap.getWidth(), targetwidth / (double) bitmap.getHeight()); matrix.postScale((float) x, (float) x); bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } return bitmap; } }}
public class BitmapUtil { private static final String TAG = BitmapUtil.class.getName(); public BitmapUtil() { } public static void saveBitmap(String path, String fileName, Bitmap bitmap) { saveBitmap(path + File.separator + fileName, bitmap); } public static void saveBitmap(String path, Bitmap bitmap) { File file = new File(path); FileOutputStream out = null; try { file.getParentFile().mkdirs(); out = new FileOutputStream(file); bitmap.compress(CompressFormat.JPEG, 100, out); } catch (Exception var13) { } finally { if(out != null) { try { out.close(); } catch (IOException var12) { } } } } public static byte[] readBitmapToByte(Bitmap bitmap) { if(bitmap == null) { return null; } else { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.JPEG, 100, baos); return baos.toByteArray(); } } public static Bitmap transformByteToBitmap(byte[] b) { return b == null?null:BitmapFactory.decodeByteArray(b, 0, b.length); } public static Bitmap grey(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Bitmap faceIconGreyBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888); Canvas canvas = new Canvas(faceIconGreyBitmap); Paint paint = new Paint(); ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0.0F); ColorMatrixColorFilter colorMatrixFilter = new ColorMatrixColorFilter(colorMatrix); paint.setColorFilter(colorMatrixFilter); canvas.drawBitmap(bitmap, 0.0F, 0.0F, paint); return faceIconGreyBitmap; }}
需要的小伙伴们可以直接抬走~~
阅读全文
0 0
- 图片选择器
- 图片选择器
- 图片选择器
- 图片选择器
- 图片选择器
- 图片选择器
- 图片选择器
- 图片选择器
- 图片选择器
- 图片选择器
- 图片选择器
- 图片选择器
- 后台处理图片选择器
- t图片选择器
- Android图片选择器
- 高仿微信本地图片选择器
- 微信图片选择器
- Android 图片选择器
- sql之null、空字符串、0的区别
- nodejs
- 多个checkbox复选框触发点击事件
- Linux进程间通信方式总结
- hdu-2492-Ping pong(树状数组)
- 图片选择器
- 异常处理
- 毕设那些事儿(后台篇)
- LinuxCentOS安装gcc
- react-native Android返回键以及 webview 中的回退处理
- Android Studio 导出aar包供Unity调用
- 十年。。。
- cout 与wcout
- vim常用快捷键+cscope插件