选择多张图片上传多图预览

1.添加依赖

图片处理

compile 'com.uwetrottmann.photoview:library:1.2.4'

recyclerview

compile 'com.android.support:recyclerview-v7:25.1.0'

eventbus

compile 'de.greenrobot:eventbus:3.0.0-beta1'

compile 'com.github.bumptech.glide:glide:3.7.0'


2.activity

package com.example.ydc.demo.activity;

/**
 * Created by L on 2017/3/25.
 */

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;

import com.example.ydc.demo.R;
import com.example.ydc.demo.RvShowPhotoAdapter;
import com.example.ydc.demo.RvItemDecoration;
import com.example.ydc.demo.MessageEvent;
import com.example.ydc.demo.CustomHelper;
import com.example.ydc.demo.OnItemClickListener;
import com.jph.takephoto.app.TakePhoto;
import com.jph.takephoto.app.TakePhotoActivity;
import com.jph.takephoto.app.TakePhotoImpl;
import com.jph.takephoto.model.TImage;
import com.jph.takephoto.model.TResult;
import com.jph.takephoto.permission.TakePhotoInvocationHandler;

import java.io.File;
import java.util.ArrayList;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import de.greenrobot.event.EventBus;
import de.greenrobot.event.Subscribe;




public class PhotoActivity extends TakePhotoActivity {

    //    @BindView(R.id.tv_photo_xiangce)
//    Button tvPhotoXiangce;
//    @BindView(R.id.tv_photo_paizhao)
//    Button tvPhotoPaizhao;
    @BindView(R.id.tv_photo_quxiao)
    Button tvPhotoQuxiao;
    @BindView(R.id.rv_photo_pic)
    RecyclerView rvPhotoPic;
    private CustomHelper customHelper;
    private TakePhoto takePhoto;
    private RvShowPhotoAdapter rvShowPhotoAdapter;
    private int mPosition;
    ArrayList<File> fileList = new ArrayList<>();

    private boolean isOpen;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_photo);
        ButterKnife.bind(this);
        setUserSelect();

    }

    private void setUserSelect() {


        mPosition = getIntent().getIntExtra("TAG", 0);
       //获取标记来确定上一个页面是图库还是拍照
        switch (mPosition) {
            case 0:
                //图库
                EventBus.getDefault().register(this);
                //注册监听
                customHelper = new CustomHelper();

                setRecyclerAdapter();

                break;

            case 1:
                //拍照
                getTakePhoto().onPickFromCapture(getImageUri());//拍照后储存的路径

                setRecyclerAdapter();

                break;
        }

    }


    
    public Uri getImageUri() {


        File file = new File(Environment.getExternalStorageDirectory(), "/QPT/photo" + System.currentTimeMillis() + ".jpg");
        if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
        Uri imageUri = Uri.fromFile(file);

        return imageUri;
    }

    private void setRecyclerAdapter() {

        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 5);
        rvPhotoPic.setLayoutManager(gridLayoutManager);
        gridLayoutManager.setOrientation(OrientationHelper.VERTICAL);
        rvShowPhotoAdapter = new RvShowPhotoAdapter(this);

        rvPhotoPic.addItemDecoration(new RvItemDecoration(10));
        //将图片集合传递
        rvPhotoPic.setAdapter(rvShowPhotoAdapter);
        //发朋友圈选择照片的适配器
        rvShowPhotoAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(int position) {


                switch (mPosition) {

                    case 0:
                        new CustomHelper().init(getTakePhoto());//如果用户开始是进入图库选的话 这里点击是更多图片还是去图库
                        break;
                    case 1:
                        getTakePhoto().onPickFromCapture(getImageUri());//如果用户是开始进入相机的话 这里是点击更多图片还是去相机
                        break;
                }


            }
        });
    }

 

    public TakePhoto getTakePhoto() {
        if (takePhoto == null) {
            takePhoto = (TakePhoto) TakePhotoInvocationHandler.of(this).bind(new TakePhotoImpl(this, this));
        }
        return takePhoto;
    }


    @Override
    public void takeSuccess(TResult result) {
        super.takeSuccess(result);

        ArrayList<TImage> images = result.getImages();

        if (images != null) {

            for (int i = 0; i < images.size(); i++) {

                File file = new File(images.get(i).getOriginalPath());

                fileList.add(file);

            }

            rvShowPhotoAdapter.setmImageList(fileList);
            rvShowPhotoAdapter.notifyDataSetChanged();

            fileList.clear();
        }

    }

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

   

    @Subscribe
    public void onEventMainThread(MessageEvent event) {
        //发朋友圈选择图片适配器
        rvPhotoPic.setAdapter(rvShowPhotoAdapter);
    }


    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

    @OnClick({R.id.tv_photo_quxiao})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.tv_photo_quxiao:
                ArrayList<File> imageList = rvShowPhotoAdapter.getImageList();
                String inputText = tvPhotoQuxiao.getText().toString();
                //获取用户输入的文字 图片信息 这里应该将数据上传到服务器


                finish();

                break;
        }

    }
}

3.adapter

public class RvShowPhotoAdapter extends RecyclerView.Adapter {


    private final Activity activity;
    private OnItemClickListener mOnItemClickListener;
    private ArrayList<File> mImageList;

    public RvShowPhotoAdapter(Activity Activity) {
        activity = Activity;
        mImageList = new ArrayList<>();
    }

    public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) {
        this.mOnItemClickListener = mOnItemClickListener;
    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(activity).inflate(R.layout.item_show_photo, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {


        if (position == mImageList.size()) {
            //最后一张 应该是加号图片
            Glide.with(activity).load(R.mipmap.addimage).into(((MyViewHolder) holder).ivShow);
            //这里是点击进入相册选择相片的按钮
            ((MyViewHolder) holder).ivDelete.setVisibility(View.GONE);
        } else {

            Glide.with(activity).load(mImageList.get(position)).into(((MyViewHolder) holder).ivShow);

            ((MyViewHolder) holder).ivDelete.setVisibility(View.VISIBLE);
        }


        if (mOnItemClickListener != null) {

            ((MyViewHolder) holder).ivShow.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {


                    if (position == mImageList.size()) {//如果是最后一条数据 那个应该是加号添加图片的按钮 点击后去相册选择图片

                        mOnItemClickListener.onItemClick(position);

                    } else {//这里表示点击了选中的图片 应该去图片的详情页

                        ToastUtils.showToast(activity, "点击" + position);
                    }
                }
            });
        }
        //图片的删除按钮
        ((MyViewHolder) holder).ivDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (position != mImageList.size()) {

                    mImageList.remove(mImageList.get(position));
                    notifyItemRemoved(position);
                    //这里点击后要刷新适配器
                    EventBus.getDefault().post(new MessageEvent());
                    //通知适配器进行刷新数据
                }
            }
        });

    }

    @Override
    public int getItemCount() {
        return mImageList.size() + 1;
    }

    public void setmImageList(ArrayList images) {

        if (mImageList.size() + images.size() < 10) {

            mImageList.addAll(images);

        } else {

            ToastUtils.showToast(activity, ",最多选九张哦");

        }
    }


    public ArrayList<File> getImageList() {
        return mImageList;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {


        public SquareImageView ivShow;
        public ImageView ivDelete;

        public MyViewHolder(View itemView) {
            super(itemView);
            ivShow = (SquareImageView) itemView.findViewById(R.id.iv_show_photo);
            ivDelete = (ImageView) itemView.findViewById(R.id.iv_delete_photo);
        }

    }

4.自定义图片显示

public class SquareImageView extends ImageView {

    public SquareImageView(Context context) {
        super(context);
    }

    public SquareImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SquareImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), getDefaultSize(0, heightMeasureSpec));

        int childWidthSize = getMeasuredWidth();
        //高度和宽度一样
        heightMeasureSpec = widthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }



}

5.Event

public class MessageEvent {
    public MessageEvent() {
    }
}

6.CustomHelper

public class CustomHelper {

    public CustomHelper() {
    }


    public void init(TakePhoto takePhoto) {
        configTakePhotoOption(takePhoto);
        configCompress(takePhoto);
    }

    //是否从自带相册选
    private void configTakePhotoOption(TakePhoto takePhoto) {
        TakePhotoOptions.Builder builder = new TakePhotoOptions.Builder();

        takePhoto.setTakePhotoOptions(new TakePhotoOptions.Builder().setWithOwnGallery(true).create());

        builder.setWithOwnGallery(false);
        //使用系统自带相册
        builder.setCorrectImage(true);
        //纠正照片旋转角度
        takePhoto.setTakePhotoOptions(builder.create());

        takePhoto.onPickMultiple(9);
        //最多选择几张
        CompressConfig compressConfig = new CompressConfig.Builder().setMaxSize(50 * 1024).setMaxPixel(800).create();
    }

    private void configCompress(TakePhoto takePhoto) {

        boolean showProgressBar = true;
        //显示亚索进度条

        boolean enableRawFile = true;
        //拍照压缩后保存原图

        CompressConfig config;

        config = new CompressConfig.Builder()
                .setMaxSize(102400)
                .setMaxPixel(800 >= 800 ? 800 : 800)
                .enableReserveRaw(enableRawFile)
                .create();
        //使用自带亚索工具进行压缩 图片的寛高等信息

        takePhoto.onEnableCompress(config, showProgressBar);


    }
}
7. OnItemClickListener

public interface OnItemClickListener {

    void onItemClick(int position);


}

8. RvitemDecoration

public class RvitemDecoration extends RecyclerView.ItemDecoration{
    private final int i;

    public RvItemDecoration(int i) {
        this.i = i;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.right = i;
        outRect.left = i;
        outRect.top = i;
        outRect.bottom = i;
    }
}
xml布局

<?xml version="1.0"?>

    <LinearLayout android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="@color/colorWhite">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_photo_pic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50px"
        android:layout_marginRight="50px"
        android:layout_marginTop="100px"
        android:layout_marginBottom="100px">

    </android.support.v7.widget.RecyclerView>
    <Button
    android:id="@+id/tv_photo_quxiao"
    android:layout_width="match_parent"
    android:layout_height="120px"
    android:text="确定"
    android:layout_gravity="center_horizontal"
    android:textColor="@color/colorWhite"
    android:textSize="@dimen/sp_16"
    android:background="@color/colorblue"
    android:layout_margin="50px"
    />
</LinearLayout>

猜你喜欢

转载自blog.csdn.net/ydc0128/article/details/80895534