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>