首先很是感謝對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的ImageSelector(ImageSelector彷佛是在GalleryFinal 1.0版本基礎上作的改版)可是GalleryFinal有本身獨特的優點:
長期維護及時修復bug
虛心採納好的意見和想法
功能強大/UI美觀/可配置性強
……
使用GalleryFinal只須要簡單的幾步:(這裏只說AS使用方法,若是你還停留在eclipse時代請clone源碼或下載最新的aar文件)
在build.gradle中添加如下語句:
compile 'cn.finalteam:galleryfinal:1.4.6' compile 'com.android.support:support-v4:23.1.1'
這裏只作基礎的講解,須要更詳細的文檔可見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.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