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

jopen 8年前發布 | 85K 次閱讀 Android開發 移動開發

首先非常感謝對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的ImageSelectorImageSelector似乎是在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

來自: http://www.jianshu.com/p/48ddd6756b7a

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!