使用南尘的ImagePicker实现仿微信的相册图片选择以及拍照上传

在记录之前先放上原作的GitHub项目地址:ImagePicker

南尘的框架写得相当不错,我们可以在我们的项目中添加依赖直接使用,但是我在使用的时候发现了一个小bug,就在图片预览的界面选择了图片后,点击返回到所有图片界面时,在预览被选中的图片的CheckBox没有勾上,但是图片是确实已经添加上去了,于是我在他源码的基础上进行了修改,但是我感觉我修改的方法有点low,欢迎大神指点更高级的修改方法。

首先先来说一下这个框架怎么使用,因为这里我要修改源码,所以我直接将源码的module导入到我的工程了,然后在gradle里面加一句:compile project(':imagepicker')

另外,我用了glide框架来加载图片,所以还要加上:compile 'com.github.bumptech.glide:glide:3.7.0'

假设我们添加图片的界面就是MainActivity,所以先上其布局代码activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:choiceMode="singleChoice"
        android:divider="@null"
        android:fadingEdge="none"
        android:listSelector="@android:color/transparent"
        android:scrollbarStyle="outsideOverlay"
        app:layoutManager="android.support.v7.widget.GridLayoutManager"
        app:spanCount="4"
        tools:listitem="@layout/list_item_image"/>
</RelativeLayout>
其次先新建两个工具类

第一个是图片的加载器,这里我使用的是Glide加载:GlideImageLoader

package demo.yang.com.myimagepicker;

import android.app.Activity;
import android.net.Uri;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.lzy.imagepicker.loader.ImageLoader;

import java.io.File;


/**
 * Created by yxy on 2017/4/10.
 * email:1084625746@qq.com
 */

public class GlideImageLoader implements ImageLoader {
    @Override
    public void displayImage(Activity activity, String path, ImageView imageView, int width, int height) {
        Glide.with(activity)
                .load(Uri.fromFile(new File(path)))
                .error(R.mipmap.f)
                .placeholder(R.mipmap.f)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imageView);
    }

    @Override
    public void clearMemoryCache() {

    }
}
至于里面的error和placeholder的图片资源大家就自己随便放吧

第二个是一个自定义dialog(这个是南尘大神写的):SelectDialog

package demo.yang.com.myimagepicker;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;

/**
 * 选择对话框
 *
 * Author: nanchen
 * Email: liushilin520@foxmail.com
 * Date: 2017-03-22  11:38
 */

public class SelectDialog extends Dialog implements OnClickListener,OnItemClickListener {
    private SelectDialogListener mListener;
    private Activity mActivity;
    private Button mMBtn_Cancel;
    private TextView mTv_Title;
    private List<String> mName;
    private String mTitle;
    private boolean mUseCustomColor = false;
    private int mFirstItemColor;
    private int mOtherItemColor;

    public interface SelectDialogListener {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id);
    }


    /**
     * 取消事件监听接口
     *
     */
    private SelectDialogCancelListener mCancelListener;

    public interface SelectDialogCancelListener {
        public void onCancelClick(View v);
    }

    public SelectDialog(Activity activity, int theme,
                        SelectDialogListener listener, List<String> names) {
        super(activity, theme);
        mActivity = activity;
        mListener = listener;
        this.mName=names;

        setCanceledOnTouchOutside(true);
    }

    /**
     * @param activity 调用弹出菜单的activity
     * @param theme 主题
     * @param listener 菜单项单击事件
     * @param cancelListener 取消事件
     * @param names 菜单项名称
     *
     */
    public SelectDialog(Activity activity, int theme, SelectDialogListener listener, SelectDialogCancelListener cancelListener , List<String> names) {
        super(activity, theme);
        mActivity = activity;
        mListener = listener;
        mCancelListener = cancelListener;
        this.mName=names;

        // 设置是否点击外围不解散
        setCanceledOnTouchOutside(false);
    }

    /**
     * @param activity 调用弹出菜单的activity
     * @param theme 主题
     * @param listener 菜单项单击事件
     * @param names 菜单项名称
     * @param title 菜单标题文字
     *
     */
    public SelectDialog(Activity activity, int theme, SelectDialogListener listener, List<String> names, String title) {
        super(activity, theme);
        mActivity = activity;
        mListener = listener;
        this.mName=names;
        mTitle = title;

        // 设置是否点击外围可解散
        setCanceledOnTouchOutside(true);
    }

    public SelectDialog(Activity activity, int theme, SelectDialogListener listener, SelectDialogCancelListener cancelListener, List<String> names, String title) {
        super(activity, theme);
        mActivity = activity;
        mListener = listener;
        mCancelListener = cancelListener;
        this.mName=names;
        mTitle = title;

        // 设置是否点击外围可解散
        setCanceledOnTouchOutside(true);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = getLayoutInflater().inflate(R.layout.view_dialog_select,
                null);
        setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
        Window window = getWindow();
        // 设置显示动画
        window.setWindowAnimations(R.style.main_menu_animstyle);
        WindowManager.LayoutParams wl = window.getAttributes();
        wl.x = 0;
        wl.y = mActivity.getWindowManager().getDefaultDisplay().getHeight();
        // 以下这两句是为了保证按钮可以水平满屏
        wl.width = LayoutParams.MATCH_PARENT;
        wl.height = LayoutParams.WRAP_CONTENT;

        // 设置显示位置
        onWindowAttributesChanged(wl);

        initViews();
    }

    private void initViews() {
        DialogAdapter dialogAdapter=new DialogAdapter(mName);
        ListView dialogList=(ListView) findViewById(R.id.dialog_list);
        dialogList.setOnItemClickListener(this);
        dialogList.setAdapter(dialogAdapter);
        mMBtn_Cancel = (Button) findViewById(R.id.mBtn_Cancel);
        mTv_Title = (TextView) findViewById(R.id.mTv_Title);


        mMBtn_Cancel.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(mCancelListener != null){
                    mCancelListener.onCancelClick(v);
                }
                dismiss();
            }
        });

        if(!TextUtils.isEmpty(mTitle) && mTv_Title != null){
            mTv_Title.setVisibility(View.VISIBLE);
            mTv_Title.setText(mTitle);
        }else{
            mTv_Title.setVisibility(View.GONE);
        }
    }

    @Override
    public void onClick(View v) {
        dismiss();

    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {

        mListener.onItemClick(parent, view, position, id);
        dismiss();
    }
    private class DialogAdapter extends BaseAdapter {
        private List<String> mStrings;
        private Viewholder viewholder;
        private LayoutInflater layoutInflater;
        public DialogAdapter(List<String> strings) {
            this.mStrings = strings;
            this.layoutInflater=mActivity.getLayoutInflater();
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mStrings.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return mStrings.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (null == convertView) {
                viewholder=new Viewholder();
                convertView=layoutInflater.inflate(R.layout.view_dialog_item, null);
                viewholder.dialogItemButton=(TextView) convertView.findViewById(R.id.dialog_item_bt);
                convertView.setTag(viewholder);
            }else{
                viewholder=(Viewholder) convertView.getTag();
            }
            viewholder.dialogItemButton.setText(mStrings.get(position));
            if (!mUseCustomColor) {
                mFirstItemColor = mActivity.getResources().getColor(R.color.blue);
                mOtherItemColor = mActivity.getResources().getColor(R.color.blue);
            }
            if (1 == mStrings.size()) {
                viewholder.dialogItemButton.setTextColor(mFirstItemColor);
                viewholder.dialogItemButton.setBackgroundResource(R.drawable.dialog_item_bg_only);
            } else if (position == 0) {
                viewholder.dialogItemButton.setTextColor(mFirstItemColor);
                viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_top);
            } else if (position == mStrings.size() - 1) {
                viewholder.dialogItemButton.setTextColor(mOtherItemColor);
                viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_buttom);
            } else {
                viewholder.dialogItemButton.setTextColor(mOtherItemColor);
                viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_center);
            }
            return convertView;
        }

    }

    public static class Viewholder {
        public TextView dialogItemButton;
    }

    /**
     * 设置列表项的文本颜色
     */
    public void setItemColor(int firstItemColor, int otherItemColor) {
        mFirstItemColor = firstItemColor;
        mOtherItemColor = otherItemColor;
        mUseCustomColor = true;
    }
}
这个里面会用到一些style,添加到style.xml里面:

<style name="main_menu_animstyle">
        <item name="android:windowEnterAnimation">@anim/photo_dialog_in_anim</item>
        <item name="android:windowExitAnimation">@anim/photo_dialog_out_anim</item>
    </style>

    <style name="transparentFrameWindowStyle" parent="android:style/Theme.Dialog">
        <item name="android:windowBackground">@drawable/photo_choose_bg</item>
    </style>
在res文件夹下新建anim文件夹,新建两个xml文件:photo_dialog_in_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="200"
        android:fromXDelta="0"
        android:fromYDelta="1000"
        android:toXDelta="0"
        android:toYDelta="0" />

</set>
photo_dialog_out_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="1000" />

</set>
然后在drawable文件夹里新建photo_choose_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#00000000"/>

    <corners android:radius="20dp"/>

    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp"/>

</shape>
新建一个layout文件:view_dialog_select.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00000000"
    android:gravity="bottom"
    android:orientation="vertical"
    android:padding="5dip" >
    
    <TextView
        android:id="@+id/mTv_Title"
        android:layout_width="match_parent"
        android:layout_height="68dp"
        android:layout_marginTop="5dip"
        android:background="@drawable/dialog_item_bg_only"
        android:padding="10dip"
        android:textColor="#0073FF"
        android:textSize="18sp"
        android:gravity="center"
        android:visibility="gone"/>

    <ListView
        android:id="@+id/dialog_list"
        android:layout_width="match_parent"
        android:dividerHeight="0.5dp"
        android:divider="#DAD9DB"
        android:layout_marginTop="5dip"
        android:listSelector="@android:color/transparent"
        android:cacheColorHint="@android:color/transparent"
        android:layout_height="wrap_content" >
    </ListView>

    <Button
        android:id="@+id/mBtn_Cancel"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginTop="5dip"
        android:background="@drawable/dialog_item_bg_only"
        android:text="取消"
        android:gravity="center"
        android:textColor="#0073FF"
        android:textSize="18sp" />

</LinearLayout>
以及对应ListView的item的layout:view_dialog_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
      >

    <TextView
        android:id="@+id/dialog_item_bt"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center"
        android:textColor="#0073FF"
        android:textSize="18sp" />
</RelativeLayout>
还有四个按钮的背景样式

只有一列时:dialog_item_bg_only.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><shape>
            <solid android:color="#CACACB" />

            <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" />
        </shape></item>
    <item><shape>
            <solid android:color="#EBEBEB" />

            <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" />
        </shape></item>

</selector>
多条数据时,第一条数据的背景:select_dialog_item_bg_top.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><shape>
            <solid android:color="#CACACB" />

            <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" />
        </shape></item>
    <item><shape>
            <solid android:color="#EBEBEB" />

            <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" />
        </shape></item>

</selector>
多条数据时,最后一条数据的背景:select_dialog_item_bg_buttom.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><shape>
            <solid android:color="#CACACB" />

            <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="0dp" android:topRightRadius="0dp" />
        </shape></item>
    <item><shape>
            <solid android:color="#EBEBEB" />

            <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="0dp" android:topRightRadius="0dp" />
        </shape></item>

</selector>
多条数据时,中间数据的背景:select_dialog_item_bg_center.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><shape>
            <solid android:color="#CACACB" />

        </shape></item>
    <item><shape>
            <solid android:color="#EBEBEB" />

        </shape></item>

</selector>
工具类添加完后,就可以写显示我们已选择的图片的适配器了:ImagePickerAdapter

package demo.yang.com.myimagepicker;

import android.app.Activity;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.lzy.imagepicker.ImagePicker;
import com.lzy.imagepicker.bean.ImageItem;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by yxy on 2017/4/10.
 * email:1084625746@qq.com
 */

public class ImagePickerAdapter extends RecyclerView.Adapter<ImagePickerAdapter.SelectedPicViewHolder>{

    private OnRecyclerViewItemClickListener listener;
    private int maxImgCount;
    private Context context;
    private List<ImageItem> mData;
    private LayoutInflater mInflater;
    private boolean isAdded;//是否还能添加图片

    public ImagePickerAdapter(int maxImgCount, Context context, List<ImageItem> mData) {
        this.maxImgCount = maxImgCount;
        this.context = context;
        this.mInflater = LayoutInflater.from(context);
        setImages(mData);
    }

    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;
    }

    @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 interface OnRecyclerViewItemClickListener{
        void onItemClick(View view,int position);
    }

    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener){
        this.listener = listener;
    }

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

        private ImageView img;
        private int clickPosition;

        public SelectedPicViewHolder(View itemView) {
            super(itemView);
            img = (ImageView) itemView.findViewById(R.id.img);
        }

        public void bind(int position){
            itemView.setOnClickListener(this);
            ImageItem item = mData.get(position);
            if (isAdded&&position==getItemCount()-1){
                img.setImageResource(R.drawable.selector_image_add);
                clickPosition = MainActivity.IMAGE_ITEM_ADD;
            }else{
                ImagePicker.getInstance().getImageLoader().displayImage((Activity) context,item.path,img,0,0);
                clickPosition = position;
            }
        }

        @Override
        public void onClick(View view) {
            if (listener!=null){
                listener.onItemClick(view,clickPosition);
            }
        }
    }
}
这里面的排版就看自己的项目需求了,因为我MainActivity的布局只写了一个RecyclerView,所以我的适配器就只放了一个ImageView:list_item_image.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:padding="5dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/img"
        android:scaleType="centerCrop"
        android:src="@drawable/selector_image_add"
        android:layout_width="70dp"
        android:layout_height="70dp" />

</LinearLayout>
在drawable文件夹里面新建一个selector_image_add.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@mipmap/image_add_sel" android:state_focused="true"/>
    <item android:drawable="@mipmap/image_add_sel" android:state_pressed="true"/>
    <item android:drawable="@mipmap/image_add_sel" android:state_selected="true"/>
    <item android:drawable="@mipmap/image_add_nor"/>

</selector>
下面是这两个图片资源

         

最后就是MainActivity的代码了

package demo.yang.com.myimagepicker;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;

import com.lzy.imagepicker.ImagePicker;
import com.lzy.imagepicker.bean.ImageItem;
import com.lzy.imagepicker.ui.ImageGridActivity;
import com.lzy.imagepicker.ui.ImagePreviewDelActivity;
import com.lzy.imagepicker.view.CropImageView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements ImagePickerAdapter.OnRecyclerViewItemClickListener {

    public static final int IMAGE_ITEM_ADD = -1;//设置是否为添加图片的那个image
    public static final int REQUEST_CODE_SELECT = 100;
    public static final int REQUEST_CODE_PREVIEW = 101;

    private ImagePickerAdapter adapter;
    private List<ImageItem> selImageList;//当前选择的所有图片
    private int maxImgCount = 8;//允许选择的图片最大数量

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initImagePicker();
        initWidget();
    }

    private void initImagePicker(){
        ImagePicker imagePicker = ImagePicker.getInstance();
        imagePicker.setImageLoader(new GlideImageLoader());//设置图片加载器
        imagePicker.setShowCamera(true);//显示拍照按钮
        imagePicker.setCrop(true);//允许裁剪(单选的时候才有效)
        imagePicker.setSaveRectangle(true);//是否按矩形区域保存
        imagePicker.setSelectLimit(maxImgCount);//选中数量限制
        imagePicker.setStyle(CropImageView.Style.RECTANGLE);//裁剪框的形状
        imagePicker.setFocusWidth(800);//裁剪框的宽度,单位像素
        imagePicker.setFocusHeight(800);//裁剪框的高度,单位像素
        imagePicker.setOutPutX(1000);//保存文件的宽度,单位像素
        imagePicker.setOutPutY(1000);//保存文件的高度,单位像素
    }

    private void initWidget(){
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        selImageList = new ArrayList<>();
        adapter = new ImagePickerAdapter(maxImgCount,this,selImageList);
        adapter.setOnItemClickListener(this);
        recyclerView.setLayoutManager(new GridLayoutManager(this,4));
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(adapter);
    }

    private SelectDialog showDialog(SelectDialog.SelectDialogListener listener,List<String> names){
        SelectDialog dialog = new SelectDialog(this,R.style.transparentFrameWindowStyle,listener,names);
        if (!this.isFinishing()){
            dialog.show();
        }
        return dialog;
    }

    @Override
    public void onItemClick(View view, int position) {
        switch (position){
            case IMAGE_ITEM_ADD:
                List<String> names = new ArrayList<>();
                names.add("拍照");
                names.add("相册");
                showDialog(new SelectDialog.SelectDialogListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        switch (position){
                            case 0://直接调起相机
                                //打开选择,本次允许选择的数量
                                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);
                                break;
                            case 1://打开相册
                                //打开选择,本次允许选择的数量
                                ImagePicker.getInstance().setSelectLimit(maxImgCount - selImageList.size());
                                Intent intent1 = new Intent(MainActivity.this,ImageGridActivity.class);
                                startActivityForResult(intent1,REQUEST_CODE_SELECT);
                                break;
                            default:
                                break;
                        }
                    }
                },names);
                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;
        }
    }

    @Override
    protected 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){
                ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS);
                if (images!=null){
                    selImageList.addAll(images);
                    adapter.setImages(selImageList);
                    Log.e("TAG", "onActivityResult: "+selImageList.get(0).path+"     "+selImageList.get(1).path );
                }
            }
        }else if (resultCode == ImagePicker.RESULT_CODE_BACK){//预览图片返回
            if (data!=null&&requestCode == REQUEST_CODE_PREVIEW){
                ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_IMAGE_ITEMS);
                if (images!=null){
                    selImageList.clear();
                    selImageList.addAll(images);
                    adapter.setImages(selImageList);
                }
            }
        }

    }
}

最后就是我在源码上的修改了,

首先是ImageRecyclerAdapter.java,这里我只粘出我添加的代码,先写一个函数来更新CheckBox的状态

public void updatecheck(ImageViewHolder holder,int position){
        holder.cbCheck.setChecked(false);
        for (int j = 0;j<mSelectedImages.size();j++){
            if (mSelectedImages.get(j).equals(images.get(position-1))){
                holder.cbCheck.setChecked(true);
            }
        }

    }
然后在onBindViewHolder里面进行调用

接着是ImageGrideActivity.java,在activity的回调函数里面设置刷新,注意要放在resultCode为ImagePicker.RESULT_CODE_BACK的条件里面,即:

if (resultCode == ImagePicker.RESULT_CODE_BACK) {
                isOrigin = data.getBooleanExtra(ImagePreviewActivity.ISORIGIN, false);
                mRecyclerAdapter.notifyDataSetChanged();
            }
写到这儿,之前我所说的bug就解决了,另外发现,,,还有一个bug,,就是选择图片的预览界面的返回按钮点击后不会激起activity的回调,最后发现是没有findViewById,以及setOnClickListener,所以在ImagePreviewActivity初始化控件的时候添加上就可以了

mBtnBack = (ImageView) topBar.findViewById(R.id.btn_back);
        mBtnBack.setVisibility(View.VISIBLE);
        mBtnBack.setOnClickListener(this);

到这儿所有想要的效果就都实现了,欢迎各路大神指点。






















  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android 仿QQ图片选择器,包含图片裁剪,浏览大图功能。   博客地址:http://blog.csdn.net/junzia/article/details/53091606简单使用示例如需使用图片选择器功能,将chooser加入为依赖工程,然后使用指定功能:选择单张图片如果需要选择单张图片,调用:Intent intent=new Intent(IcFinal.ACTION_ALBUM); intent.putExtra(IcFinal.INTENT_MAX_IMG,1);   startActivityForResult(intent,1);裁剪如果需要选择单张图片并且裁剪,调用:Intent intent=new Intent(IcFinal.ACTION_ALBUM); intent.putExtra(IcFinal.INTENT_IS_CROP,true); startActivityForResult(intent,1);默认为圆形图片,大小为500*500。如果需要自行设定,给intent增加以下参数(目前功能未实现):intent.putExtra(IcFinal.INTENT_CROP_SHAPE,CropPath.SHAPE_RECT);   //矩形intent.putExtra(IcFinal.INTENT_CROP_WIDTH,512); //裁剪宽度intent.putExtra(IcFinal.INTENT_CROP_HEIGHT,280); //裁剪高度选择多张图片Intent intent=new Intent(IcFinal.ACTION_ALBUM); intent.putExtra(IcFinal.INTENT_MAX_IMG,9); startActivityForResult(intent,1);更多设置也许图片选择器默认的UI不符合你的要求,你可以选择利用ChooserSetting中的静态参数来更改图片选择器的效果:/**标题的背景颜色*/public static int TITLE_COLOR=0xFF584512;/**图片选择页,每行显示数*/public static int NUM_COLUMNS=3;/**图片加载失败的图片*/public static int errorResId=0;/**图片加载的占位图片*/public static int placeResId=R.mipmap.image_chooser_placeholder;/**图片加载的动画*/public static int loadAnimateResId=0;/**选中图片的滤镜颜色*/public static int chooseFilter=0x55000000;/**未被选中的图片的滤镜颜色*/public static int unChooseFilter=0;/**最新的图片集合显示名字*/public static String newestAlbumName="最新图片";/**最新图片集合的最大数量*/public static int newestAlbumSize=100;public static int albumPopupHeight=600;public static String tantoToast="";/**照片选择指示器*/public static IChooseDrawable chooseDrawable=new CircleChooseDrawable(true,0xFF25c2e6);如果这些也无法满足你的UI要求,你也可以参照EntryActivity重新写相册的入口Activity,参照CropActivity重写裁剪的入口Activity。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值