安卓选取多张手机照片同时可以拍照相片然后预览

本文介绍如何使用multi-image-selector第三方库在Android应用中实现多张图片选择和预览功能,包括实现步骤、效果图及代码示例。

一:介绍

这篇博客介绍的功能就是选取多张图片预览并拿到照片路径,大家根据照片路径可以做各种各样的处理(预览,上传,压缩,等等),有这种需求的Android开发攻城狮可以借鉴借鉴.

二:效果图

先贴几张效果图给大伙瞧瞧

1.选择照片界面,第一个拍摄照片就是调用照相机拍照获取照片



2.照片选择完成界面,右上角的对勾是我加上的,点击取消选择,对勾消失,再点击再次选择,对勾再出现,给用户友好的交互体验



3.项目结构图



三:实现步骤

1.新建项目之后,依赖第三方库multi-image-selector demo会在文章末尾贴出,demo中含有这个multi-image-selector库

2.记得加权限

<!-- 在SD卡中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 读写SD卡权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
还要注册选择图片activity

<activity android:name="me.nereo.multi_image_selector.MultiImageSelectorActivity" />

3.在mainactivity的布局文件,里面有一个button用来启动选择图片界面,有一个gridview用于展示选择的图片(预览图片)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.zidiv.multiphoto.MainActivity">

    <Button
        android:id="@+id/btn_selectphoto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="选择照片" />

    <GridView
        android:id="@+id/gv_show"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:horizontalSpacing="5dp"
        android:listSelector="#ffffff"
        android:numColumns="3"
        android:verticalSpacing="10dp"></GridView>

</LinearLayout>

4.在mainactivity中,设置按钮的点击事件,startActivityForResult启动intent到选择照片的界面

Intent intent = new Intent(MainActivity.this, MultiImageSelectorActivity.class);
        // 是否显示拍摄图片,显示
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true);
        // 最大可选择图片数量 30张
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, maxNum);
        // 选择模式,选取多张
        intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_MULTI);
        // 默认选择
        if (mSelectPath != null && mSelectPath.size() > 0) {
            intent.putExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST, mSelectPath);
        }
        startActivityForResult(intent, REQUEST_IMAGE);

5.重写onActivityResult拿到选择图片的路径

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_IMAGE) {
            if (resultCode == RESULT_OK) {
                mSelectPath = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
                for (String p : mSelectPath) {
                    //加入最后选择的集合
                    finalSelectPaths.add(p);
                    Log.e("路径", p);
                    //加载缩略图
                    Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromSd(p, 200, 240);
                    bitmapList.add(bitmap);
                }
                imgAdapter = new ImgAdapter(context, bitmapList);
                gv_show.setAdapter(imgAdapter);
                //接口回调
                imgAdapter.setOnItemClickLis(new ImgAdapter.onItemClickLis() {
                    @Override
                    public void onItemClick(ImageView img_marke, int position) {
                        flag = !flag;
                        if (!flag) {
                            img_marke.setVisibility(View.INVISIBLE);
                            finalSelectPaths.remove(position);
                            //遍历
                            for (int i = 0; i < finalSelectPaths.size(); i++) {
                                Log.e("最后的路径", finalSelectPaths.get(i));
                            }
                        } else {
                            img_marke.setVisibility(View.VISIBLE);
                            finalSelectPaths.add(position, mSelectPath.get(position));
                            //遍历
                            for (int i = 0; i < finalSelectPaths.size(); i++) {
                                Log.e("最后的路径", finalSelectPaths.get(i));
                            }
                        }
                    }
                });
            }
        }
    }

四:最后的话

好了,有了这个multi-image-selector第三方库实现起来还是很简单的,这里是demo地址,点击下载demo,如果大家有什么意见欢迎提出!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值