资讯专栏INFORMATION COLUMN

[Android]史上最强的图片选择器-GalleryFinal

melody_lql / 2904人阅读

摘要:而且自身并没有强制绑定某个,开发者可以根据自己项目给配置图片加载器。还放弃了来获取选择结果,而是采用事件回调的机制。微信,等等它们都是自己带图片选择器,并没有直接调系统的图片选择器。

首先非常感谢对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.CYAN
ThemeConfig theme = new ThemeConfig.Builder()
        ...
        .build();
//配置功能
FunctionConfig functionConfig = new FunctionConfig.Builder()
        .setEnableCamera(true)
        .setEnableEdit(true)
        .setEnableCrop(true)
        .setEnableRotate(true)
        .setCropSquare(true)
        .setEnablePreview(true)
        ...
        .build();

//配置imageloader
ImageLoader 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//设置返回按钮icon
setIconCamera//设置相机icon
setIconCrop//设置裁剪icon
setIconRotate//设置选择icon
setIconClear//设置清楚选择按钮icon(标题栏清除选择按钮)
setIconFolderArrow//设置标题栏文件夹下拉arrow图标
setIconDelete//设置多选编辑页删除按钮icon
setIconCheck//设置checkbox和文件夹已选icon
setIconFab//设置Floating按钮icon
setEditPhotoBgTexture//设置图片编辑页面图片margin外背景
setIconPreview设置预览按钮icon
setPreviewBg设置预览页背景

功能配置类说明

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

public class GlideImageLoader implements cn.finalteam.galleryfinal.ImageLoader {

    @Override
    public void displayImage(Activity activity, String path, final GFImageView imageView, Drawable defaultDrawable, int width, int height) {
        Glide.with(activity)
                .load("file://" + path)
                .placeholder(defaultDrawable)
                .error(defaultDrawable)
                .override(width, height)
                .diskCacheStrategy(DiskCacheStrategy.NONE) //不缓存到SD卡
                .skipMemoryCache(true)
                //.centerCrop()
                .into(new ImageViewTarget(imageView) {
                    @Override
                    protected void setResource(GlideDrawable resource) {
                        imageView.setImageDrawable(resource);
                    }

                    @Override
                    public void setRequest(Request request) {
                        imageView.setTag(R.id.adapter_item_tag_key,request);
                    }

                    @Override
                    public Request getRequest() {
                        return (Request) imageView.getTag(R.id.adapter_item_tag_key);
                    }
                });
    }

    @Override
    public void clearMemoryCache() {
    }
}
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实现

public interface ImageLoader{
    void displayImage(Activity activity, String path, GFImageView imageView, Drawable defaultDrawable, int width, int height);
    void clearMemoryCache();
}
其他

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12508.html

相关文章

  • android必读文 - 收藏集 - 掘金

    摘要:如何签名掘金签名是阻碍开发者集成最大的绊脚石,这里主要针对签名的生成和使用进行讲解,高级开发者可忽略。但是当我们需要去做权限管理及其封装掘金前言出来很久了,都快发布了,尽管如此还是要整理一下这块。 给所有开发者的 React Native 详细入门指南(第一阶段) - Android - 掘金本文已授权微信公众号::鸿洋(hongyangAndroid)原创首发 本文为Marno原创,...

    Simon_Zhou 评论0 收藏0
  • Android设备管理漏洞分析!

    摘要:一漏洞描述目前被称为史上最强木马的病毒利用设备管理器漏洞使用户无法通过正常方式卸载。只有取消激活设备管理器后才可以直接卸载。四代码文件注册组件代码注册激活设备管理器代码注册激活设备管理器 一、漏洞描述 目前被称为史上最强Android木马的病毒Backdoor.AndroidOS.Obad.a利用Android设备管理器漏洞使用户无法通过正常方式卸载。其实该漏洞早在去...

    marser 评论0 收藏0
  • 最强GAN修图魔术师:美颜生发摘眼镜、草绘秒变真人脸

    摘要:该研究成果由韩国团队发表于论文地址训练数据恰当的训练数据有助于提高网络训练性能。在将损失函数应用于输入图像之前,用输入图像替换了掩模外部的图像的剩余部分。总体损失函数如下其中,发生器用进行训练,鉴别器用进行训练。 为一个设计师,是否整天因为繁琐枯燥的修图工作不胜其烦?现在,一款基于GAN的AI修图大师可以将你从这类工作中解放出来。修轮廓、改表情、生发、加耳环、去眼镜、补残图,你能想到的它都能...

    xialong 评论0 收藏0
  • 史上最强C语言教程----分支和循环(5--终篇)

    摘要:目录循环循环语句的语法语句的语法执行流程执行流程语句的特点语句的特点循环中的和循环中的和练习练习计算的阶乘。多层循环这种情况使用是达不到目的的。它只能从最内层循环退出到上一层的循环。 目录 3.3 do...while()循环 3.3.1 do语句的语法: 3.3.2 执行流程 3.3.3...

    Reducto 评论0 收藏0
  • Android组件 - 收藏集 - 掘金

    摘要:手机使用提供侧滑操作的控件掘金这是一款提供侧滑功能的,可以设置它的滑动方向左右上下。预览的属性图解掘金是中最常用的控件之一,而在使用时,必不可少的会使用到它的属性。 收藏安卓开发中非常实用优秀的库! 有图有真相! - Android - 掘金本来是打算收藏工具类的,但转念一想,已经有这么多优秀的库了,就没必要再去重复造轮子了,便归纳工作中比较实用的库吧,不用在花精力去找了 收藏工作中常...

    zero 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<