九宫格选择照片

一、Adapter

public class RecyclerImageAdapter extends RecyclerView.Adapter<RecyclerImageAdapter.ViewHolder> {
    public static final int TYPE_CAMERA = 1;
    public static final int TYPE_PICTURE = 2;
    private LayoutInflater mInflater;
    private List<String> list = new ArrayList<>();
    private int selectMax = 9;
    private Context context;
    private final RequestOptions options;
    /**
     * 点击添加图片跳转
     */
    private OnPickerListener mOnPickerListener;

    public void setOnPickerListener(OnPickerListener onPickerListener) {
        this.mOnPickerListener = onPickerListener;
    }

    /**
     * recyclerView设置的监听接口
     */
    public interface OnPickerListener {
        void onPicker(int position);
    }

    public RecyclerImageAdapter(Context context) {
        this.context = context;
        mInflater = LayoutInflater.from(context);
        options = new RequestOptions().placeholder(R.drawable.icon_choose_picture);
    }


    public void setSelectMax(int selectMax) {
        this.selectMax = selectMax;
    }

    public void setList(List<String> list) {
        this.list = list;
        this.notifyDataSetChanged();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        ImageView iv_image, iv_delete;

        public ViewHolder(View view) {
            super(view);
            iv_image = view.findViewById(R.id.iv_image);
            iv_delete = view.findViewById(R.id.iv_delete);
            iv_delete.setOnClickListener(this);
            iv_image.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.iv_image:
                    mOnPickerListener.onPicker(getLayoutPosition());
                    break;
                case R.id.iv_delete:
                    list.remove(getLayoutPosition());
                    notifyItemRemoved(getLayoutPosition());
                    break;
            }
        }
    }

    @Override
    public int getItemCount() {
        if (list.size() < selectMax) {
            return list.size() + 1;
        } else {
            return list.size();
        }
    }

    public List<String> getList() {
        return list;
    }

    @Override
    public int getItemViewType(int position) {
        if (isShowAddItem(position)) {
            return TYPE_CAMERA;
        } else {
            return TYPE_PICTURE;
        }
    }

    /**
     * 创建ViewHolder
     */
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = mInflater.inflate(R.layout.item_add_pic, viewGroup, false);
        final ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    private boolean isShowAddItem(int position) {
        int size = list.size() == 0 ? 0 : list.size();
        return position == size;
    }

    /**
     * 设置值
     */
    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {

        //少于9张,显示继续添加的图标
        if (getItemViewType(position) == TYPE_CAMERA) {
            viewHolder.iv_image.setImageBitmap(BitmapFactory.decodeResource(context.getResources(),R.drawable.icon_choose_picture));
            viewHolder.iv_delete.setVisibility(View.INVISIBLE);
        } else {
            String imgUrl = list.get(position);
            Glide.with(context).load(new File(imgUrl)).apply(options).into(viewHolder.iv_image);
            viewHolder.iv_delete.setVisibility(View.VISIBLE);
        }
    }
}

二、Activity

public class SelectPhotoActivity extends MyTakePhotoActivity {
    private RecyclerView rv_photo;
    private RecyclerImageAdapter mRecyclerAdapter;
    private Uri imageUri;
    private ArrayList<String> imgUrlLists = new ArrayList<>();// 图片压缩后的地址

    @Override
    public int initLayout() {
        return R.layout.activity_select_photo;
    }

    @Override
    public void initData() {
        rv_photo = findViewById(R.id.rv_photo);
        rv_photo.setLayoutManager(new GridLayoutManager(this, 3));
        rv_photo.addItemDecoration(new MyPaddingDecoration(this));
        mRecyclerAdapter = new RecyclerImageAdapter(this);
        mRecyclerAdapter.setSelectMax(9);
        rv_photo.setAdapter(mRecyclerAdapter);
        mRecyclerAdapter.setOnPickerListener(position -> {
            if (imgUrlLists.size() != position) {
                String[] strings = new String[imgUrlLists.size()];
                imageBrower(position, imgUrlLists.toArray(strings));
            } else {
                showPopupWindow();
            }
        });
    }

    private void imageBrower(int position, String[] urls) {
        Intent intent = new Intent(this, ImagePagerActivity.class);
        intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_URLS, urls);
        intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_INDEX, position);
        this.startActivity(intent);
    }

    /**
     * 设置照片的一些配置
     */
    private void photoConfig() {
        File file = new File(Environment.getExternalStorageDirectory(), "/napp_base/" + System.currentTimeMillis() + ".jpg");
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        imageUri = Uri.fromFile(file);
        /**
         * 压缩配置
         * 设置压缩规则,最大300kb
         * enableReserveRaw是否保存原图
         */
        getTakePhoto().onEnableCompress(new CompressConfig.Builder().setMaxSize(300 * 1024).enableReserveRaw(false).create(), false);
    }

    @Override
    public void takeSuccess(TResult result, int id) {
        super.takeSuccess(result, id);
        ArrayList<TImage> images = result.getImages();
        for (int i = 0; i < images.size(); i++) {
            imgUrlLists.add(images.get(i).getCompressPath());
        }
        mRecyclerAdapter.setList(imgUrlLists);
    }

    @Override
    public void takeFail(TResult result, String msg) {
        super.takeFail(result, msg);
    }

    @Override
    public void takeCancel() {
        super.takeCancel();
    }


    /**
     * 弹出选择
     */
    private void showPopupWindow() {
        TakePhotoPopWindow popupWindow = new TakePhotoPopWindow(this);
        String[] str = {"拍照", "从相册中选择"};
        popupWindow.showPopupWindowForFoot(str, (text, position) -> {
            switch (position) {
                case 0://拍照
                    photoConfig();
                    getTakePhoto().onPickFromCapture(imageUri);
                    break;
                case 1://相册
                    photoConfig();
                    getTakePhoto().onPickMultiple(9 - mRecyclerAdapter.getList().size());
                    break;
            }
        });
    }

    public class MyPaddingDecoration extends RecyclerView.ItemDecoration {
        private int divider;

        public MyPaddingDecoration(Context context) {
            //即你要设置的分割线的宽度 --这里设为10dp
            divider = context.getResources().getDimensionPixelSize(R.dimen.divider);
        }

        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
//        outRect.left = divider;  //相当于 设置 left padding
//        outRect.top = divider;   //相当于 设置 top padding
//        outRect.right = divider; //相当于 设置 right padding
            outRect.bottom = divider;  //相当于 设置 bottom padding
        }
    }
}

三、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_photo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="15dp"
        android:overScrollMode="never"
        android:visibility="visible" />

</LinearLayout>

四、引用工程

TakePhoto-master

五、资源文件

资源链接

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值