实现效果

--------------------------------------------------------------------------------------------------------------------
请在Github下查阅用法(最新更新和用法都在github上第一时间更新):
https://github.com/jaikydota/Android-ImagesPickers
--------------------------------------------------------------------------------------------------------------------

功能说明

Android-ImagesPickers是一个集图片选择(单选/多选)、拍照、裁剪、图片预览、图片显示容器的图片选择显示工具。使用方便,开发者仅需要几行的代码就可以集成Android整套图片“选裁显删”功能,可以通过设置参数选择自己想要使用的功能,Android-ImagesPickers自身并没有强制绑定某个图片加载器(如UIL,Glide,Fresco,Picasso),开发者可以根据自己项目需求给Android-ImagesPickers配置图片加载器。
也许有人会问:系统不是自带相册选择器吗,为什么还有做一个图片选择器呢,有必要吗?我告诉你很有必要。微信,QQ等等App它们都是自己带图片选择器,并没有直接调系统的图片选择器。为什么要这么做呢?我总结出以下几点,使用本图片选择器下面的问题你都不用考虑,就是这么的任性:
· 最大的问题就是兼容性了,手机厂商那么多,相册软件那么多从而引起各种奇葩的问题
· 有些手机拍照图片倒立情况(如三星和魅族)
· 拿到的bitmap或uri为空
· 非常频繁出现OOM
· 不支持多选
· 拍照/选择图片/裁剪视乎用起来有些麻烦,加上处理一些旋转、裁剪、压缩就更加麻烦了,代码多得不行不行的。
· 系统的图片选择UI上与自己APP样式不统一
· 有些不支持图片旋转
· ....

Demo展示

下面的Demo图片按显示顺序:

· 图片裁剪
· 图片预览
· 图片容器
· 图片容器带删除
· 图片容器自定义每行数量

   
  

如何部署

一:配置Gradle抓取

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

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

<!-- 从sdcard中读取数据的权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 往sdcard中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

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

public class GlideLoader implements ImageLoader {@Overridepublic void displayImage(Context context, String path, ImageView imageView) {Glide.with(context).load(path).placeholder(com.jaiky.imagespickers.R.drawable.global_img_default).centerCrop().into(imageView);}}

四:配置 ImageConfig

UI 视图配置
 ImageConfig imageConfig = new ImageConfig.Builder(new GlideLoader())// 修改状态栏颜色 .steepToolBarColor(getResources().getColor(R.color.blue))// 标题的背景颜色 .titleBgColor(getResources().getColor(R.color.blue))// 提交按钮字体的颜色 .titleSubmitTextColor(getResources().getColor(R.color.white))// 标题颜色.titleTextColor(getResources().getColor(R.color.white)).build();

多选

 ImageConfig imageConfig= new ImageConfig.Builder(new GlideLoader()).steepToolBarColor(getResources().getColor(R.color.blue)).titleBgColor(getResources().getColor(R.color.blue)).titleSubmitTextColor(getResources().getColor(R.color.white)).titleTextColor(getResources().getColor(R.color.white))// 开启多选   (默认为多选) .mutiSelect()// 多选时的最大数量   (默认 9 张).mutiSelectMaxSize(9)// 开启拍照功能 (默认关闭).showCamera()// 已选择的图片路径.pathList(path)// 拍照后存放的图片路径(默认 /temp/picture) (会自动创建).filePath("/temp/picture").build();ImageSelector.open(MainActivity.this, imageConfig);   // 开启图片选择器

单选

 ImageConfig imageConfig= new ImageConfig.Builder(new GlideLoader()).steepToolBarColor(getResources().getColor(R.color.blue)).titleBgColor(getResources().getColor(R.color.blue)).titleSubmitTextColor(getResources().getColor(R.color.white)).titleTextColor(getResources().getColor(R.color.white))// 开启单选   (默认为多选) .singleSelect()// 开启拍照功能 (默认关闭).showCamera()// 拍照后存放的图片路径(默认 /temp/picture) (会自动创建).filePath("/temp/picture").build();ImageSelector.open(MainActivity.this, imageConfig);   // 开启图片选择器

单选1:1便捷裁剪
//配置ImageConfig添加方法
// (裁剪默认配置:关闭    比例 1:1    输出分辨率  500*500)
.crop()  

单选自定义裁剪

//配置ImageConfig添加方法
// (裁剪默认配置:关闭    比例 1:2    输出分辨率  500*1000)
.crop(1, 2, 500, 1000) 

设置显示容器

//配置ImageConfig添加方法
// (设置容器,默认会添加一个子视图到容器布局,继承自ViewGroup如Linearlayout
// 注意容器布局中不要有其他子视图,可自己对容器布局设置宽度、Margin)
// 默认每行显示4个,不带删除
.setContainer(ViewGroup container) 

容器自定义每行显示数量和是否删除

//配置ImageConfig添加方法
//参数:1、显示容器,2、每行显示数量(建议不要超过8个),是否可删除(默认不带删除)
.setContainer(linearLayout, 6, true)

关闭图片预览

//配置ImageConfig添加方法
// (关闭图片预览功能,默认开启)
.closePreview() 

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

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == ImageSelector.IMAGE_REQUEST_CODE && resultCode == RESULT_OK && data != null) {// 获取选中的图片路径列表 Get Images Path ListList<String> pathList = data.getStringArrayListExtra(ImageSelectorActivity.EXTRA_RESULT);for (String path : pathList) {Log.i("ImagePath", path);}}
}

代码示例:

public class MainActivity extends AppCompatActivity {private Button btn1, btn2;private TextView tv1;private ArrayList<String> path = new ArrayList<>();public static final int REQUEST_CODE = 123;private ImageConfig imageConfig;private LinearLayout llContainer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn1 = (Button) findViewById(R.id.btn1);btn2 = (Button) findViewById(R.id.btn2);tv1 = (TextView) findViewById(R.id.tv1);llContainer = (LinearLayout) findViewById(R.id.llContainer);btn1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {imageConfig = new ImageConfig.Builder(new GlideLoader()).steepToolBarColor(getResources().getColor(R.color.titleBlue)).titleBgColor(getResources().getColor(R.color.titleBlue)).titleSubmitTextColor(getResources().getColor(R.color.white)).titleTextColor(getResources().getColor(R.color.white))// 开启单选   (默认为多选).singleSelect()// 裁剪 (只有单选可裁剪)//.crop()// 开启拍照功能 (默认关闭).showCamera()// 设置显示容器.setContainer(llContainer).requestCode(REQUEST_CODE).build();ImageSelector.open(MainActivity.this, imageConfig);}});btn2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {imageConfig = new ImageConfig.Builder(new GlideLoader()).steepToolBarColor(getResources().getColor(R.color.titleBlue)).titleBgColor(getResources().getColor(R.color.titleBlue)).titleSubmitTextColor(getResources().getColor(R.color.white)).titleTextColor(getResources().getColor(R.color.white))// 开启多选   (默认为多选).mutiSelect()// 多选时的最大数量   (默认 9 张).mutiSelectMaxSize(9)// 设置图片显示容器,参数:(1、显示容器,2、每行显示数量(建议不要超过8个),是否可删除).setContainer(llContainer, 4, true)// 已选择的图片路径.pathList(path)// 拍照后存放的图片路径(默认 /temp/picture).filePath("/temp")// 开启拍照功能 (默认关闭).showCamera().requestCode(REQUEST_CODE).build();ImageSelector.open(MainActivity.this, imageConfig);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {List<String> pathList = data.getStringArrayListExtra(ImageSelectorActivity.EXTRA_RESULT);tv1.setText("");for (String path : pathList) {tv1.append(path);tv1.append("\n");}path.clear();path.addAll(pathList);}}
}

--------------------------------------------------------------------------------------------------------------------
查看及获取源代码:
https://github.com/jaikydota/Android-ImagesPickers
--------------------------------------------------------------------------------------------------------------------

声明

欢迎转载,但请保留文章原始出处
作者:Jaiky_杰哥 
出处:http://blog.csdn.net/jaikydota163/article/details/52098880

Android实用视图动画及工具系列之九:漂亮的图片选择器,高性能防崩溃图片选择工具相关推荐

  1. Android实用视图动画及工具系列之三:表情加载动画和失败加载动画,人物加载动画

    实现效果 功能说明 网速慢时,加载网络数据时,界面怎么处理才美观?载入失败或网络丢包时,如何让界面显得更和谐?这一直是开发人员和美工人员不绝于耳的问题,为了达到功能和UI的完美交互,我们不得不做一些基 ...

  2. android添加购物车动画、天气应用、渐变状态栏、文件选择器等源码

    Android精选源码 支持无限轮播的广告控件,提供gif动图支持. android使用SVGAPlayer播放动画源码 Android添加购物车动画 Android 仿酷欧天气应用源码 一个Andr ...

  3. android 仿照ios 图片选择,GitHub - wildma/PictureSelector: Android 图片选择器(仿 IOS 图片选择控件)...

    PictureSelector Android 图片选择器(仿 IOS 图片选择控件) 效果图 功能特点 支持通过拍照获取图片 支持通过相册获取图片 支持图片是否裁剪两种场景 支持仿 IOS 底部弹出 ...

  4. Android实用技巧.动画效果(二)

    LayoutAnimationController实现子布局进入动画效果 以listView为例设置item进入动画: 首先设置list界面 <?xml version="1.0&qu ...

  5. Android实现蝴蝶动画,Android中的动画具体解释系列——飞舞的蝴蝶

    这一篇来使用逐帧动画和补间动画来实现一个小样例,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包含以下几个子类: AlphaAnimation ...

  6. Android中的动画详解系列【2】——飞舞的蝴蝶

    这一篇来使用逐帧动画和补间动画来实现一个小例子,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包括下面几个子类: AlphaAnimation ...

  7. Android实现蝴蝶动画,Android中的动画具体解释系列【2】——飞舞的蝴蝶

    这一篇来使用逐帧动画和补间动画来实现一个小样例,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包含以下几个子类: AlphaAnimation ...

  8. android的视图动画,Android 视图动画(视图动画代码实现)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 概述 这些标签,都对应一个类,但他们都是派生自Animation类. scale ScaleAnimation alpha AlphaAnimation ...

  9. 小米范工具系列之九:小米范子域名收集工具

    小米范子域名收集工具为一款收集子域名(二级域名.三级域名.四级域名)的工具. 此工具使用java 1.8以上版本运行. 工具的工作流程如下: // 1.获取常用记录类型.MX NS SOA // 2. ...

  10. 自己动手打造工具系列之自动刷新简历

    0×00 背景 话说搞安全的大佬们都非常忙,自己在一步一步成长中无暇顾及其他琐碎的事情,比如让猎头注意到各位大佬.如何让猎头和大厂注意到自己呢?第一.提高自己在整个行业的曝光度:第二.定时刷新自己的简 ...

最新文章

  1. Kafka-0.10.0.0 集群高可靠实验
  2. 解析搜狗实验室精简版数据
  3. 遍历C#属性的通用方法
  4. xcode快捷键(二)
  5. Android WebView实现长截图
  6. 微型计算机系统结构中的总线,微型计算机的总线结构
  7. 路由器和交换机的原理
  8. 推荐:碎碎念情境记忆法——最适合程序员的背单词方法
  9. 有什么方法可以把WPS转为Word:小白教你一招搞定
  10. cairosvg在linux中的安装_Cairo编程
  11. 论汽车车机快速启动与开机动画、倒车影像三者关系
  12. 企业官网小程序搭建教程
  13. 项目开发技术点、困难点总结——2020-2021年
  14. android探索宇宙app,AR研学星系探索app
  15. 骨架屏 之 Vue SSR(快捷简易版本解决方案)
  16. 用Excel做一个简易的投票工具
  17. ​大厂产品经理面试题
  18. 不能安装64位office提示已安装32位的
  19. 3D 建模软件哪家强?没有最好只有更合适,小白建议学习这3个
  20. 什么是Odoo ERP:部署方式、业务集成、成本投入、发展与未来

热门文章

  1. 本地搭建Git服务器,两台电脑共享代码如此简单
  2. M. Bottle Arrangements
  3. 自习室 《大学生创新创业课程设计》
  4. [经验教程]2022微信怎么给微信好友批量群发消息?
  5. QT教程:QT的基本了解
  6. NeHe OpenGL系列教程(中英文版附带VC++源码)中英文系列
  7. 【机器学习-白板推导系列】学习笔记---支持向量机和主成分分析法
  8. 什么是数字示波器的垂直分辨率
  9. 编程十年 (13):毁人不倦1
  10. PS中的LAB颜色模式有什么作用?给人像磨皮就很实用!