{"id":13644071,"url":"https://github.com/libin7278/ImageLoader","last_synced_at":"2025-04-21T06:32:59.487Z","repository":{"id":201780380,"uuid":"87681287","full_name":"libin7278/ImageLoader","owner":"libin7278","description":"基于Glide的二次封装，方便使用，而且增加了多种滤镜，加载本地多边形","archived":false,"fork":false,"pushed_at":"2018-11-09T07:53:19.000Z","size":6788,"stargazers_count":343,"open_issues_count":3,"forks_count":59,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-11-09T16:43:47.419Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://blog.csdn.net/github_33304260/article/details/70237052","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/libin7278.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-04-09T03:55:13.000Z","updated_at":"2024-03-23T22:20:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"67d24886-bd98-490a-a54b-485f7d132558","html_url":"https://github.com/libin7278/ImageLoader","commit_stats":null,"previous_names":["libin7278/imageloader"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libin7278%2FImageLoader","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libin7278%2FImageLoader/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libin7278%2FImageLoader/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libin7278%2FImageLoader/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/libin7278","download_url":"https://codeload.github.com/libin7278/ImageLoader/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250008287,"owners_count":21359959,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T01:01:57.150Z","updated_at":"2025-04-21T06:32:54.479Z","avatar_url":"https://github.com/libin7278.png","language":"Java","readme":"前言\n=============\n\u003e - 有人可能会问为什么选择Glide进行二次封装？\n\u003e  - 那你应该去看我的上一篇文章：\n\u003e  http://blog.csdn.net/github_33304260/article/details/70213300\n\u003e - 那么又有人问了Glide直接能使用了，已经很方便了，为啥还要封装？\n\u003e   - 入口统一，所有图片加载都在这一个地方管理，一目了然，即使有什么改动我也只需要改这一个类就可以了。\n\u003e   - 虽然现在的第三方库已经非常好用，但是如果我们看到第三方库就拿来用的话，很可能在第三方库无法满足业务需求或者停止维护的时候，发现替换库，工作量可见一斑。这就是不封装在切库时面临的窘境！\n\u003e   - 外部表现一致，内部灵活处理原则\n\u003e   - 更多内容参考：[如何正确使用开源项目？](http://mp.weixin.qq.com/s?__biz=MzA4NTQwNDcyMA==\u0026mid=2650661623\u0026idx=1\u0026sn=ab28ac6587e8a5ef1241be7870851355#rd)  \n\n初识Glide\n=============\n##Glide配置\n**1、 在build.gradle中添加依赖：**\n\n```\ndependencies {\n  compile 'com.github.bumptech.glide:glide:3.7.0'\n  compile 'com.android.support:support-v4:19.1.0'\n}\n```\nOr Maven:\n\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.github.bumptech.glide\u003c/groupId\u003e\n  \u003cartifactId\u003eglide\u003c/artifactId\u003e\n  \u003cversion\u003e3.7.0\u003c/version\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.google.android\u003c/groupId\u003e\n  \u003cartifactId\u003esupport-v4\u003c/artifactId\u003e\n  \u003cversion\u003er7\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n**2、混淆**\n\n```\n-keep public class * implements com.bumptech.glide.module.GlideModule\n-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {\n  **[] $VALUES;\n  public *;\n}\n\n# for DexGuard only\n-keepresourcexmlelements manifest/application/meta-data@value=GlideModule\n```\n\n**3、权限**\n如果是联网获取图片或者本地存储需要添加以下权限：\n\n```\n\u003cuses-permission android:name=\"android.permission.INTERNET\" /\u003e\n\u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" /\u003e\n```\n\n##Glide基本使用\nGlide使用一个流接口（Fluent Interface）。用Glide完成一个完整的图片加载功能请求，需要向其构造器中至少传入3个参数，分别是：\n\u003e - with(Context context)- Context是许多Android API需要调用的， Glide也不例外。这里Glide非常方便，你可以任意传递一个Activity或者Fragment对象，它都可以自动提取出上下文。\n\u003e - load(String imageUrl) - 这里传入的是你要加载的图片的URL，大多数情况下这个String类型的变量会链接到一个网络图片。\n\u003e -  into(ImageView targetImageView) - 将你所希望解析的图片传递给所要显示的ImageView。\n\nexample:\n\n```\nImageView targetImageView = (ImageView) findViewById(R.id.imageView);\nString internetUrl = \"http://i.imgur.com/DvpvklR.png\";\n\nGlide\n    .with(context)\n    .load(internetUrl)\n    .into(targetImageView);\n```\n##Compatibility\n\u003e - **Android SDK**: Glide requires a minimum API level of 10.\n\u003e - **OkHttp 2.x**: there are optional dependencies available called okhttp-integration, see Integration Libraries wiki page.\n\u003e - **OkHttp 3**.x: there are optional dependencies available called okhttp3-integration, see Integration Libraries wiki page.\n\u003e - **Volley**: there are optional dependencies available called volley-integration, see Integration Libraries wiki page.\n\u003e - **Round Pictures**: CircleImageView/CircularImageView/RoundedImageView are known to have issues with TransitionDrawable (.crossFade() with .thumbnail() or .placeholder()) and animated GIFs, use a BitmapTransformation (.circleCrop() will be available in v4) or .dontAnimate() to fix the issue.\n\u003e - **Huge Images** (maps, comic strips): Glide can load huge images by downsampling them, but does not support zooming and panning ImageViews as they require special resource optimizations (such as tiling) to work without OutOfMemoryErrors.\n\n\n##常用API\n\u003e - **thumbnail(float sizeMultiplier)**. 请求给定系数的缩略图。如果缩略图比全尺寸图先加载完，就显示缩略图，否则就不显示。系数sizeMultiplier必须在(0,1)之间，可以递归调用该方法。\n\u003e - **sizeMultiplier(float sizeMultiplier).** 在加载资源之前给Target大小设置系数。\n\u003e - **diskCacheStrategy(DiskCacheStrategy strategy).**设置缓存策略。\u003e -DiskCacheStrategy.SOURCE：缓存原始数据，DiskCacheStrategy.RESULT：缓存变换(如缩放、裁剪等)后的资源数据，DiskCacheStrategy.NONE：什么都不缓存，DiskCacheStrategy.ALL：缓存SOURC和RESULT。默认采用\u003e -\u003e -DiskCacheStrategy.RESULT策略，对于download only操作要使用\u003e -DiskCacheStrategy.SOURCE。\n\u003e - **priority(Priority priority)**. 指定加载的优先级，优先级越高越优先加载，但不保证所有图片都按序加载。枚举Priority.IMMEDIATE，Priority.HIGH，Priority.NORMAL，Priority.LOW。默认为Priority.NORMAL。\n\u003e - **dontAnimate()\n\u003e .** 移除所有的动画。\n\u003e - **animate(int animationId).** 在异步加载资源完成时会执行该动画。\n\u003e - **animate(ViewPropertyAnimation.Animator animator).** 在异步加载资源完成时\u003e 会执行该动画。\n\u003e - **placeholder(int resourceId)**. 设置资源加载过程中的占位Drawable。\n\u003e - **placeholder(Drawable drawable).** 设置资源加载过程中的占位Drawable。\n\u003e - **fallback(int resourceId).** 设置model为空时要显示的Drawable。如果没设置fallback，model为空时将显示error的Drawable，如果error的Drawable也没设置，就显示placeholder的Drawable。\n\u003e - **fallback(Drawable drawable)**.设置model为空时显示的Drawable。\n\u003e - **error(int resourceId).**设置load失败时显示的Drawable。\n\u003e - **error(Drawable drawable).**设置load失败时显示的Drawable。\n\u003e -**listener(RequestListener《? super ModelType, TranscodeType》\u003e -requestListener).** 监听资源加载的请求状态，可以使用两个回调：onResourceReady(R resource, T model, Target\u003cR\u003e target, boolean isFromMemoryCache, boolean isFirstResource)和onException(Exception e, T model, Target\u0026lt;R\u0026gt; target, boolean isFirstResource)，但不要每次请求都使用新的监听器，要避免不必要的内存申请，可以使用单例进行统一的异常监听和处理。\n\u003e - **skipMemoryCache(boolean skip).** 设置是否跳过内存缓存，但不保证一定不被缓存（比如请求已经在加载资源且没设置跳过内存缓存，这个资源就会被缓存在内存中）。\n\u003e - **override(int width, int height).** 重新设置Target的宽高值（单位为pixel）。\n\u003e - **into(Y target)**.设置资源将被加载到的Target。\n\u003e - **into(ImageView view).** 设置资源将被加载到的ImageView。取消该ImageView之前所有的加载并释放资源。\n\u003e - **into(int width, int height)**. 后台线程加载时要加载资源的宽高值（单位为pixel）。\n\u003e - **preload(int width, int height)**. 预加载resource到缓存中（单位为pixel）。\n\u003e - **asBitmap().** 无论资源是不是gif动画，都作为Bitmap对待。如果是gif动画会停在第一帧。\n\u003e - **asGif().**把资源作为GifDrawable对待。如果资源不是gif动画将会失败，会回调.error()。\n\n***更多Glide详细介绍可以看[Glide官网](https://github.com/bumptech/glide)以及[Glide教程系列文章](http://www.jianshu.com/p/7610bdbbad17)***\n\n如何封装\n=============\n明白了为什么封装以及基本原理，接下来我们就要开工，大干一场。\n\n先看一下本人封装后的基本使用样式：\n\n```\nImageLoader.with(this)\n\t.url(\"http://img.yxbao.com/news/image/201703/13/7bda462477.gif\")\n\t.placeHolder(R.mipmap.ic_launcher,false)\n\t.rectRoundCorner(30, R.color.colorPrimary)\n\t.blur(40)\n\t.into(iv_round);\n```\n\n更多属性我们后再详细讲解使用，主要先来看看具体的封装。\n\n先看一下uml：\n\n![这里写图片描述](http://img.blog.csdn.net/20170420165918194?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2l0aHViXzMzMzA0MjYw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n使用者只需要关心ImageLoader就好了，就算里面封装的库更换、更新也没关系，因为对外的接口是不变的。实际操作中是由实现了ILoader的具体类去操作的，这里我们只封装了GlideLoader，其实所有操作都是由ImageLoader下发指令，由GlideLoader具体去实现的。这里如果想封装别的第三方库，只需要实现ILoader自己去完成里面的方法。\n\n##初始化\n\n```\n\tpublic static int CACHE_IMAGE_SIZE = 250;\n\n    public static void init(final Context context) {\n        init(context, CACHE_IMAGE_SIZE);\n    }\n\n    public static void init(final Context context, int cacheSizeInM) {\n        init(context, cacheSizeInM, MemoryCategory.NORMAL);\n    }\n\n    public static void init(final Context context, int cacheSizeInM, MemoryCategory memoryCategory) {\n        init(context, cacheSizeInM, memoryCategory, true);\n    }\n\n    /**\n     * @param context        上下文\n     * @param cacheSizeInM   Glide默认磁盘缓存最大容量250MB\n     * @param memoryCategory 调整内存缓存的大小 LOW(0.5f) ／ NORMAL(1f) ／ HIGH(1.5f);\n     * @param isInternalCD   true 磁盘缓存到应用的内部目录 / false 磁盘缓存到外部存\n     */\n    public static void init(final Context context, int cacheSizeInM, MemoryCategory memoryCategory, boolean isInternalCD) {\n        ImageLoader.context = context;\n        GlobalConfig.init(context, cacheSizeInM, memoryCategory, isInternalCD);\n    }\n```\n\n从这里可以看出我们提供了四个构造器，这里注释详细说明了所有参数的用法及意义。\n\n除了初始化，我们还需要在Application中重写以下方法：\n\n```\n\t@Override\n    public void onTrimMemory(int level) {\n        super.onTrimMemory(level);\n\t\t// 程序在内存清理的时候执行\n        ImageLoader.trimMemory(level);\n    }\n\n    @Override\n    public void onLowMemory() {\n        super.onLowMemory();\n\t    // 低内存的时候执行\n        ImageLoader.clearAllMemoryCaches();\n    }\n```\n上面这两个方法会在下面ImageLoader中介绍到。\n\n##你所关心的类--ImageLoader\nImageLoader是封装好所有的方法供用户使用的，让我们看看都有什么方法：\n\u003e - ImageLoader.init(Context context) //初始化\n\u003e - ImageLoader.trimMemory(int level); \n\u003e - ImageLoader.clearAllMemoryCaches();\n\u003e - ImageLoader.getActualLoader(); //获取当前的loader \n\u003e - ImageLoader.with(Context context) //加载图片\n\u003e - ImageLoader.saveImageIntoGallery(String url) // 保存图片到相册\n\u003e - ImageLoader.pauseRequests() //取消请求\n\u003e - ImageLoader.resumeRequests() //回复的请求（当列表在滑动的时候，调用pauseRequests()取消请求，滑动停止时，调用resumeRequests()恢复请求  等等）\n\u003e - ImageLoader.clearDiskCache()//清除磁盘缓存(必须在后台线程中调用)\n\u003e - ImageLoader.clearMomoryCache(View view) //清除指定view的缓存\n\u003e - ImageLoader.clearMomory() // 清除内存缓存(必须在UI线程中调用)\n\n\n##图片的各种设置信息--SingleConfig\n我们所设置图片的所有属性都写在这个类里面。下面我们详细的看一下：\n\n\u003e - url(String url) //支持filepath、图片链接、contenProvider、资源id四种\n\u003e - thumbnail(float thumbnail)//缩略图\n\u003e - rectRoundCorner(int rectRoundRadius, int overlayColorWhenGif) //形状为圆角矩形时的圆角半径\n\u003e - asSquare() //形状为正方形\n\u003e - colorFilter(int color) //颜色滤镜\n\u003e - diskCacheStrategy(DiskCacheStrategy diskCacheStrategy) //DiskCacheStrategy.NONE :不缓存图片 ／DiskCacheStrategy.SOURCE :缓存图片源文件／DiskCacheStrategy.RESULT:缓存修改过的图片／DiskCacheStrategy.ALL:缓存所有的图片，默认\n\u003e - asCircle(int overlayColorWhenGif)//加载圆形图片\n\u003e - placeHolder(int placeHolderResId) //占位图\n\u003e - override(int oWidth, int oHeight) //加载图片时设置分辨率 a\n\u003e - scale(int scaleMode) // CENTER_CROP等比例缩放图片，直到图片的狂高都大于等于ImageView的宽度，然后截取中间的显示 ; FIT_CENTER 等比例缩放图片，宽或者是高等于ImageView的宽或者是高 默认：FIT_CENTER\n\u003e - animate(int animationId ) 引入动画\n \u003e - animate( Animation animation) 引入动画\n \u003e - animate(ViewPropertyAnimation.Animator animato) 引入动画\n\u003e - asBitmap(BitmapListener bitmapListener)// 使用bitmap不显示到imageview\n\u003e - into(View targetView) //展示到imageview\n\u003e - colorFilter(int filteColor) //颜色滤镜\n\u003e - blur(int blurRadius) ／/高斯模糊\n\u003e - brightnessFilter(float level) //调节图片亮度\n\u003e - grayscaleFilter() //黑白效果\n\u003e - swirlFilter() //漩涡效果\n\u003e - toonFilter() //油画效果\n\u003e - sepiaFilter() //水墨画效果\n\u003e - contrastFilter(float constrasrLevel) //锐化效果\n\u003e - invertFilter() //胶片效果\n\u003e - pixelationFilter(float pixelationLevel)  //马赛克效果\n\u003e - sketchFilter() //  //素描效果\n\u003e - vignetteFilter() //晕映效果\n\n[github项目地址](https://github.com/libin7278/ImageLoader)\n\n##中转站--GlideLoader \nGlideLoader实现ILoader接口。在使用的时候我们虽然不用关心这个类，但是了解一下主要做了什么功能还是不错的。\n\n```\npublic class GlideLoader implements ILoader {\n\n    /**\n     * @param context        上下文\n     * @param cacheSizeInM   Glide默认磁盘缓存最大容量250MB\n     * @param memoryCategory 调整内存缓存的大小 LOW(0.5f) ／ NORMAL(1f) ／ HIGH(1.5f);\n     * @param isInternalCD   true 磁盘缓存到应用的内部目录 / false 磁盘缓存到外部存\n     */\n    @Override\n    public void init(Context context, int cacheSizeInM, MemoryCategory memoryCategory, boolean isInternalCD) {\n        Glide.get(context).setMemoryCategory(memoryCategory); //如果在应用当中想要调整内存缓存的大小，开发者可以通过如下方式：\n        GlideBuilder builder = new GlideBuilder(context);\n        if (isInternalCD) {\n            builder.setDiskCache(new InternalCacheDiskCacheFactory(context, cacheSizeInM * 1024 * 1024));\n        } else {\n            builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, cacheSizeInM * 1024 * 1024));\n        }\n    }\n\n    @Override\n    public void request(final SingleConfig config) {\n        RequestManager requestManager = Glide.with(config.getContext());\n        DrawableTypeRequest request = getDrawableTypeRequest(config, requestManager);\n\n        if (config.isAsBitmap()) {\n            SimpleTarget target = new SimpleTarget\u003cBitmap\u003e(config.getWidth(), config.getHeight()) {\n                @Override\n                public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {\n                    config.getBitmapListener().onSuccess(bitmap);\n                }\n            };\n\n            setShapeModeAndBlur(config, request);\n\n            if (config.getDiskCacheStrategy() != null) {\n                request.diskCacheStrategy(config.getDiskCacheStrategy());\n                Logger.e(\"config.getDiskCacheStrategy() :  \" + config.getDiskCacheStrategy());\n            }\n\n            request.asBitmap().into(target);\n\n        } else {\n\n            if (request == null) {\n                return;\n            }\n\n            if (MyUtil.shouldSetPlaceHolder(config)) {\n                request.placeholder(config.getPlaceHolderResId());\n            }\n\n            int scaleMode = config.getScaleMode();\n\n            switch (scaleMode) {\n                case ScaleMode.CENTER_CROP:\n                    request.centerCrop();\n                    break;\n                case ScaleMode.FIT_CENTER:\n                    request.fitCenter();\n                    break;\n                default:\n                    request.fitCenter();\n                    break;\n            }\n\n            // TODO: 2017/4/21 设置图片滤镜(目前只有高斯)\n            setShapeModeAndBlur(config, request);\n\n            //设置缩略图\n            if (config.getThumbnail() != 0) {\n                request.thumbnail(config.getThumbnail());\n            }\n\n            //设置图片加载的分辨 sp\n            if (config.getoWidth() != 0 \u0026\u0026 config.getoHeight() != 0) {\n                request.override(config.getoWidth(), config.getoHeight());\n                Logger.e(\"设置图片加载的分辨 : \" + config.getoWidth() + \"   \" + config.getoHeight());\n            }\n\n            //是否跳过磁盘存储\n            if (config.getDiskCacheStrategy() != null) {\n                request.diskCacheStrategy(config.getDiskCacheStrategy());\n                Logger.e(\"config.getDiskCacheStrategy() :  \" + config.getDiskCacheStrategy());\n            }\n\n            //设置图片加载动画\n            setAnimator(config, request);\n\n            //设置图片加载优先级\n            setPriority(config, request);\n\n            if (config.getErrorResId() \u003e 0) {\n                request.error(config.getErrorResId());\n            }\n\n            if (config.getTarget() instanceof ImageView) {\n                request.into((ImageView) config.getTarget());\n\n                Logger.e(\"config.getTarget()\" + config.getTarget().getMeasuredWidth());\n            }\n        }\n\n    }\n\n    /**\n     * 设置加载优先级\n     *\n     * @param config\n     * @param request\n     */\n    private void setPriority(SingleConfig config, DrawableTypeRequest request) {\n        switch (config.getPriority()) {\n            case PriorityMode.PRIORITY_LOW:\n                request.priority(Priority.LOW);\n                break;\n            case PriorityMode.PRIORITY_NORMAL:\n                request.priority(Priority.NORMAL);\n                break;\n            case PriorityMode.PRIORITY_HIGH:\n                request.priority(Priority.HIGH);\n                break;\n            case PriorityMode.PRIORITY_IMMEDIATE:\n                request.priority(Priority.IMMEDIATE);\n                break;\n            default:\n                request.priority(Priority.IMMEDIATE);\n                break;\n        }\n    }\n\n    /**\n     * 设置加载进入动画\n     *\n     * @param config\n     * @param request\n     */\n    private void setAnimator(SingleConfig config, DrawableTypeRequest request) {\n        if (config.getAnimationType() == AnimationMode.ANIMATIONID) {\n            request.animate(config.getAnimationId());\n        } else if (config.getAnimationType() == AnimationMode.ANIMATOR) {\n            request.animate(config.getAnimator());\n        } else if (config.getAnimationType() == AnimationMode.ANIMATION) {\n            request.animate(config.getAnimation());\n        }\n    }\n\n    @Nullable\n    private DrawableTypeRequest getDrawableTypeRequest(SingleConfig config, RequestManager requestManager) {\n        DrawableTypeRequest request = null;\n        if (!TextUtils.isEmpty(config.getUrl())) {\n            request = requestManager.load(MyUtil.appendUrl(config.getUrl()));\n        } else if (!TextUtils.isEmpty(config.getFilePath())) {\n            request = requestManager.load(MyUtil.appendUrl(config.getFilePath()));\n        } else if (!TextUtils.isEmpty(config.getContentProvider())) {\n            request = requestManager.loadFromMediaStore(Uri.parse(config.getContentProvider()));\n        } else if (config.getResId() \u003e 0) {\n            request = requestManager.load(config.getResId());\n        }\n        return request;\n    }\n\n    /**\n     * 设置图片滤镜和形状\n     *\n     * @param config\n     * @param request\n     */\n    private void setShapeModeAndBlur(SingleConfig config, DrawableTypeRequest request) {\n        int shapeMode = config.getShapeMode();\n        Transformation[] transformation = new Transformation[3];\n        if (config.isNeedBlur()) {\n           // transformation[0] = new BlurTransformation(config.getContext(), config.getBlurRadius());\n            transformation[0] = new BrightnessFilterTransformation(config.getContext(), 0.5f);\n            //transformation[0] =new GrayscaleTransformation(config.getContext()); 黑白效果\n        }\n\n        if(config.isNeedFilteColor()){\n            transformation[2] = new ColorFilterTransformation(config.getContext(), config.getFilteColor());\n        }\n\n        switch (shapeMode) {\n            case ShapeMode.RECT:\n\n                break;\n            case ShapeMode.RECT_ROUND:\n                transformation[1] = new RoundedCornersTransformation\n                        (config.getContext(), config.getRectRoundRadius(), 0, RoundedCornersTransformation.CornerType.ALL);\n\n                break;\n            case ShapeMode.OVAL:\n                transformation[1] = new CropCircleTransformation(config.getContext());\n                break;\n\n            case ShapeMode.SQUARE:\n                transformation[1] = new CropSquareTransformation(config.getContext());\n                break;\n        }\n\n        if (transformation[0] != null \u0026\u0026 transformation[1] != null \u0026\u0026 transformation[2] != null) {\n            request.bitmapTransform(transformation);\n        } else if (transformation[0] != null \u0026\u0026 transformation[1] == null) {\n            request.bitmapTransform(transformation[0]);\n        } else if (transformation[0] == null \u0026\u0026 transformation[1] != null) {\n            request.bitmapTransform(transformation[1]);\n        }else if(transformation[0] == null \u0026\u0026 transformation[1] == null \u0026\u0026 transformation[2] != null){\n            request.bitmapTransform(transformation[2]);\n        }\n    }\n\n    @Override\n    public void pause() {\n        Glide.with(GlobalConfig.context).pauseRequestsRecursive();\n\n    }\n\n    @Override\n    public void resume() {\n        Glide.with(GlobalConfig.context).resumeRequestsRecursive();\n    }\n\n    @Override\n    public void clearDiskCache() {\n        Glide.get(GlobalConfig.context).clearDiskCache();\n    }\n\n    @Override\n    public void clearMomoryCache(View view) {\n        Glide.clear(view);\n    }\n\n    @Override\n    public void clearMomory() {\n        Glide.get(GlobalConfig.context).clearMemory();\n    }\n\n    @Override\n    public File getFileFromDiskCache(String url) {\n        return null;\n    }\n\n    @Override\n    public boolean isCached(String url) {\n        return false;\n    }\n\n    @Override\n    public void trimMemory(int level) {\n        Glide.with(GlobalConfig.context).onTrimMemory(level);\n    }\n\n    @Override\n    public void clearAllMemoryCaches() {\n        Glide.with(GlobalConfig.context).onLowMemory();\n    }\n}\n```\n\n看一下效果哦：\n![这里写图片描述](http://img.blog.csdn.net/20170426164943536?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2l0aHViXzMzMzA0MjYw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)\n\n到这里我们的封装就结束了，就可以愉快的使用了，欢迎大家提出意见与建议。\n\n[Glide二次封装库源码](https://github.com/libin7278/ImageLoader)\n\n后面会更新到jcenter，并会出一篇具体如何使用本库的文章，还请大家持续关注哦。\n","funding_links":[],"categories":["图片"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibin7278%2FImageLoader","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flibin7278%2FImageLoader","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibin7278%2FImageLoader/lists"}