Android 图片选择器(第一种)

实现效果






--------------------------------------------------------------------------------------------------------------------
请在Github下查阅用法(最新更新和用法都在github上第一时间更新):
--------------------------------------------------------------------------------------------------------------------

功能说明

Android-ImagesPickers是一个集图片选择(单选/多选)、拍照、裁剪、图片预览、图片显示容器的图片选择显示工具。使用方便,开发者仅需要几行的代码就可以集成Android整套图片“选裁显删”功能,可以通过设置参数选择自己想要使用的功能,Android-ImagesPickers自身并没有强制绑定某个图片加载器(如UIL,Glide,Fresco,Picasso),开发者可以根据自己项目需求给Android-ImagesPickers配置图片加载器。

也许有人会问:系统不是自带相册选择器吗,为什么还有做一个图片选择器呢,有必要吗?我告诉你很有必要。微信,QQ等等App它们都是自己带图片选择器,并没有直接调系统的图片选择器。为什么要这么做呢?我总结出以下几点,使用本图片选择器下面的问题你都不用考虑,就是这么的任性:
· 最大的问题就是兼容性了,手机厂商那么多,相册软件那么多从而引起各种奇葩的问题
· 有些手机拍照图片倒立情况(如三星和魅族)
· 拿到的bitmap或uri为空
· 非常频繁出现OOM
· 不支持多选
· 拍照/选择图片/裁剪视乎用起来有些麻烦,加上处理一些旋转、裁剪、压缩就更加麻烦了,代码多得不行不行的。
· 系统的图片选择UI上与自己APP样式不统一
· 有些不支持图片旋转
· ....


Demo展示

下面的Demo图片按显示顺序:
· 图片裁剪
· 图片预览
· 图片容器
· 图片容器带删除
· 图片容器自定义每行数量
   
  


如何部署

一:配置Gradle抓取

[java]  view plain  copy
  1. //目前只上传到了jcenter,在项目gradle下使用jcenter  
  2. //Currently only uploaded to the jcenter, under the project gradle use jcenter  
  3. allprojects {  
  4.     repositories {  
  5.         jcenter()  
  6.     }  
  7. }  
[java]  view plain  copy
  1. //在module模块的gradle中添加依赖  
  2. //Add dependencies in the module's gradle  
  3. dependencies {  
  4.     compile 'com.jaikydota.imagespickers:imagespickers:1.0.6'  
  5.   
  6.     //如果使用图片加载框架,添加依赖,下面用Glide示例  
  7.     compile 'com.github.bumptech.glide:glide:3.6.1'  
  8. }  

二:在 AndroidManifest.xml 中 添加 如下权限

[html]  view plain  copy
  1. <!-- 从sdcard中读取数据的权限 -->  
  2. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
  3. <!-- 往sdcard中写入数据的权限 -->  
  4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

三:创建图片加载器 (其中可以按照 喜好 使用不同的 第三方图片加载框架 以下为Glide示例)

[java]  view plain  copy
  1. public class GlideLoader implements ImageLoader {  
  2.   
  3.    @Override  
  4.    public void displayImage(Context context, String path, ImageView imageView) {  
  5.         Glide.with(context)  
  6.                 .load(path)  
  7.                 .placeholder(com.jaiky.imagespickers.R.drawable.global_img_default)  
  8.                 .centerCrop()  
  9.                 .into(imageView);  
  10.     }  
  11.   
  12. }  

四:配置 ImageConfig

UI 视图配置
[java]  view plain  copy
  1. ImageConfig imageConfig   
  2.     = new ImageConfig.Builder(new GlideLoader())  
  3.     // 修改状态栏颜色   
  4.     .steepToolBarColor(getResources().getColor(R.color.blue))  
  5.     // 标题的背景颜色   
  6.     .titleBgColor(getResources().getColor(R.color.blue))  
  7.     // 提交按钮字体的颜色   
  8.     .titleSubmitTextColor(getResources().getColor(R.color.white))  
  9.     // 标题颜色  
  10.     .titleTextColor(getResources().getColor(R.color.white))  
  11.     .build();  
多选
[java]  view plain  copy
  1. ImageConfig imageConfig  
  2.        = new ImageConfig.Builder(new GlideLoader())  
  3.        .steepToolBarColor(getResources().getColor(R.color.blue))  
  4.        .titleBgColor(getResources().getColor(R.color.blue))  
  5.        .titleSubmitTextColor(getResources().getColor(R.color.white))  
  6.        .titleTextColor(getResources().getColor(R.color.white))  
  7.        // 开启多选   (默认为多选)   
  8.        .mutiSelect()  
  9.        // 多选时的最大数量   (默认 9 张)  
  10.        .mutiSelectMaxSize(9)  
  11.        // 开启拍照功能 (默认关闭)  
  12.        .showCamera()  
  13.        // 已选择的图片路径  
  14.        .pathList(path)  
  15.        // 拍照后存放的图片路径(默认 /temp/picture) (会自动创建)  
  16.        .filePath("/temp/picture")  
  17.        .build();  
  18.   
  19.   
  20. mageSelector.open(MainActivity.this, imageConfig);   // 开启图片选择器  
单选
[java]  view plain  copy
  1. ImageConfig imageConfig  
  2.        = new ImageConfig.Builder(new GlideLoader())  
  3.        .steepToolBarColor(getResources().getColor(R.color.blue))  
  4.        .titleBgColor(getResources().getColor(R.color.blue))  
  5.        .titleSubmitTextColor(getResources().getColor(R.color.white))  
  6.        .titleTextColor(getResources().getColor(R.color.white))  
  7.        // 开启单选   (默认为多选)   
  8.        .singleSelect()  
  9.        // 开启拍照功能 (默认关闭)  
  10.        .showCamera()  
  11.        // 拍照后存放的图片路径(默认 /temp/picture) (会自动创建)  
  12.        .filePath("/temp/picture")  
  13.        .build();  
  14.   
  15.   
  16. mageSelector.open(MainActivity.this, imageConfig);   // 开启图片选择器  
单选1:1便捷裁剪
[java]  view plain  copy
  1. //配置ImageConfig添加方法  
  2. // (裁剪默认配置:关闭    比例 1:1    输出分辨率  500*500)  
  3. .crop()    
单选自定义裁剪
[java]  view plain  copy
  1. //配置ImageConfig添加方法  
  2. // (裁剪默认配置:关闭    比例 1:2    输出分辨率  500*1000)  
  3. .crop(125001000)   
设置显示容器
[java]  view plain  copy
  1. //配置ImageConfig添加方法  
  2. // (设置容器,默认会添加一个子视图到容器布局,继承自ViewGroup如Linearlayout  
  3. // 注意容器布局中不要有其他子视图,可自己对容器布局设置宽度、Margin)  
  4. // 默认每行显示4个,不带删除  
  5. .setContainer(ViewGroup container)   
容器自定义每行显示数量和是否删除
[java]  view plain  copy
  1. //配置ImageConfig添加方法  
  2. //参数:1、显示容器,2、每行显示数量(建议不要超过8个),是否可删除(默认不带删除)  
  3. .setContainer(linearLayout, 6true)  
关闭图片预览
[java]  view plain  copy
  1. //配置ImageConfig添加方法  
  2. // (关闭图片预览功能,默认开启)  
  3. .closePreview()   

五:在 onActivityResult 中获取选中的照片路径 数组 :

[java]  view plain  copy
  1. @Override  
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.  super.onActivityResult(requestCode, resultCode, data);  
  4.   if (requestCode == ImageSelector.IMAGE_REQUEST_CODE && resultCode == RESULT_OK && data != null) {  
  5.      // 获取选中的图片路径列表 Get Images Path List  
  6.      List<String> pathList = data.getStringArrayListExtra(ImageSelectorActivity.EXTRA_RESULT);  
  7.   
  8.      for (String path : pathList) {  
  9.          Log.i("ImagePath", path);  
  10.      }  
  11.   }  
  12. }  

代码示例:
[java]  view plain  copy
  1. public class MainActivity extends AppCompatActivity {  
  2.   
  3.     private Button btn1, btn2;  
  4.     private TextView tv1;  
  5.     private ArrayList<String> path = new ArrayList<>();  
  6.   
  7.     public static final int REQUEST_CODE = 123;  
  8.   
  9.     private ImageConfig imageConfig;  
  10.   
  11.     private LinearLayout llContainer;  
  12.   
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.   
  18.         btn1 = (Button) findViewById(R.id.btn1);  
  19.         btn2 = (Button) findViewById(R.id.btn2);  
  20.         tv1 = (TextView) findViewById(R.id.tv1);  
  21.         llContainer = (LinearLayout) findViewById(R.id.llContainer);  
  22.         btn1.setOnClickListener(new View.OnClickListener() {  
  23.             @Override  
  24.             public void onClick(View v) {  
  25.                 imageConfig = new ImageConfig.Builder(  
  26.                         new GlideLoader())  
  27.                         .steepToolBarColor(getResources().getColor(R.color.titleBlue))  
  28.                         .titleBgColor(getResources().getColor(R.color.titleBlue))  
  29.                         .titleSubmitTextColor(getResources().getColor(R.color.white))  
  30.                         .titleTextColor(getResources().getColor(R.color.white))  
  31.                         // 开启单选   (默认为多选)  
  32.                         .singleSelect()  
  33.                         // 裁剪 (只有单选可裁剪)  
  34.                         //.crop()  
  35.                         // 开启拍照功能 (默认关闭)  
  36.                         .showCamera()  
  37.                         // 设置显示容器  
  38.                         .setContainer(llContainer)  
  39.                         .requestCode(REQUEST_CODE)  
  40.                         .build();  
  41.                 ImageSelector.open(MainActivity.this, imageConfig);  
  42.             }  
  43.         });  
  44.         btn2.setOnClickListener(new View.OnClickListener() {  
  45.             @Override  
  46.             public void onClick(View v) {  
  47.                 imageConfig = new ImageConfig.Builder(  
  48.                         new GlideLoader())  
  49.                         .steepToolBarColor(getResources().getColor(R.color.titleBlue))  
  50.                         .titleBgColor(getResources().getColor(R.color.titleBlue))  
  51.                         .titleSubmitTextColor(getResources().getColor(R.color.white))  
  52.                         .titleTextColor(getResources().getColor(R.color.white))  
  53.                         // 开启多选   (默认为多选)  
  54.                         .mutiSelect()  
  55.                         // 多选时的最大数量   (默认 9 张)  
  56.                         .mutiSelectMaxSize(9)  
  57.                         // 设置图片显示容器,参数:(1、显示容器,2、每行显示数量(建议不要超过8个),是否可删除)  
  58.                         .setContainer(llContainer, 4true)  
  59.                         // 已选择的图片路径  
  60.                         .pathList(path)  
  61.                         // 拍照后存放的图片路径(默认 /temp/picture)  
  62.                         .filePath("/temp")  
  63.                         // 开启拍照功能 (默认关闭)  
  64.                         .showCamera()  
  65.                         .requestCode(REQUEST_CODE)  
  66.                         .build();  
  67.                 ImageSelector.open(MainActivity.this, imageConfig);  
  68.             }  
  69.         });  
  70.     }  
  71.   
  72.   
  73.     @Override  
  74.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  75.         super.onActivityResult(requestCode, resultCode, data);  
  76.         if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {  
  77.             List<String> pathList = data.getStringArrayListExtra(ImageSelectorActivity.EXTRA_RESULT);  
  78.   
  79.             tv1.setText("");  
  80.             for (String path : pathList) {  
  81.                 tv1.append(path);  
  82.                 tv1.append("\n");  
  83.             }  
  84.   
  85.             path.clear();  
  86.             path.addAll(pathList);  
  87.         }  
  88.     }  
  89. }  

--------------------------------------------------------------------------------------------------------------------
查看及获取源代码:
--------------------------------------------------------------------------------------------------------------------
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Android上实现类似微信的图片选择器功能,通常会涉及自定义Activity、文件管理、以及一些UI组件的组合。以下是实现的一个基本步骤: 1. **创建Activity**:首先,你需要创建一个新的Activity,这个Activity通常是一个Fragment或者DialogFragment,它需要包含一个RecyclerView或者其他列表控件来展示用户可以选择的图片。 2. **文件路径管理**:使用Android的`Environment.getExternalStorageDirectory()`获取外部存储路径,并创建一个文件夹来存放临时选择的图片。 3. **图像浏览组件**:使用第三方库如`com.nostra13.universalimageloader`来预览图片,或者使用系统自带的ACTION_GET_CONTENT Intent来打开系统的图库,让用户自行选择图片。 4. **选中操作**:当用户选择图片后,将选中的图片路径添加到列表中,并同步到应用内部的数据结构中,以便后续处理。 5. **删除机制**:提供一个清除已选择图片的功能,这通常涉及到从文件夹中删除对应的文件,并更新列表显示。 6. **保存和返回**:当用户完成选择后,你可以将所有选定的图片路径打包成一个数据对象,然后通过finish()方法关闭活动并返回结果给调用者。 **相关问题--:** 1. 如何处理用户取消选择的情况? 2. 是否有现成的开源库可以直接使用来做微信风格的图片选择器? 3. 怎样保证用户选择的照片不会超出应用程序的存储空间限制?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值