android微信图片选择器

代码项目github地址 IMAlbum

一、业务场景

1、聊天界面发送图片==>多选点选+有右上角"发送"+图片预览==>图片预览支持右上角"发送"逻辑
2、发表动态==>多选点选+右上角"完成" + 图片预览==>图片预览支持右上角"完成"逻辑
3、个人资料更改头像==>单选点选 + 图片预览截图==>图片预览截图支持右上角"使用"逻辑

二、Intent参数设计;(Intent传参原则:尽量不要使用自定义类型专递参数)

1、最基本的参数传递(可选图片最大数目、右上角的标题、单选模式还是多选模式、返回结果的参数)

    /** 最大图片选择次数,int类型,默认9 */
    public static final String EXTRA_SELECT_COUNT = "max_select_count";

    /** 发送按钮的标题  如完成或发送 */
    public static final String EXTRA_SUBMIT_TITLE = "extra_submit_title";

    /** 图片选择模式,默认多选 */
    public static final String EXTRA_SELECT_MODE = "select_count_mode";

    /** 选择结果,返回为 ArrayList<String> 图片路径集合  */
    public static final String EXTRA_RESULT = "select_result";

2、扩展部分参数传递(图片选择界面的第一个Item是否显示拍照功能、预览的activity是否支持"勾选取消结束"勾选按钮)

    /** 是否显示相机,默认显示 */
    public static final String EXTRA_SHOW_CAMERA = "show_camera";

    /** 是否跳转到ImageDetailCheckPicsAct上*/
    public static final String EXTRA_JUMPTOCHECKPICS = "is_jumpto_checkpics";

3、在"发表动态选择"已经选了5张图片,再去选择图片--图片浏览器需要将已选的图片勾选状态设置为勾选

    /** 默认已被选择集 */
    public static final String EXTRA_DEFAULT_SELECTED_LIST = "default_list";

4、截图功能(单选模式下,如果启动截图模式,那么选择后跳转截图界面)

    /** 单选是否原图返回或先跳转截图后返回 */
    public static final String RESIZEBIT = "RESIZEBIT";
    /** 截图保存的路径 */
    public static final String RESULT = "resultPath";
    /** 单选 是否截图 */
    public static final String MODE_SCALE_BOOLEAN = "MODE_SCALE_BOOLEAN";
    /** 单选 截图区域蓝色框的宽;单位dp */
    public static final String SCALEW = "scaleW";
    /** 单选 截图区域蓝色框的高;单位dp */
    public static final String SCALEH = "SCALEH";
    /** 单选 截图后图片保存的像素宽;单位sp */
    public static final String LIMITW = "limitWidth";
    /** 单选 截图后图片保存的像素高;单位sp */
    public static final String LIMITH = "limitHight";
    /** 单选截图的保存的路径 */
    public static final String MODE_SCALE_PATH = "MODE_SCALE_PATH";

三、理清楚需求之后进行设计

此处省略;分享的代码实现的功能,尚未设计优化代码可读性较差
代码项目github地址 IMAlbum

四、代码使用方法

  
    public static void jumpToSelectPics(Activity mContext, boolean isShowCamera, int selectMaxCount, int selectMode,
            String submitBtnStr, boolean isJumpToCheckPics, ArrayList<String> hasSelectList) {
        Intent intent = new Intent(mContext, MultiImageSelectorActivity.class);

        // whether show camera
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, isShowCamera);

        // String of submit button
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SUBMIT_TITLE, submitBtnStr);

        // String of submit button
        intent.putExtra(MultiImageSelectorFragment.EXTRA_JUMPTOCHECKPICS, isJumpToCheckPics);

        // max select image amount
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, selectMaxCount);

        // select mode (MultiImageSelectorActivity.MODE_SINGLE OR MultiImageSelectorActivity.MODE_MULTI)
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, selectMode);

        // EXTRA_DEFAULT_SELECTED_LIST

        if (hasSelectList != null) {
            intent.putStringArrayListExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST, hasSelectList);
        }
        //
        mContext.startActivityForResult(intent, REQUEST_IMAGE);
    }


    /**
     * 图片格式jpeg
     * @param picResultPath 图片的要保存的地址
     * @param scaleW 截图区域的宽度   单位 dp
     * @param scaleH 截图区域的高度   单位 dp
     * @param limtWidth 裁剪出来的图的宽度 
     * @param limitHight 裁剪出来的图的高度
     * @param isScaleImg 是否按照 limtWidth、limitHight的比例进行放大缩小
     * @description:
     * @author zhangjianlin (990996641)
     * @date 2015年6月11日 下午4:25:00
     */
    public static void jumpToSelecAndCropImg(Activity mContext, String picResultPath, int scaleW, int scaleH,
            int limtWidth, int limitHight, boolean isScaleImg) {
        Intent intent = new Intent(mContext, MultiImageSelectorActivity.class);

        // whether show camera
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, false);

        // max select image amount
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 1);
        // select mode (MultiImageSelectorActivity.MODE_SINGLE OR MultiImageSelectorActivity.MODE_MULTI)
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_SINGLE);
        // intent.putExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_CROP_CAMERA, isScaleImg);

        intent.putExtra(CropImageAct.RESIZEBIT, isScaleImg);
        intent.putExtra(CropImageAct.RESULT, picResultPath);
        intent.putExtra(CropImageAct.SCALEW, scaleW);
        intent.putExtra(CropImageAct.SCALEH, scaleH);
        intent.putExtra(CropImageAct.LIMITW, limtWidth);
        intent.putExtra(CropImageAct.LIMITH, limitHight);

        mContext.startActivityForResult(intent, REQUEST_CROPIMAGE);
    }

    /**
     * @Description:选择单张图片不剪切
     * 返回值  ArrayList
     switch (requestCode) {
     case IntentUtils.REQUEST_IMAGE:
                if (data != null) {
                    ArrayList<String> resultList = data
                            .getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
                }
                break;
     }
     * @param mContext
     */
    public static void jumpToSelectNoCropImg(Activity mContext) {
        jumpToSelectPics(mContext, false, 2, MultiImageSelectorActivity.MODE_SINGLE);
    }


五、baseselectactivity类

    /**
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }
 <activity android:name="com.huika.huixin.control.me.activity.PersonalInfoAct" 
            android:launchMode="singleTask" 
            android:configChanges="orientation|keyboardHidden|screenSize"
            >
        </activity> 
 
  
  
 * @Description: 选择图片的act
 * @author zhangjianlin
 * @date 2015-9-24 下午2:06:28
 */
public abstract class BaseSelectPicAct extends Activity {

    private final int CROPCAMARA_TAKEPHOTO = 1003;
    private final int CROPCAMARA_SELECTFROMALBUM = 1004;

    /** 从 拍照中选择 */
    private final int ACTIVITY_RESULT_CROPCAMARA_WITH_DATA = 1;
    private File mPicFile; // 选择图片路径
    private String picPath;

    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }
    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) { return; }
        switch (requestCode) {
            case IntentUtils.REQUEST_IMAGE: // 选择照片
                /** add by zjl */
                if (null != data) {
                    ArrayList<String> resultList = data
                            .getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
                    hasSelectPicsNoCrop(resultList);
                    /* if (null != resultList) {
                     * 
                     * } */
                }
                break;

            case ACTIVITY_RESULT_CROPCAMARA_WITH_DATA: // 拍照
                /* if (mPicFile.exists()) {
                 * 
                 * } */
                if (mPicFile == null && !TextUtils.isEmpty(picPath)) mPicFile = new File(picPath);
                if (null != mPicFile && mPicFile.exists()) {
                    hasTakePhotoPic(mPicFile);
                }
                break;
            case IntentUtils.REQUEST_CROPIMAGE:
                if (null == data) { return; }
                if (TextUtils.isEmpty(mPicFile.toString()) || !mPicFile.exists()) {
                    Toast.makeText(this, "没有选择图片", Toast.LENGTH_LONG).show();
                    return;
                }
                String mPicNativePath = Environment.getExternalStorageDirectory().getAbsolutePath() +"/image" + mPicFile.getName();
                try {
                    FilecacheTool.copyFile(mPicFile.getAbsolutePath(), mPicNativePath);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                hasPicsCroped(mPicNativePath);
                break;
        }
    };

    protected void selectPhoto() {
        ImageTool.jumpToSelectNoCropImg(this);
    }

    protected void selectPhotoAndCrop() {
        mPicFile = ImageTools.initTempFile();
        /* photoIntent = ImageTools.cropPhotoOfCompressFromGalleryIntent(Uri.fromFile(mPicFile)); startActivityForResult(photoIntent, Constant.ACTIVITY_RESULT_CROPIMAGE_WITH_DATA); */
        ImageTool.jumpToSelecAndCropImg(this, mPicFile.toString(), 300, 300, 600, 600, true);
    }

    /** 拍照 */
    protected void takePhoto() {
        if (!ImageTools.isSDCardExist()) {
            Toast.makeText(this, "没有内存卡", Toast.LENGTH_LONG).show();
            return;
        }
        mPicFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/"
                + System.currentTimeMillis() + ".jpg");
        picPath = mPicFile.getAbsolutePath();
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mPicFile));
        startActivityForResult(intent, ACTIVITY_RESULT_CROPCAMARA_WITH_DATA);
    }

    protected abstract void hasSelectPicsNoCrop(ArrayList<String> resultList);

    protected abstract void hasTakePhotoPic(File mPicFile);

    protected abstract void hasPicsCroped(String mPicNativePath);

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("picPathCache", picPath);
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        picPath = savedInstanceState.getString("picPathCache");
        super.onRestoreInstanceState(savedInstanceState);
    }
}

六、图库选择simple


public class AlbumTestAct extends BaseSelectPicAct implements OnClickListener {

    private ImageView iv_showresult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_albumtest);
        findViewById(R.id.tv_takephoto).setOnClickListener(this);
        findViewById(R.id.tv_selectphoto).setOnClickListener(this);
        findViewById(R.id.tv_selectandcrop).setOnClickListener(this);
        iv_showresult = (ImageView) findViewById(R.id.iv_showresult);

    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.tv_takephoto:
            takePhoto();
            break;
        case R.id.tv_selectphoto:
            selectPhoto();
            break;
        case R.id.tv_selectandcrop:
            selectPhotoAndCrop();
            break;

        default:
            break;
        }
    }

    @Override
    protected void hasSelectPicsNoCrop(ArrayList<String> resultList) {
        // TODO Auto-generated method stub
        if (null != resultList) {
            if(resultList.size() > 0)
            {
                ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(resultList.get(0)), iv_showresult);
            }
        }
    }

    @Override
    protected void hasTakePhotoPic(File mPicFile) {
        // TODO Auto-generated method stub
        if(null != mPicFile && mPicFile.exists())
        {
        ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(mPicFile.getPath()), iv_showresult);
        }
    }

    @Override
    protected void hasPicsCroped(String mPicNativePath) {
        // TODO Auto-generated method stub
        if(null != mPicNativePath && new File(mPicNativePath).exists())
        {
        ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(mPicNativePath), iv_showresult);
        }
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,359评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,010评论 4 62
  • 圣地亚哥一日游,下午是导游带领我们去老城浏览,只安排一小时的时间,我预先又没有查资料,所以是走马观花。 坐落在圣地...
    Lucas的未来阅读 463评论 2 1
  • 离家很久了,想孩子。走在街上,听到“妈妈”就下意识的回头,看到不是自己的宝宝,就心里空空荡荡,想到自己给了...
    ab香香阅读 243评论 0 0
  • 感赏新的一天得到来,太阳升起来 感赏我还活着能健康平安 感赏一切
    翟美丽阅读 163评论 0 0