Android_Album_android图片选择库

Album

android album

GitHub地址

Chinese : wiki

Screenshot

multiple, radio, preview, crop, sample ui

加载失败请移步至 Github 查看





图片选择器

  选择图片,裁剪,拍照

简单使用

Manifests.xml 添加

    <activity
        android:name="com.yalantis.ucrop.UCropActivity"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
    <activity
        android:name="com.album.ui.activity.AlbumActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
    <activity
        android:name="com.album.ui.activity.PreviewActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" />

gradle添加

// 如果项目中 依赖了 design 高版本包,那么可以不用单独依赖 RecyclerView
// 因为 高版本的 design 已经包含了 RecyclerView
compile "com.android.support:design:$designVersion"
or
compile "com.android.support:recyclerview-v7:$supportLibraryVersion"

// 这两个必须依赖,如果想使用 Glide 4.x  ,请自行实现 AlbumImageLoader
compile "com.github.yalantis:ucrop:$ucropVersion"
compile "com.github.bumptech.glide:glide:$glideVersion"

示例

    Album
            .getInstance()
            .setAlbumModels(new ArrayList<AlbumModel>())
            .setOptions(new UCrop.Options())
            .setAlbumImageLoader(new SimpleAlbumImageLoader())
            .setConfig(new AlbumConfig())
            .setAlbumListener(new SimpleAlbumListener())
            .start(this);

config

//是否隐藏相机,默认不隐藏
boolean hideCamera = false;

//是否单选 ,默认多选
boolean isRadio = false;

//单选点击是否开启裁剪,默认开启,不开启直接返回当前点击的图片路径
boolean isCrop = true;

// 拍照之后是否直接裁剪,默认不裁剪
boolean cameraCrop = false;

//预览页多选数据变动,使用者点击 Toolbar 的 返回键 返回时 是否刷新多选数据,默认不刷新
boolean previewFinishRefresh = false;

//预览页多选数据变动,使用者点击 Back 的 返回键 返回时 是否刷新多选数据,默认不刷新
boolean previewBackRefresh = false;

//权限被拒绝时是否直接 finish 掉 图片选择库 的 Activity, 默认不 finish
boolean isPermissionsDeniedFinish = false;

//是否是使用 Fresco 加载图片,当使用 Fresco 时 必须设置为 true,返回的 ImageView 就是 Fresco 的 SimpleDraweeView
boolean isFrescoImageLoader = false;

//多选最多可选择几个
int multipleMaxCount = 9;

//照相路径
String cameraPath = null;

//裁剪路径
String uCropPath = null;

//分页加载时一次加载多少张图片
int count = 200;

// 图片页 Activity 的 Toolbar 一些设置
int albumStatusBarColor = R.color.colorAlbumStatusBarColorDay;
int albumToolbarBackground = R.color.colorAlbumToolbarBackgroundDay;
int albumToolbarIcon = R.drawable.ic_action_back_day;
int albumToolbarIconColor = R.color.colorAlbumToolbarIconColorDay;
int albumToolbarTextColor = R.color.colorAlbumToolbarTextColorDay;
int albumToolbarText = R.string.album_name;
float albumToolbarElevation = 6f;

// 图片页 Activity 底部的 View 一些设置
private int albumBottomViewBackground = R.color.colorAlbumBottomViewBackgroundDay;
private int albumBottomFinderTextSize = 16;
private int albumBottomFinderTextBackground = -1;
private int albumBottomFinderTextColor = R.color.colorAlbumBottomFinderTextColorDay;
private int albumBottomFinderTextCompoundDrawable = R.drawable.ic_action_album_finder_day;
private int albumBottomFinderTextDrawableColor = R.color.colorAlbumBottomFinderTextDrawableColorDay;
private int albumBottomPreViewText = R.string.album_preview;
private int albumBottomPreViewTextSize = 16;
private int albumBottomPreViewTextColor = R.color.colorAlbumBottomPreViewTextColorDay;
private int albumBottomPreviewTextBackground = -1;
private int albumBottomSelectText = R.string.album_select;
private int albumBottomSelectTextSize = 16;
private int albumBottomSelectTextColor = R.color.colorAlbumBottomSelectTextColorDay;
private int albumBottomSelectTextBackground = -1;

// 图片页 Activity 文件夹目录的 一些设置
int albumListPopupWidth = 600;
int albumListPopupHorizontalOffset = 0;
int albumListPopupVerticalOffset = 0;
int albumListPopupItemBackground = R.color.colorAlbumListPopupItemBackgroundDay;
int albumListPopupItemTextColor = R.color.colorAlbumListPopupItemTextColorDay;

// 图片Fragment
private int spanCount = 3;
private int dividerWidth = 10;
private int albumContentViewCameraTips = R.string.album_image_camera_tv_tips;
private int albumContentViewCameraTipsSize = 18;
private int albumContentViewCameraTipsColor = R.color.colorAlbumContentViewTipsColorDay;
private int albumContentViewCameraBackgroundColor = R.color.colorAlbumContentViewBackgroundColorColorDay;
private int albumContentViewBackground = R.color.colorAlbumContentViewBackgroundDay;
private int albumContentViewCameraDrawable = R.drawable.ic_camera_alt_black_24dp;
private int albumContentViewCameraDrawableColor = R.color.colorAlbumContentViewCameraDrawableColorDay;
private int albumContentItemCheckBoxDrawable = R.drawable.selector_album_item_check;
private int albumContentEmptyDrawable = R.drawable.ic_camera_alt_black_24dp;
private int albumContentEmptyDrawableColor = R.color.colorAlbumContentEmptyDrawableColorDay;

//预览页 一些设置
private int albumPreviewTitle = R.string.preview_title;
private int albumPreviewBackground = R.color.colorAlbumPreviewBackgroundDay;
private int albumPreviewBottomViewBackground = R.color.colorAlbumPreviewBottomViewBackgroundDay;
private int albumPreviewBottomOkText = R.string.preview_select;
private int albumPreviewBottomOkTextColor = R.color.colorAlbumPreviewBottomViewOkColorDay;
private int albumPreviewBottomCountTextColor = R.color.colorAlbumPreviewBottomViewCountColorDay;
private int albumPreviewBottomOkTextSize = 16;
private int albumPreviewBottomCountTextSize = 16;

回调

Album 已经放置了一个 SimpleAlbumListener

 public class SimpleAlbumListener implements AlbumListener {
    
        /**
         * 点击图片页Toolbar finish
         */
        @Override
        public void onAlbumActivityFinish() {
    
        }
    
        /**
         * 权限被拒绝
         * type:
         * <p>
         * *** AlbumConstant.TYPE_ALBUM : 读取权限被拒
         * *** AlbumConstant.TYPE_CAMERA : 相机权限被拒
         */
        @Override
        public void onAlbumPermissionsDenied(int type) {
    
        }
    
        /**
         * 点击 预览 或者 选择 按钮时 Fragment 为 null, 应该不会被触发..
         */
        @Override
        public void onAlbumFragmentNull() {
    
        }
    
        /**
         * 预览时,滑动 ViewPager 时 会检测图片是否还存在,不存在会触发
         * 触发条件: Home 放在后台,在其他软件中删掉了图片
         */
        @Override
        public void onAlbumPreviewFileNull() {
    
        }
    
        /**
         * 图片 文件夹 目录 为空,就是没有图片..
         */
        @Override
        public void onAlbumFinderNull() {
    
        }
    
        /**
         * 点击预览时没有选择图片
         */
        @Override
        public void onAlbumBottomPreviewNull() {
    
        }
    
        /**
         * 点击选择时 没有选择图片
         */
        @Override
        public void onAlbumBottomSelectNull() {
    
        }
    
        /**
         * 点击 ITEM 时,会判断当前图片是否存在
         * 触发条件: Home 放在后台,在其他软件中删掉了图片
         */
        @Override
        public void onAlbumFragmentFileNull() {
    
        }
    
        /**
         * 预览界面选择确定,但是没有选中的图片
         */
        @Override
        public void onAlbumPreviewSelectNull() {
    
        }
    
        /**
         * 多选点击 checkbox 时,会判断当前图片是否存在
         * 触发条件: Home 放在后台,在其他软件中删掉了图片
         * <p>
         * 此时可选择是否强制刷新图库信息
         */
        @Override
        public void onAlbumCheckBoxFileNull() {
    
        }
    
        /**
         * 裁剪被取消
         */
        @Override
        public void onAlbumFragmentCropCanceled() {
    
        }
    
        /**
         * 拍照被取消
         */
        @Override
        public void onAlbumFragmentCameraCanceled() {
    
        }
    
        /**
         * 裁剪出现异常
         */
        @Override
        public void onAlbumFragmentUCropError(@Nullable Throwable data) {
    
        }
    
        /**
         * 返回的选择图片信息
         * <p>
         * albumModel.getPath(); 为当前图片地址
         * <p>
         * 建议  FileUtils.isFile  判断一下图片是否还存在
         */
        @Override
        public void onAlbumResources(@NonNull List<AlbumModel> list) {
    
        }
    
        /**
         * 裁剪之后会返回的图片File
         */
        @Override
        public void onAlbumUCropResources(@Nullable File scannerFile) {
    
        }
    
        /**
         * 多选最多了
         */
        @Override
        public void onAlbumMaxCount() {
    
        }
    
        /**
         * 点击 back 返回到app
         */
        @Override
        public void onAlbumActivityBackPressed() {
    
        }
    
        /**
         * 打开相机失败,有可能是当前系统没有相机
         */
        @Override
        public void onAlbumOpenCameraError() {
    
        }
        
       // 本机没有图片
        @Override
        public void onAlbumEmpty() {
            
        }
    }

自定义图片加载

Album内部有一个SimpleGlideAlbumImageLoader,使用的是 Glide 3.x 版本,如果想使用这个,必须依赖 Glide 3.x

目前主流的图片加载器,sample都有示例

需要注意的是如果使用FrescoImageLoaderfrescoView(context,type) 必须返回正确的View,例如 fresco 的 预览时 双击缩放功能,需要额外依赖完成, type == 1 时 是预览页的图片加载

Fresco

            Album
                    .getInstance()
                    .setConfig(new AlbumConfig().setFrescoImageLoader(true)  // 通知 Album 图片加载框架使用的是 Fresco
                    .start(this);

SimpleFrescoAlbumImageLoader

Glide 4.x

SimpleGlide4xAlbumImageLoader

Picasso

SimplePicassoAlbumImageLoader

这里需要说明的是,如果直接用 file 加载图片, Picasso 在某些手机上会出现 ExifInterface_JNI: Raw image not detected

所以用Uri去加载图片

universalimageloader

SimpleImageLoaderAlbumImageLoader

测试过的机型

  • onePlus3T 7.1.1
  • huawei ale-cl00 4.4.4
  • meizu mx5 5.1
  • galaxy S8+ 7.0
  • hanzhong 5.1
  • xiaomi note 6.0.1
  • redmi note4 6.0
  • oppo R7c 4.4.4
  • Lenovo K30-T 4.4.4

混淆

-dontwarn com.album.**
-keep class  com.album.** { *;}
-keep interface  com.album.** { *;}
// ucrop
-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }

感谢

TouchImageView

关于MediaScannerConnection的内存泄露问题

协议

Mozilla Public License 2.0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容