精华内容
参与话题
问答
  • Glide

    千次阅读 2018-07-26 21:27:57
    Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片。  Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、...

    一个图片加载库
    Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片。 
    Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。

    为什么使用Glide ? TT5
    多种图片格式的缓存,适用于更多的内容表现形式(如Gif、WebP、缩略图、Video)
    生命周期集成(根据Activity或者Fragment的生命周期管理图片加载请求)
    高效处理Bitmap(bitmap的复用和主动回收,减少系统回收压力)
    高效的缓存策略,灵活(Picasso只会缓存原始尺寸的图片,Glide缓存的是多种规格),加载速度快且内存开销小(默认Bitmap格式的不同,使得内存开销是Picasso的一半)

    (WebP(发音weppy,项目主页),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8。根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使这些 PNG 文件经过其他压缩工具压缩之后,WebP 还是可以减少 28%的文件大小。)

    Glide 的使用?
    Glide.with(Context)
              .load(Url)
              .into(imageView);

    目前,Glide最稳定版本是3.7.0   
                        最新版本是4.2.0       
     
    使用Glide 加载一张图片
    Glide.with(Context).load(Url) .into(imageView);
    这一行代码进可以做非常非常多的事情了,包括加载网络上的图片、加载手机本地的图片、加载应用资源中的图片等等。
    下面我们就来详细解析一下这行代码。

    首先,调用Glide.with()方法用于创建一个加载图片的实例。with()方法可以接收Context、Activity或者Fragment类型的参数。也就是说我们选择的范围非常广,
    不管是在Activity还是Fragment中调用with()方法,都可以直接传this。那如果调用的地方既不在Activity中也不在Fragment中,可以获取当前应用程序的ApplicationContext,
    传入到with()方法当中。注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,
    图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。

    接下来看一下load()方法,这个方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。
    因此load()方法也有很多个方法重载,除了加载一个字符串网址之外,你还可以这样使用load()方法:
    // 加载本地图片
    File file = new File(getExternalCacheDir() + "/image.jpg");
    Glide.with(this).load(file).into(imageView);

    // 加载应用资源
    int resource = R.drawable.image;
    Glide.with(this).load(resource).into(imageView);

    // 加载二进制流
    byte[] image = getImageBytes();
    Glide.with(this).load(image).into(imageView);

    // 加载Uri对象
    Uri imageUri = getImageUri();
    Glide.with(this).load(imageUri).into(imageView);

    看一下into()方法,我们希望让图片显示在哪个ImageView上,把这个ImageView的实例传进去就可以了。

    现在我们来学一些Glide的扩展内容。其实刚才所学的三步走就是Glide最核心的东西,而我们后面所要学习的所有东西都是在这个三步走的基础上不断进行扩展而已。

    观察刚刚加载网络图片的效果,你会发现图片需要稍微等一会图片才会显示出来。这其实很容易理解,因为从网络上下载图片本来就是需要时间的。我们可以进一步的优化一下用户体验,Glide提供了各种各样非常丰富的API支持,其中就包括了占位图功能。

    顾名思义,占位图就是指在图片的加载过程中,我们先显示一张临时的图片,等图片加载出来了再替换成要加载的图片。
    Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);
    我们只是在刚才的三步走之间插入了一个placeholder()方法,然后将占位图片的资源id传入到这个方法中即可。另外,这个占位图的用法其实也演示了Glide当中绝大多数API的用法,其实就是在load()和into()方法之间串接任意想添加的功能就可以了。
    运行完之后很可能是根本看不到占位图效果的。因为Glide有非常强大的缓存机制,我们刚才加载那张必应美图的时候Glide
    自动就已经将它缓存下来了,下次加载的时候将会直接从缓存中读取,不会再去网络下载了,因而加载的速度非常快,
    所以占位图可能根本来不及显示。可以使用diskCacheStrategy()方法,并传入DiskCacheStrategy.NONE参数,这样就可以禁用掉Glide硬盘缓存功能。
    除了这种加载占位图之外,还有一种异常占位图。异常占位图就是指,如果因为某些异常情况导致图片加载失败,比如说手机网络信号不好,这个时候就显示这张异常占位图。
    添加一个error()方法就可以指定异常占位图了。

    我们还需要再了解一下Glide另外一个强大的功能,那就是Glide是支持加载GIF图片的。而使用Glide加载GIF图并不需要编写什么额外的代码,Glide内部会自动判断图片格式。也就是说,不管我们传入的是一张普通图片,还是一张GIF图片,Glide都会自动进行判断,并且可以正确地把它解析并展示出来。

    asBitmap()方法,这个方法的意思就是说这里只允许加载静态图片,如果是gif则加载第一帧。
    asGif()方法,这个方法的意思就是说这里只允许加载动态图片 ,如果是非gif,则加载失败。
    override()方法指定了一个图片的尺寸

    使用Glide还有一个更重要的就是,完全不用担心图片内存浪费,甚至是内存溢出的问题。因为Glide从来都不会直接将图片的完整尺寸全部加载到内存中,而是用多少加载多少。Glide会自动判断ImageView的大小,然后只将这么大的图片像素加载到内存当中,帮助我们节省内存开支。

    Glide的缓存设计可以说是非常先进的,考虑的场景也很周全。在缓存这一功能上,
    Glide又将它分成了两个模块,一个是内存缓存,一个是硬盘缓存。

    内存缓存的主要作用是防止应用重复将图片数据读取到内存当中,
    硬盘缓存的主要作用是防止应用重复从网络或其他地方重复下载和读取数据。

    内存缓存和硬盘缓存的相互结合才构成了Glide极佳的图片缓存效果

    首先要知道,默认情况下,Glide自动就是开启内存缓存的。
    也就是说,当我们使用Glide加载了一张图片之后,这张图片就会被缓存到内存当中,只要在它还没从内存中被清除之前,下次使用Glide再加载这张图片都会直接从内存当中读取,而不用重新从网络或硬盘上读取了,这样无疑就可以大幅度提升图片的加载效率。比方说你在一个RecyclerView当中反复上下滑动,RecyclerView中只要是Glide加载过的图片都可以直接从内存当中迅速读取并展示出来,从而大大提升了用户体验。

    而Glide最为人性化的是,你甚至不需要编写任何额外的代码就能自动享受到这个极为便利的内存缓存功能,
    因为Glide默认就已经将它开启了。
    如果不想使用内存缓存的话调用skipMemoryCache()方法并传入true,就表示禁用掉Glide的内存缓存功能。

    内存缓存就是LruCache算法(LeastRecentlyUsed),也叫 近期最少使用算法。它的主要算法原理就是把最近使用的
    对象用强引用存储在LinkedHashMap中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。
    Glide内存缓存的实现自然也是使用的LruCache算法。不过除了LruCache算法之外,Glide还结合了一种弱引用的机制,
    共同完成了内存缓存功能
    了解:
      LruCache存储是在LinkedHashMap,因为LruCache中Lru算法的实现就是通过LinkedHashMap来实现的。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,这种顺序有两种,一种是LRU顺序,一种是插入顺序,这可以由其构造函数publicLinkedHashMap(intinitialCapacity,floatloadFactor,booleanaccessOrder)指定。
    所以,对于get、put、remove等操作,LinkedHashMap除了要做HashMap做的事情,还做些调整Entry顺序链表的工作。LruCache中将LinkedHashMap的顺序设置为LRU顺序来实现LRU缓存,每次调用get(也就是从内存缓存中取图片),则将该对象移到链表的尾端。调用put插入新的对象也是存储在链表尾端,这样当内存缓存达到设定的最大值时,将链表头部的对象(近期最少用到的)移除。

    这个diskCacheStrategy()方法基本上就是Glide硬盘缓存功能的一切,它可以接收四种参数:
    DiskCacheStrategy.NONE: 表示不缓存任何内容。
    DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
    DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
    DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
    上面四种参数的解释本身并没有什么难理解的地方,但是有一个概念大家需要了解,就是当我们使用Glide去加载一张图片的时候,Glide默认并不会将原始图片展示出来,而是会对图片进行压缩和转换(我们会在后面学习这方面的内容)。总之就是经过种种一系列操作之后得到的图片,就叫转换过后的图片。而Glide默认情况下在硬盘缓存的就是转换过后的图片,我们通过调用diskCacheStrategy()方法则可以改变这一默认行为。
    硬盘缓存的实现也是使用的LruCache算法,而且Google还提供了一个现成的工具类DiskLruCache。基本的实现原理都是差不多的。

    只需要通过skipMemoryCache()  跳过内存缓存
                  和diskCacheStrategy()  磁盘缓存策略
    这两个方法就可以轻松自如地控制Glide的缓存功能了。

    Glide 和 Picasso 区别

    从内存开销来说
    Picasso 加载图片时的内存是Glide 的两倍
    原因是Picasso是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小。
    而Glide加载的大小和ImageView的大小是一致的,因此更小。
    在这个问题上Glide完胜Picasso。因为Glide可以自动计算出任意情况下的ImageView大小。

    从缓存问题来说
    不管大小如何Picasso只缓存一个全尺寸的。
    Glide则不同,它会为每种大小的ImageView缓存一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。
    Glide的这种方式优点是加载显示非常快。而Picasso的方式则因为需要在显示之前重新调整大小而导致一些延迟,
    相对来说用户体验不太好。

    Glide可以加在GIF动态图,而Picasso不能。 

    总结

    Glide和Picasso都是非常完美的库。Glide加载图像以及磁盘缓存的方式都要优于Picasso,速度更快,
    并且Glide更有利于减少OutOfMemoryError(内存不足错误)的发生,GIF动画是Glide的杀手锏。不过Picasso的图片质量更高。

    如果想要更深入的了解Glide 可以去GSDN上搜郭霖的博客上边有更详细的讲解
    博客地址:https://blog.csdn.net/guolin_blog


     

    展开全文
  • glide

    2016-10-23 17:05:59
    -keep public class * implements com.bumptech.glide.module.GlideModule okhttp   官方链接。  要注意:一定要忽略OkHttpGlideModule的混淆。 自定义配置与GlideBuilder  实现GlideModule接口,并在清单文件...

    配置

    混淆

    	-keep public class * implements com.bumptech.glide.module.GlideModule
    

    okhttp

            官方链接

            要注意:一定要忽略OkHttpGlideModule的混淆。

    自定义配置与GlideBuilder

            实现GlideModule接口,并在清单文件中如同okhttp配置一般进行配置。如:

            <meta-data android:name="com.xxx.code.GlideModuleConfig"
                android:value="GlideModule" />
            其中name指向的就是自己定义的GlideModule。自定义配置示例如下:
    public class GlideModuleConfig implements GlideModule {
        //创建Glide实例前,对Glide实例进行设置。仅会被调用一次
        @Override
        public void applyOptions(Context context, GlideBuilder builder) {
            builder.setDecodeFormat(DecodeFormat.DEFAULT);//定义图片格式
            //设置sd卡缓存位置——External默认存储在context.getExternalCacheDir()目录中
            //也可以在ExternalCacheDiskCacheFactory中指定存储路径——放在context.getExternalCacheDir()哪个目录下,
            //同时也可指定sd卡缓存大小。或者直接继承实现DiskLruCacheFactory,定义自己的glide缓存目录路径。
            builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
            int size = (int) (Runtime.getRuntime().maxMemory() / 8);
            //设置图片池大小——用于bitmap的重复使用
            builder.setBitmapPool(new LruBitmapPool(size));
            //设置缓存内存
            builder.setMemoryCache(new LruResourceCache(size));
        }
    
        //向Glide实例中注册组件。在Glide实例创建完成,但没有发起任何请求之前调用
        @Override
        public void registerComponents(Context context, Glide glide) {
            //        glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory()); 此为Okhttp进行的操作
        }
    }

    常用方法

            get():Glide的静态方法,用于获取Glide的单例。

            getBitmapPool():获取bitmapPool实例。

            clearXXXX():清除内存/硬盘缓存。

            with():将Glide实例绑定到某一个Activity/Context/Fragment/FragmentActivity的生命周期中。获取Glide的实例的静态方法。

            load():加载路径指定的图片。可以加载的格式有;url、文件、本地资源图片(R.mipmap.xxxx)、Uri等。

            animate():设置图片显示时的动画。可以是补间动画——Animation对象或R.anim.xxxx都可,也可以是ViewPropertyAnimation.Animator。如下:

            Animation anim = new AlphaAnimation(0,1);
            ScaleAnimation a2 = new ScaleAnimation(0.1f,1,0.1f,1f);
            AnimationSet set = new AnimationSet(true);
            set.addAnimation(anim);
            set.addAnimation(a2);
            set.setDuration(5000);
            set.setFillAfter(true);
    
            File file = new File(Environment.getExternalStorageDirectory(), "xxx.jpg");
    //        Glide.with(this).load(R.mipmap.draw).asBitmap().into(iv); //加载资源文件
    //        Glide.with(this).load(Uri.fromFile(file)).animate(R.anim.test).into(iv);  //加载Uri
    //        Glide.with(this).load(url).animate(anim).into(iv);  // 加载String类型的Url
            ViewPropertyAnimation.Animator alpha = new ViewPropertyAnimation.Animator() {
                @Override
                public void animate(View view) {  // 在该方法中为view执行相应的动画
                    ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1);
                    scaleX.setDuration(5000);
                    scaleX.start();
                }
            };
            Glide.with(getApplicationContext()).load(Uri.fromFile(file)).animate(alpha).into(iv);

            asBitmap(),asGif():将资源加载成bitmap或者gif。

            skipMemoryCache():跳过内存缓存。

            diskCacheStrategy():硬盘缓存策略。NONE——不进行缓存;ALL——都进行缓存;SOURCE——缓存源资源;RESULT——缓存对源资源进行转换后的资源(bitmapTransform()之后的资源),但不缓存源资源。

            placeholder(),error():占位图。

            into():加载资源后的处理方式。传入ImageView会将加载的图片显示在ImageView上;传入两int会将加载的图片成指定的大小,再通过get()方法可以获取一个Bitmap对象,因为get方法是阻塞式的,所以必须在子线程中操作。传入Target对象时,可以监听图片加载过程中的各个状态:开始加载、加载失败、加载成功等。如:

            Glide.with(this).load(url).asBitmap().placeholder(R.mipmap.draw).error(R.mipmap.error).into(new SimpleTarget<Bitmap>() {
                @Override
                public void onLoadStarted(Drawable placeholder) {
                    Log.e(TAG,"onLoadStarted");
                    iv.setImageDrawable(placeholder);  //开始加载时设置成占位符,对应的是placeholder
                }
    
                @Override
                public void onLoadFailed(Exception e, Drawable errorDrawable) {
                    Log.e(TAG,"onLoadFailed");
                    iv.setImageDrawable(errorDrawable);  // 加载失败时,对应的是error()
                }
    
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    Log.e(TAG,"onResourceReady");
                    iv.setImageBitmap(resource);  // 图片加载成功
                }
            });
            bitmapTransform():将Glide得到的Bitmap进行转换操作,比如转换成圆角的、进行模糊等。多种效果可参考开源转换项目。注意:占位图和错误图是不会通过该方法进行转换的。如:
            Glide.with(this).load(url).bitmapTransform(new Transformation<Bitmap>() {
                @Override
                public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
                    Bitmap src = resource.get();  // 加载的原图片,一般来说是对该bitmap对象进行操作
                    int width = src.getWidth();
                    int height = src.getHeight();
    
                    // 可以看出bitmapPool的作用——对转换src时需要用到的bitmap进行缓存,防止重复创建导致OOM.
                    // 比如常用的LruBitmapPool就是按Lru策略对Bitmap进行缓存
                    BitmapPool pool = Glide.get(MainActivity.this).getBitmapPool();
                    Bitmap b = pool.get(width, height, Bitmap.Config.ARGB_8888);
                    if (b == null) {
                        b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                        pool.put(b);
                    }
                    Canvas canvas = new Canvas(b);
                    Path path = new Path();
                    path.addCircle(b.getWidth() / 2, b.getHeight() / 2, 100, Path.Direction.CW);
                    canvas.clipPath(path);
                    canvas.drawBitmap(src, 0, 0, null);
                    return BitmapResource.obtain(b, pool);
                }
    
                @Override
                public String getId() {  // 这个方法不能返回null
                    return url;
                }
            }).into(iv);

    BitmapPool与MemoryCache

            Glide加载完毕指定的资源图片src后,可以通过bitmapTransform()对图片进行转换——如圆角模糊等。在转换的过程中,可能需要别的Bitmap对象进行辅助,而BitmapPool就是对这些辅助的Bitmap进行缓存管理MemoryCache是对src进行内存缓存管理的。





    展开全文
  • Glide详解

    万次阅读 2019-07-02 10:04:26
    现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有Facebook的Fresco。每一个都非常稳定,功能也都十分...

    现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有Facebook的Fresco。每一个都非常稳定,功能也都十分强大。但是它们的使用场景基本都是重合的,也就是说我们基本只需要选择其中一个来进行学习和使用就足够了,每一个框架都尝试去掌握的话则有些浪费时间。Glide和Picasso 有90%相似度,而Glide在Picasso基础上进行的二次开发,可以其优势显而易见。

    一.添加依赖

    repositories {
      mavenCentral()
      google()
    }

    dependencies {
    implementation 'com.github.bumptech.glide:glide:4.8.0'//glide第三方图片加载所需要的包
    }

    二.添加权限

       <uses-permission android:name="android.permission.INTERNET"/>
        //它可以监听用户的连接状态并在用户重新连接到网络时重启之前失败的请求
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        //用于硬盘缓存和读取
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

     

    三.用法

    3.1基本使用

    string url="图片地址";

    3.1.1加载图片三步走,1,with; 2,load; 3 into;

    Glide.with(this)             //with()方法可以接收Context、Activity或者Fragment类型的参数
                    .load(url)        //load方法中不仅可以传入图片地址,还可以传入图片文件File,resource,图片的byte数组等
                    .into(imageView);
        注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。

    // 加载本地图片
    File file = new File(getExternalCacheDir() + "/image.jpg");
    Glide.with(this).load(file).into(imageView);

    // 加载应用资源
    int resource = R.drawable.image;
    Glide.with(this).load(resource).into(imageView);

    // 加载二进制流
    byte[] image = getImageBytes();
    Glide.with(this).load(image).into(imageView);

    // 加载Uri对象
    Uri imageUri = getImageUri();
    Glide.with(this).load(imageUri).into(imageView);
     注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。


    加载圆形图

    Glide.with(this)
            .load(R.mipmap.ic_splash_bg)
            .apply(bitmapTransform(new CropCircleTransformation()))
            .into(mImageHead);
     模糊过滤

    Glide.with(this)
                    .load(R.mipmap.ic_splash_bg)
                    .apply(bitmapTransform(new BlurTransformation( 25, 4)))
                    .into(mImageView);


      
        3.1.2取消图片也是三步走,1,with; 2,load; 3 clear;
        Glide.with(this).load(url).clear();
        一般来很少会用到取消图片的,因为图会跟with(this)生命周期消亡而消亡的。


    3.2Glide中的大部分设置项都可以通过 RequestOptions 类和 apply() 方法来应用到程序中

    RequestOptions options = new RequestOptions()
                    .placeholder(R.mipmap.ic_launcher)                //加载成功之前占位图
                    .error(R.mipmap.ic_launcher)                    //加载错误之后的错误图
                    .override(400,400)                                //指定图片的尺寸
                    //指定图片的缩放类型为fitCenter (等比例缩放图片,宽或者是高等于ImageView的宽或者是高。)
                    .fitCenter()
                    //指定图片的缩放类型为centerCrop (等比例缩放图片,直到图片的狂高都大于等于ImageView的宽度,然后截取中间的显示。)
                    .centerCrop()
                    .circleCrop()//指定图片的缩放类型为centerCrop (圆形)
                    .skipMemoryCache(true)                            //跳过内存缓存
                    .diskCacheStrategy(DiskCacheStrategy.ALL)        //缓存所有版本的图像
                    .diskCacheStrategy(DiskCacheStrategy.NONE)        //跳过磁盘缓存
                    .diskCacheStrategy(DiskCacheStrategy.DATA)        //只缓存原来分辨率的图片
                    .diskCacheStrategy(DiskCacheStrategy.RESOURCE)    //只缓存最终的图片
                    ;
            Glide.with(this)
                    .load(url)
                    .apply(options)
                    .into(imageView);
    注意 实际上,使用Glide在大多数情况下我们都是不需要指定图片大小的,因为Glide会自动根据ImageView的大小来决定图片的大小,以此保证图片不会占用过多的内存从而引发OOM。不过,如果你真的有这样的需求,必须给图片指定一个固定的大小,Glide仍然是支持这个功能的。修改Glide加载部分的代码,仍然非常简单,这里使用override()方法指定了一个图片的尺寸。也就是说,Glide现在只会将图片加载成400*400像素的尺寸,而不会管你的ImageView的大小是多少了。如果你想加载一张图片的原始尺寸的话,可以使用Target.SIZE_ORIGINAL关键字,.override(Target.SIZE_ORIGINAL);这样的话,Glide就不会再去自动压缩图片,而是会去加载图片的原始尺寸。当然,这种写法也会面临着更高的OOM风险。
                这个diskCacheStrategy()方法基本上就是Glide硬盘缓存功能的一切,它可以接收五种参数:
                DiskCacheStrategy.NONE: 表示不缓存任何内容。
                DiskCacheStrategy.DATA: 表示只缓存原始图片。
                DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片。
                DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
                DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)。
                    
        Glide其中一个非常亮眼的功能就是可以加载GIF图片,而同样作为非常出色的图片加载框架的Picasso是不支持这个功能的。而且使用Glide加载GIF图并不需要编写什么额外的代码,Glide内部会自动判断图片格式。
        但是如果我想指定加载格式该怎么办呢?想实现这个功能仍然非常简单,我们只需要再串接一个新的方法就可以了
            Glide.with(this)
                 .asBitmap()
                 .load(url)
                 .into(imageView);
            这里在with()方法的后面加入了一个asBitmap()方法,这个方法的意思就是说这里只允许加载静态图片,不需要Glide去帮我们自动进行图片格式的判断了。如果你传入的还是一张GIF图的话,Glide会展示这张GIF图的第一帧,而不会去播放它。对应的方法是asGif()。而Glide 4中又新增了asFile()方法和asDrawable()方法,分别用于强制指定文件格式的加载和Drawable格式的加载.

    另:Glide加载转换Bitmap 方法:

    try {
        Bitmap bitmap = Glide
                .with(this)
                .asBitmap()//这一个必须加
                .load("url")
                .into(100, 100)
                .get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

     

    四.Glide4.8.0升级后的使用

    glide升级到4.8.0后原方法error/preload/fallback/signature无法使用

    现在改成:

     

    原方法error/preload/fallback等方法都在RequestOptions中添加,其中之前.signature()方法形参支持使用StringSignature,但是现在StringSignature完全被废掉了,不过你可以借用signature方法中的Key中的一个使用相对方便的子类ObjectKey,构造方法以Object为参数:

    signature它是用来刷新glide填充的图片刷新用的。
    简单使用,先整起来,具体原因下次分晓。

    五.Glide常见错误

    5.1java.lang.IllegalArgumentException: You must not call setTag() on a view

    使用Glide发现这个bug,发现glide要对ImageView设置url为tag会报错,解决方法:imageView的setTag()去掉

    或者:https://blog.csdn.net/yuangudashen/article/details/75287670

     

    展开全文
  • Glide图片加载方案

    2020-06-13 13:49:23
    Glide

    图片加载要考虑的问题

    图片加载不仅仅是将图片显示出来的问题,不同场景该使用什么缩放模式?activity销毁后图片还在后台请求?是否会造成内存浪费?设置占位符和加载失败的图片?圆角图等怎么变换?

    读郭霖Glide图片加载框架总结

    带着以上问题,拜读了郭霖大神的Glide图片加载框,总结并实际验证,得出以下几点:

    1.图片加载周期

    Glide最简单的用法:

    Glide.with(context).load(url).into(imageView)
    

    with()方法中传入的Context实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。

    想法:传入ImageView.getContext()实例是不是最好的方案,ImageView所在的Context销毁了,图片自然应该取消加载。此方案是否可行?列表的回收机制会不会有问题?

    结论:不是最好的方案,fragment和adapter中ImageView.getContext()返回的都是Activity,当fragment或adapter销毁但activity并没有销毁时,图片仍会加载,所以生命周期并不合理

    2.图片格式(Bitmap,Gif)

    Glide是支持加载GIF图片的,不需要编写额外的代码,Glide内部会自动判断图片格式(Gif图不一定是以.gif后缀结尾的哦。

    当然也可以手动指定图片格式:
    调用了asBitmap()方法,静态图正常加载,GIF图无法正常播放,会在界面上显示第一帧的图片;
    调用了asGif()方法,GIF图正常加载和播放,静态图加载失败。

    想法:一般情况下不需要指定图片格式,动图的播放机制(一直循环播放/只播放一次)怎么设置?默认是循环播放

    结论:设置监听,回调中设置播放次数,如下:

    Glide.with(this)
       		.load(url)
        	.addListener(new RequestListener<Drawable>() {
            	@Override
            	public boolean onLoadFailed(
            	@Nullable GlideException e, Object model, 				
            	Target<Drawable> target, boolean isFirstResource) {
                return false;
            }
    
            	@Override
            	public boolean onResourceReady(Drawable resource, 
            	Object model, Target<Drawable> target, 
            	DataSource dataSource, 
            	boolean isFirstResource) {
                if (resource instanceof GifDrawable) {
                    //设置播放次数
                    ((GifDrawable) resource).setLoopCount(3);
                }
                return false;
            }
        })
        .into(iv);
    

    缓存

    在缓存这一功能上,Glide又将它分成了两个模块,一个是内存缓存,一个是硬盘缓存。
    默认情况下,Glide自动就是开启内存缓存和磁盘缓存的。
    磁盘缓存是存在哪的?是否需要动态权限,未授权时磁盘缓存是不是就失效了?

    结论:磁盘缓存默认存储在应用内部文件,访问应用内部文件无需动态申请权限

    集成网络框架

    Glide默认使用的是HttpUrlConnection,支持集成Volley,Okhttp等其它网络栈。
    想法:一般用的时候没有集成过网络栈,如何集成?

    权限

    一般使用场景是加载网络图片,Internet权限肯定是要的,但还有个小细节:如果你正在从 URL 加载图片,Glide 可以自动帮助你处理片状网络连接:它可以监听用户的连接状态并在用户重新连接到网络时重启之前失败的请求。如果 Glide 检测到你的应用拥有 ACCESS_NETWORK_STATE 权限,Glide 将自动监听连接状态而不需要额外的改动。

    占位符

    placeHolder
    error
    fallback

    占位图是否会影响控件的大小?
    结论:不会,网上有人说会有问题,我用的Glide4.9版本试的,可能Glide已经修复了

    淡入效果

    transitionOption

    变换

    缩放模式适配不同场景:

    启动页/广告页

    全屏展示(填充宽高),不变形,尽可能少的裁剪内容[我特地问了做设计的朋友,他们是有设计规范的,四周不会放内容,xx像素内是内容区域。所以适当的裁剪掉边上的内容是没有问题的]。使用centerCrop就可满足上述条件。

    banner

    banner一般都是以ViewPager做容器,ViewPager的高度是不支持wrap_content的,也就是说要么指定高度,要么match_parent。banner的宽一般是固定的,高度若是写死,采用fitXY在有些手机上会有变形;fitCenter周边可能会有留白;centerCrop又会裁剪掉边上的内容 (banner一般要求不能裁剪,本来区域就不大,你还裁剪,可能会丢失重要内容)。

    宽固定,高根据图片比例算出控件高,设置给ViewPager,因为viewPager会预加载两边的view,所以适配的前提是所有banner图片宽高比一致(一般都能满足)

    Glide.with(context)
                  .load(url)
                  .addListener(new RequestListener<Drawable>() {
                      @Override
                      public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                          return false;
                      }
    
                      @Override
                      public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                      //根据图片宽高比设置容器的高度
                          int intrinsicWidth = resource.getIntrinsicWidth();
                          int intrinsicHeight = resource.getIntrinsicHeight();
                          int height = intrinsicHeight * width / intrinsicWidth;
                          layoutParams.height = height;
                          return false;
                      }
                  })
                  .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                  .transform(new RoundedCorners(10))
                  .into(imageView);
    
    固定宽高

    图片不变形,不裁剪,fitCenter即可满足。

    圆角

    RoundedCorners

    圆形

    CircleCrop

    不得不说Glide的设计真的满足了我们99%的场景需求了。

    展开全文
  • 虽说只有这简简单单的一行代码,但大家可能不知道的是,Glide在背后帮我们默默执行了成吨的工作。这个形容词我想了很久,因为我觉得用非常多这个形容词不足以描述Glide背后的工作量,我查到的英文资料是用tons of
  • Glide适配Androidx 背景 项目中使用的Glide版本是3.7.0。因为项目整体要迁移到Androidx,所以开始了一场Glide的大版本升级旅程。 官方文档 https://muyangmin.github.io/glide-docs-cn/doc/download-setup.html 按照...
  • Glide使用详解(一)

    万次阅读 多人点赞 2016-04-12 12:25:23
    Glide使用 Glide使用教程 Glide详解 Android图片加载 一. 下载在build.gradle中添加依赖: compile 'com.github.bumptech.glide:glide:3.7.0'需要support-v4库的支持,如果你的项目没有support-v4库(项目默认已经...
  • Glide使用

    2019-05-09 10:03:11
    https://github.com/bumptech/glide 依赖: // glide implementation 'com.github.bumptech.glide:glide:4.8.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' ...Glide.with(this).load(str...
  • glide溯源

    2018-10-10 11:16:26
    最近有时间看了glide的源码,于是想写一下关于glide源码的一些解释和说明,一方面供后来者更好的去阅读glide源码,一方面也为自己的学习做一个记录,本次glide源码分析基于glide4.8.0版本(下载地址),以下是glide...
  • glide图片缓存

    2017-05-16 18:02:46
    glide图片缓存
  • Glide ModulesGlide module 是一个抽象方法,全局改变 Glide 行为的一个方式。如果你需要访问 GlideBuilder,它要在你要做的地方创建 Glide 实例,这是要做的一种方法。为了定制 Glide,你需要去实现一个 ...
  • glide 4.2版本

    2017-11-02 10:55:51
    glide 最新版本,glide-full-4.2.0.jar 比之前使用起来有点小差异
  • Glide命令,如何使用glideglide.lock

    千次阅读 2017-02-13 17:24:01
    Desc:10分钟了解glide相关命令,做好包管理准备以下是Glide命令,其中大部分命令是帮助您管理工作区。glide create (别名 init)初始化新工作区。除此之外,这会创建一个glide.yaml文件,同时试图猜测包和版本。例如...
  • Glide 3到Glide 4

    2018-05-31 16:39:07
    基本用法:和Glide3一样Glide.with(this).load(url).into(img);设置占位图、缓存等参数:RequestOptions options = new ReqeustOptions() .placeholder(R,mipmap.loading) .error(R.mipmap.error) ....
  • Glide-通过Modules定制Glide

    万次阅读 2017-02-15 13:08:36
    前言:我们一般情况下使用Glide都很简单,只用简单的调用几个方法就能够很好的显示图片了,但其实Glide在初始化的时候进行了一系列的默认配置,比如缓存的配置,图片质量的配置等等.接下来我们就介绍一下一个比较高级的...
  • Glide Modules Glide modules是一个全局改变Glide行为的抽象的方式。你需要创建Glide的实例,来访问GlideBuilder。可以通过创建一个公共的类,实现GlideModule的接口来定制Glide: public class SimpleGlideModule...
  • Glide圆角

    2019-02-17 18:53:48
    implementation ‘jp.wasabeef:glide-transformations:3.3.0’ protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_glide...
  • 我想大多数人在自己的项目中还是使用Glide3.7.1这个版本吧!不过Glide版本现在已经到4.4.0了! 当我们把Glide3更换成Glide4,会发现大部分地方都报错了,那么该怎样快速替换Glide3为Glide4呢? 下面我们一起来看看...
  • Glide 圆角

    2018-12-06 15:43:04
    //加载圆形头像 Glide3.6 /* Glide.with(getActivity()).load(bean.icon) .asBitmap().centerCrop().into(new BitmapImageViewTarget(mUser_icon) { @Override protected void setResour...
  • 在Android开发过程中,我们常常需要涉及大量的图片加载,图片加载框架设计,是Android高级开发工程师必备的技能,本节将通过分析Glide图片加载框架,来学习如何设计一个图片加载框架。 注意:本节所使用的Glide版本...
  • Glide 简介

    2017-07-20 17:51:01
    Google在2014的开发者论坛上,向我们介绍了一个开源的图片加载的类库Glide。作者BumpTech(碰撞科技)。这个 库被广泛的运用在了Google的开源项目中。 能够被Google如此推崇一定有其过人之处。研究一下发现picaso...

空空如也

1 2 3 4 5 ... 20
收藏数 18,476
精华内容 7,390
关键字:

glide