AndroidPicturePicker

项目地址: AndroidPicturePicker   简介:基于Laevatein扩展的图片选择器,可以让开发者自由选择图片加载库,比如可配置为Picasso

Screen Shot

 


地址:https://github.com/ValuesFeng/AndroidPicturePicker

android-multiple-images-selector

项目地址: android-multiple-images-selector   简介:一个选择图片的库,支持设置选择图片的张数,支持过滤小图片。 地址:https://github.com/zfdang/android-multiple-images-selector

How does it work (GIF)

 



最强的图片选择器-GalleryFinal

首先非常感谢对GalleryFinal提出意见和想法的童鞋们,使得GalleryFinal经过重重迭代变得完善起来。

GitHub地址   Demo APK下载    

简述

GalleryFinal是一个图片选择(单选/多选)、拍照、编辑、裁剪及旋转为一身的图片选择器。使用方便,功能可自己配置,GalleryFinal还可以根据开发者的喜好来选择主题,当然也支持自定义主题。而且GalleryFinal自身并没有强制绑定某个ImageLoader,开发者可以根据自己项目给GalleryFinal配置图片加载器。GalleryFinal还放弃了startActivityForResult+onActivityResult来获取选择结果,而是采用事件回调的机制。(我觉得startActivityForResult+onActivityResult太麻烦了,同意的点个赞吧,呵呵~)。GalleryFinal经过三四个月的版本迭代,修复bug,优化需求,已经处于稳定的状态。

也许有人会问:系统不是有相册选择器吗,为什么还有做一个GalleryFinal呢,有必要吗?我告诉你很有必要。微信,QQ等等app它们都是自己带图片选择器,并没有直接调系统的图片选择器。为什么要这么做呢?我总结出一下几点:

  • 最大的问题就是兼容性了,手机厂商那么多,相册软件那么多从而引起各种奇葩的问题

  • 有些手机拍照图片倒立情况(如三星和魅族)

  • 拿到的bitmap或uri为空

  • 非常频繁出现OOM

  • 不支持多选

  • 拍照/选择图片/裁剪视乎用起来有些麻烦,加上处理一些旋转、裁剪、压缩就更加麻烦了,代码多得不行不行的。

  • 系统的图片选择UI上与自己APP样式不统一

  • 有些不支持图片旋转

  • ....

使用GalleryFinal以上问题你都不用考虑,就是这么的任性。?

虽然现在Github图片选择有很多,比如lovetuzitong的MultiImageSelector,habzy的GridImagePicker,还有就是YancyYe的ImageSelector(ImageSelector似乎是在GalleryFinal 1.0版本基础上做的改版)但是GalleryFinal有自己独特的优势:

  • 长期维护及时修复bug

  • 虚心采纳好的意见和想法

  • 功能强大/UI美观/可配置性强

  • ……

如何使用

使用GalleryFinal只需要简单的几步:(这里只说AS使用方法,如果你还停留在eclipse时代请clone源码或下载最新的aar文件)

1、引入GalleryFinal

在build.gradle中添加以下语句:

compile 'cn.finalteam:galleryfinal:1.4.6'compile 'com.android.support:support-v4:23.1.1'

2、配置通用功能/主题/ImageLoader

这里只做基础的讲解,需要更详细的文档可见github

在你的Application中添加配置GallerFinal

//配置主题//ThemeConfig.CYANThemeConfig theme = new ThemeConfig.Builder()        ...        .build();//配置功能FunctionConfig functionConfig = new FunctionConfig.Builder()        .setEnableCamera(true)        .setEnableEdit(true)        .setEnableCrop(true)        .setEnableRotate(true)        .setCropSquare(true)        .setEnablePreview(true)        ...        .build();//配置imageloaderImageLoader imageloader = new UILImageLoader();      //设置核心配置信息 CoreConfig coreConfig = new CoreConfig.Builder(context, imageloader, theme)        .setDebug(BuildConfig.DEBUG)        .setFunctionConfig(functionConfig)        ...        .build();GalleryFinal.init(coreConfig);

GalleryFinal默认主题为DEFAULT(深蓝色),还自带主题:DARK(黑色主题)、CYAN(蓝绿主题)、ORANGE(橙色主题)、GREEN(绿色主题)和TEAL(青绿色主题),当然也支持自定义主题(Custom Theme),在自定义主题中用户可以配置字体颜色、图标颜色、更换图标、和背景色

  • 主题配置类说明

setTitleBarTextColor//标题栏文本字体颜色setTitleBarBgColor//标题栏背景颜色setTitleBarIconColor//标题栏icon颜色,如果设置了标题栏icon,设置setTitleBarIconColor将无效setCheckNornalColor//选择框未选颜色setCheckSelectedColor//选择框选中颜色setCropControlColor//设置裁剪控制点和裁剪框颜色setFabNornalColor//设置Floating按钮Nornal状态颜色setFabPressedColor//设置Floating按钮Pressed状态颜色setIconBack//设置返回按钮iconsetIconCamera//设置相机iconsetIconCrop//设置裁剪iconsetIconRotate//设置选择iconsetIconClear//设置清楚选择按钮icon(标题栏清除选择按钮)setIconFolderArrow//设置标题栏文件夹下拉arrow图标setIconDelete//设置多选编辑页删除按钮iconsetIconCheck//设置checkbox和文件夹已选iconsetIconFab//设置Floating按钮iconsetEditPhotoBgTexture//设置图片编辑页面图片margin外背景setIconPreview设置预览按钮iconsetPreviewBg设置预览页背景
  • 功能配置类说明

             全选i            setMutiSelect(boolean)//配置是否多选 setMutiSelectMaxSize(int maxSize)//配置多选数量 setEnableEdit(boolean)//开启编辑功能 setEnableCrop(boolean)//开启裁剪功能 setEnableRotate(boolean)//开启选择功能 setEnableCamera(boolean)//开启相机功能 setCropWidth(int width)//裁剪宽度 setCropHeight(int height)//裁剪高度 setCropSquare(boolean)//裁剪正方形 setSelected(List)//添加已选列表,只是在列表中默认呗选中不会过滤图片 setFilter(List list)//添加图片过滤,也就是不在GalleryFinal中显示 takePhotoFolter(File file)//配置拍照保存目录,不做配置的话默认是/sdcard/DCIM/GalleryFinal/ setRotateReplaceSource(boolean)//配置选择图片时是否替换原始图片,默认不替换 setCropReplaceSource(boolean)//配置裁剪图片时是否替换原始图片,默认不替换 setForceCrop(boolean)//启动强制裁剪功能,一进入编辑页面就开启图片裁剪,不需要用户手动点击裁剪,此功能只针对单选操作 setForceCropEdit(boolean)//在开启强制裁剪功能时是否可以对图片进行编辑(也就是是否显示旋转图标和拍照图标) setEnablePreview(boolean)//是否开启预览功能      
  • 图片加载器

开发者可以根据app现使用的ImageLoader来实现GalleryFinal ImageLoader,个人相对比较看好Glide,当然Fresco非常棒,不过它非常大。Picasso和UIL是老牌的ImageLoader也可以。至于Xutil3现在还不稳定,有些问题待修复。如果你有其他的ImageLoader也可以参考demo自行实现,如果有不明白之处加Q群(218801658)提问。

eg.

  • Glide

[java]  view plain  copy  
  1. public class GlideImageLoader implements cn.finalteam.galleryfinal.ImageLoader {  
  2.   
  3.     @Override  
  4.     public void displayImage(Activity activity, String path, final GFImageView imageView, Drawable defaultDrawable, int width, int height) {  
  5.         Glide.with(activity)  
  6.                 .load("file://" + path)  
  7.                 .placeholder(defaultDrawable)  
  8.                 .error(defaultDrawable)  
  9.                 .override(width, height)  
  10.                 .diskCacheStrategy(DiskCacheStrategy.NONE) //不缓存到SD卡  
  11.                 .skipMemoryCache(true)  
  12.                 //.centerCrop()  
  13.                 .into(new ImageViewTarget(imageView) {  
  14.                     @Override  
  15.                     protected void setResource(GlideDrawable resource) {  
  16.                         imageView.setImageDrawable(resource);  
  17.                     }  
  18.   
  19.                     @Override  
  20.                     public void setRequest(Request request) {  
  21.                         imageView.setTag(R.id.adapter_item_tag_key,request);  
  22.                     }  
  23.   
  24.                     @Override  
  25.                     public Request getRequest() {  
  26.                         return (Request) imageView.getTag(R.id.adapter_item_tag_key);  
  27.                     }  
  28.                 });  
  29.     }  
  30.   
  31.     @Override  
  32.     public void clearMemoryCache() {  
  33.     }  
  34. }  


3、启动GalleryFinal

  • 单选打开相册

GalleryFinal.openGallerySingle(REQUEST_CODE_GALLERY, mOnHanlderResultCallback);//带配置GalleryFinal.openGallerySingle(REQUEST_CODE_GALLERY, functionConfig, mOnHanlderResultCallback);
  • 多选打开相册

GalleryFinal.openGalleryMuti(REQUEST_CODE_GALLERY, mOnHanlderResultCallback);//带配置FunctionConfig config = new FunctionConfig.Builder(MainActivity.this)    .setMutiSelectMaxSize(8)    .build();GalleryFinal.openGalleryMuti(REQUEST_CODE_GALLERY, functionConfig, mOnHanlderResultCallback);
  • 拍照

GalleryFinal.openCamera(REQUEST_CODE_CAMERA, mOnHanlderResultCallback);//带配置GalleryFinal.openCamera(REQUEST_CODE_CAMERA, functionConfig, mOnHanlderResultCallback);
  • 裁剪

GalleryFinal.openCrop(REQUEST_CODE_CAMERA, mOnHanlderResultCallback);//带配置GalleryFinal.openCrop(REQUEST_CODE_CAMERA, functionConfig, mOnHanlderResultCallback);
  • 图片编辑

GalleryFinal.openEdit(REQUEST_CODE_CAMERA, mOnHanlderResultCallback);//带配置GalleryFinal.openEdit(REQUEST_CODE_CAMERA, functionConfig, mOnHanlderResultCallback);

技术原理

获取图片

通过内容提供者(Content Provider)获取到所有的图片信息,然后根据文件夹名称分类

图片加载

GalleryFinal通过ImageLoader接口对图片进行加载,图片质量,清晰度开发者自行决择。demo提供了UIL/Glide/Picsso/Fresco/xUtils3等框架的默认GalleryFinal ImageLoader实现

[java]  view plain  copy  
  1. public interface ImageLoader{  
  2.     void displayImage(Activity activity, String path, GFImageView imageView, Drawable defaultDrawable, int width, int height);  
  3.     void clearMemoryCache();  
  4. }  

其他

图片裁剪采用android-crop
图片缩放采用PhotoView


更多相关文章

  1. Android(安卓)-- 超全的 File,Bitmap,Drawable,Uri, FilePath ,byte
  2. Android(安卓)自定义 HorizontalScrollView 打造再多图片(控件)也
  3. android红米等关于读取本地文件夹图片获取路径的问题的解决
  4. Gradle 依赖关系中 compile和 implementation的区别
  5. android studio使用jni调用opencv库实现图片转换【详细实例】(二)
  6. android上的一个网络接口和图片缓存框架enif
  7. Mac下AndroidStudio中手动配置Gradle
  8. Android(安卓)指南针
  9. Android中利用OnTouchListener在ImageView中框选显示图片

随机推荐

  1. SQL中字符串中包含字符的判断方法
  2. 远程连接阿里云SqlServer 2012 数据库服
  3. SqlServer使用公用表表达式(CTE)实现无限级
  4. Android水波纹点击效果
  5. 【Android(安卓)Dev Guide - 03】 - Cont
  6. Android的图形系统
  7. android的Sprite,TiledLayer,LayerManage
  8. Android之TextView属性列表
  9. 浅谈android的selector背景选择器
  10. Android(安卓)性能优化之内存优化