Android史上最強的圖片選擇器-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以上問題你都不用考慮,就是這么的任性。:joy:
雖然現在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.3' 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<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() { } }
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