[Android]史上最強的圖片選擇器-GalleryFinal

首先很是感謝對GalleryFinal提出意見和想法的童鞋們,使得GalleryFinal通過重重迭代變得完善起來。css

GitHub地址   Demo APK下載    java

簡述

GalleryFinal是一個圖片選擇(單選/多選)、拍照、編輯、裁剪及旋轉爲一身的圖片選擇器。使用方便,功能可本身配置,GalleryFinal還能夠根據開發者的喜愛來選擇主題,固然也支持自定義主題。並且GalleryFinal自身並無強制綁定某個ImageLoader,開發者能夠根據本身項目給GalleryFinal配置圖片加載器。GalleryFinal還放棄了startActivityForResult+onActivityResult來獲取選擇結果,而是採用事件回調的機制。(我以爲startActivityForResult+onActivityResult太麻煩了,贊成的點個贊吧,呵呵~)。GalleryFinal通過三四個月的版本迭代,修復bug,優化需求,已經處於穩定的狀態。android

也許有人會問:系統不是有相冊選擇器嗎,爲何還有作一個GalleryFinal呢,有必要嗎?我告訴你頗有必要。微信,QQ等等app它們都是本身帶圖片選擇器,並無直接調系統的圖片選擇器。爲何要這麼作呢?我總結出一下幾點:git

  • 最大的問題就是兼容性了,手機廠商那麼多,相冊軟件那麼多從而引發各類奇葩的問題github

  • 有些手機拍照圖片倒立狀況(如三星和魅族)緩存

  • 拿到的bitmap或uri爲空微信

  • 很是頻繁出現OOMapp

  • 不支持多選框架

  • 拍照/選擇圖片/裁剪視乎用起來有些麻煩,加上處理一些旋轉、裁剪、壓縮就更加麻煩了,代碼多得不行不行的。eclipse

  • 系統的圖片選擇UI上與本身APP樣式不統一

  • 有些不支持圖片旋轉

  • ....

使用GalleryFinal以上問題你都不用考慮,就是這麼的任性。?

雖然如今Github圖片選擇有不少,好比lovetuzitong的MultiImageSelector,habzy的GridImagePicker,還有就是YancyYe的ImageSelectorImageSelector彷佛是在GalleryFinal 1.0版本基礎上作的改版)可是GalleryFinal有本身獨特的優點:

  • 長期維護及時修復bug

  • 虛心採納好的意見和想法

  • 功能強大/UI美觀/可配置性強

  • ……

如何使用

使用GalleryFinal只須要簡單的幾步:(這裏只說AS使用方法,若是你還停留在eclipse時代請clone源碼或下載最新的aar文件)

一、引入GalleryFinal

在build.gradle中添加如下語句:

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

二、配置通用功能/主題/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<GlideDrawable>(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() {
    }
}

三、啓動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

相關文章
相關標籤/搜索