图片选择器

来源:互联网 发布:软件挖玩客币 编辑:程序博客网 时间: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;    }}

需要的小伙伴们可以直接抬走~~

原创粉丝点击