美文网首页
图片加载之Glide

图片加载之Glide

作者: 皇马船长 | 来源:发表于2016-09-20 11:05 被阅读233次

    1. 概述

    2. 用法

    首先要引入类库
    compile 'com.github.bumptech.glide:glide:3.7.0'

    2.1 基本用法

    加载图片很方便

            /**
             *  Glide 默认采用HttpURLConnection ,并且支持OkHttp,Volley
             */
            Glide.with(this)
                    .load(url)
                    .placeholder(R.mipmap.ic_launcher)
                    .crossFade()
                    .centerCrop()
                    .animate(R.anim.anim)
                    .listener(new RequestListener<String, GlideDrawable>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                            return false;
                        }
                        @Override
                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            return false;
                        }
                    })
                    .into(imageview);
        }
    }
    

    2.2 几种加载方式 ,可以加载多种数据源:url、uri、本地文件、资源文件等

    DrawableTypeRequest<String> load(String string)
    DrawableTypeRequest<Uri> load(Uri uri)
    DrawableTypeRequest<File> load(File file)
    DrawableTypeRequest<Integer> load(Integer resourceId)
    DrawableTypeRequest<URL> load(URL url)
    

    2.3 监听

    Glide可以设置监听,图片加载是否成功。失败可以看到相应错误日志

    new RequestListener<String, GlideDrawable>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                            return false;
                        }
    
                        @Override
                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            return false;
                        }
                    }
    

    2.4 设置图片大小

    2.5 加载GIF

    在加载gif 格式图片时,需要设置缓存策略,要不会非常慢

    2.6 Glide网络加载方式

    Glide内部默认是通过HttpURLConnection网络方式加载图片的,并且支持OkHttp,Volley

    集成OkHttp 集成okhttp 2.x 和 okhttp 3.x代码不一样

    okhttp 2.x 在gradle文件加入下面代码

    //自动集成okhttp 
    compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'
    compile 'com.squareup.okhttp:okhttp:2.2.0'
    

    然后在 AndroidManifest.xml 文件添加

     <meta-data
                android:name="com.bumptech.glide.integration.okhttp.OkHttpGlideModule"
                android:value="GlideModule" />
    

    okhttp 3.x 在gradle文件加入下面代码

     compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
     compile 'com.squareup.okhttp3:okhttp:3.5.0'
    

    然后在 AndroidManifest.xml 文件添加

     <meta-data
                android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule"
                android:value="GlideModule" />
    

    Gradle 会自动合并必要的 GlideModule到你的 Android.Manifest。Glide 会认可在 manifest 中的存在,然后使用 OkHttp 做到所有的网络连接。

    集成Volley
    //自动集成volley 
    compile 'com.github.bumptech.glide:volley-integration:1.4.0@aar' 
    compile 'com.mcxiaoke.volley:library:1.0.19'
    

    然后在 AndroidManifest.xml 文件添加

    <meta-data 
            android:name="com.bumptech.glide.integration.volley.VolleyGlideModule" 
            android:value="GlideModule" />
    

    这将添加 Volley 并集成该库到你的项目中。集成库添加到 GlideModule
    到你的Android.Manifest。Glide 会自动认出它,然后使用 Volley 作为网络库。并不要求做其他的配置!
    警告::如果你把这两个库都在你的 build.gradle中声明了,那这两个库都会被添加。因为 Glide 没有任何特殊的加载顺序,你将会有一个不稳定的状态,它并不明确使用哪个网络库,所以确保你只添加了一个集成库。

    其他网络库

    如果你是别的网络库的粉丝,你是不幸的。Glide 除了 Volley 和 OkHttp 外不会自动配置其他的库。然而你随时可以整合你喜欢的网络库,在 GitHub 上去开一个 pull request。为Volley 和 OkHttp 可能给你一个方向。

    2.7 自定义动画

    在前面我们已经提到过Glide提供了一个渐入渐出的动画效果,当然该动画不是那么酷炫,而且有时并不能达到我们想要的效果,不过Glide给我们提供了animate()方法,我们可以通过此方法实现我们自定义的动画效果。
    animate(int animationId)

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillAfter="false"
        android:duration="3000">
    
        <scale
            android:duration="@android:integer/config_longAnimTime"
            android:fromXScale="0.1"
            android:fromYScale="0.1"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="1"
            android:toYScale="1"/>
        <rotate
            android:fromDegrees="0"
            android:toDegrees="90"
            android:pivotX="50%"
            android:pivotY="50%"
            />
    </set>
    

    2.8 Target

    当我们只需要一个bitmap时,可以使用这个办法 。

    Glide.with(this)
                    .load(url)
                    .placeholder(R.mipmap.ic_launcher)
                    .crossFade()
                    .centerCrop()
                    .animate(R.anim.anim)
                    .listener(new RequestListener<String, GlideDrawable>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                            return false;
                        }
    
                        @Override
                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            return false;
                        }
                    })
                    .into(target);
    //                .into(imageview);
    
        }
        private SimpleTarget target = new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
                // do something with the bitmap
                // for demonstration purposes, let's just set it to an ImageView
                imageview.setImageBitmap( bitmap );
            }
        };
    
    

    2.9 自定义转换 transform

    可以实现图片的一些特效,如圆角、高斯模糊、旋转等。
    为了实践自定义转换,你将需要创建一个新类,它实现了 Transformation 接口。要实现这个方法还是比较复杂的,你必须要有对 Glide 内部架构方面的洞察力才能做的比较棒。如果你只是想要对图片(不是 Gif 和 video)做常规的 bitmap 转换,我们推荐你使用抽象类 BitmapTransformation。它简化了很多的实现,这应该能覆盖 95% 的应用场景啦。

    /**
     * Created by dell on 2016/9/20.
     */
    public class BlurTransformation extends BitmapTransformation {
    
        public BlurTransformation(Context context) {
            super( context );
        }
        @Override
        protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
            return null; // todo
        }
    
        @Override
        public String getId() {
            return null; // todo
        }
    }
    

    定义完成之后,在加载图片时设置如下:

    Glide
           .with( context )
           .load( eatFoodyImages[0] )
           .transform( new BlurTransformation( context ) )
           //.bitmapTransform( new BlurTransformation( context ) ) // this would work too!
          .into( imageView1 );
    

    Github上有个开源项目 ,glide-transformations,它为 Glide 转换提供了多种多样的实现。非常值得去看一下,说不定你的想法已经在它那里实现了。

    2.10 自定义GlideModule

    Glide 一些配置都在这里设置,设置图片质量、缓存大小及目录等

    
    /**
     * Created by xiehui on 2016/8/29.
     */
    public class ConfigurationGlide implements GlideModule {
        @Override
        public void applyOptions(final Context context, GlideBuilder builder) {
            //配置 , 默认是ARGB8888(每像素4字节存储) 和 RGB565(每像素2字节存储)
            builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    
    
    
    
            //磁盘缓存默认是250M,路径名image_manager_disk_cache如下
            builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 1024 * 1024 * 100));//内部磁盘缓存
            builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, 100 * 1024 * 1024));//磁盘缓存到外部存储
    
            //指定缓存目录1
            String downLoadPath = Environment.getDownloadCacheDirectory().getPath();
            builder.setDiskCache(new DiskLruCacheFactory(downLoadPath, 1024 * 1024 * 100));
    
            //指定缓存目录2
            builder.setDiskCache(new DiskCache.Factory() {
                @Override
                public DiskCache build() {
                    File cacheLocation = new File(context.getExternalCacheDir(), "cache_dir");
                    cacheLocation.mkdirs();
                    return DiskLruCacheWrapper.get(cacheLocation, 1024 * 1024 * 100);
                }
            });
        }
    
        @Override
        public void registerComponents(Context context, Glide glide) {
        }
    }
    

    在manifest文件中添加配置

    <meta-data android:name="demo.com.eventbusdemo.ConfigurationGlide"
     android:value="GlideModule"/>
    

    2.11

    参考文档

    1、详谈高大上的图片加载框架Glide -应用篇
    2、详谈高大上的图片加载框架Glide -源码篇
    3、Glide - 开始 ! :对Gldie有全面介绍,基本用法及高级用法
    4、Glide Github主页

    相关文章

      网友评论

          本文标题:图片加载之Glide

          本文链接:https://www.haomeiwen.com/subject/qptoettx.html