Glide详解


第三方库Glide地址:https://github.com/bumptech/glide

简单实用:
1,

             Glide.with(context)
                .load(url)// 加载图片资源
//                .skipMemoryCache(false)//是否将图片放到内存中
//                .diskCacheStrategy(DiskCacheStrategy.ALL)//磁盘图片缓存策略
//                .dontAnimate()//不执行淡入淡出动画
                .crossFade(100)// 默认淡入淡出动画300ms
//                .override(300,300)//图片大小
                .placeholder(R.drawable.shouye_haibao)// 占位图片
//                .error(R.drawable.shouye_haibao)//图片加载错误显示
                .centerCrop()//  fitCenter()
//                .animate()// 执行的动画
//                .bitmapTransform(null)// bitmap操作
//                .priority(Priority.HIGH)// 当前线程的优先级
//                .signature(new StringSignature("ssss"))
                .into(iv);

2,

  Glide.with(context)
                .load("url")
                .placeholder(R.drawable.shouye_haibao)
                .into(new ImageViewTarget(iv_head) {
                    @Override
                    protected void setResource(GlideDrawable resource) {
                        view.setImageDrawable(resource);
                    }

                    @Override
                    public void onLoadStarted(Drawable placeholder) {
                        super.onLoadStarted(placeholder);
                    }

                    @Override
                    public void onLoadFailed(Exception e, Drawable errorDrawable) {
                        super.onLoadFailed(e, errorDrawable);
                    }

                    @Override
                    public void onLoadCleared(Drawable placeholder) {
                        super.onLoadCleared(placeholder);
                    }

                    @Override
                    public void onResourceReady(GlideDrawable resource, GlideAnimationsuper GlideDrawable> glideAnimation) {
                        super.onResourceReady(resource, glideAnimation);
                    }
                });

方法解释
.load()加载资源:1,drawable资源。2,本地File文件。3,uri。4,网络图片url
.placeholder() 图片占位符,
.error() 图片加载失败时显示
.crossFade() 显示图片时执行淡入淡出的动画默认300ms
.dontAnimate() 不执行显示图片时的动画
.override() 设置图片的大小
.centerCrop()和fitCenter() 图片的显示方式
.animate() view动画 2个重构方法
.transform() bitmap转换
.bitmapTransform() bitmap转换。 比如:旋转,方法,缩小,高斯模糊等等(当用了转换后你就不能使用 .centerCrop() 或 .fitCenter() 了。
.priority(Priority.HIGH)// 当前线程的优先级
.signature(new StringSignature(“ssss”))
.thumbnail(0.1f) 缩略图,3个重构方法:优先显示原始图片的百分比(10%)
.listener() 异常监听
.into(); 将图片显示到控件,3个构造方法。

以上这些基本满足了App需求


Glide 进阶

内存缓存相关

默认情况下Glide使用InternalCacheDiskCacheFactory类建立磁盘缓存。工厂内部缓存的地方磁盘缓存应用程序的内部缓存目录,设置一个最大大小为250 mb。使用缓存目录而不是外部sd卡意味着没有其他应用程序将能够访问您下载图片。

InternalCacheDiskCacheFactory类
1, data/data目录
internalCacheDir = /data/data/com.personas/cache

ExternalCacheDiskCacheFactory类:
2,SDCARD上/Android/data目录
externalCacheDir=/storage/emulated/0/Android/data/com.personas/cache
3,自己构建存储路径,需要通过GlideModule自己构建Glide

 builder.setDiskCache(new DiskCache.Factory() {
            @Override
            public DiskCache build() {
            // 自己的缓存目录
                File imgFile = new File(Environment.getExternalStorageDirectory()+"/Android/data/包名");
                return DiskLruCacheWrapper.get(imgFile,DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);
            }
        });

内存:Memory Cache
MemorySizeCalculator ,内存估算类:
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));

Bitmap Pool

Glide’s bitmap pool用于各种不同的大小的Bitmap重复使用以其显著减少以及避免垃圾回收Bitmap分配而造成的图像被销毁。

您可以使用GlideBuilder的setBitmapPool()方法来设置位图的大小和/或实现池。LruBitmapPool类的是Glide的默认实现。LruBitmapPool类使用一个LRU算法保留最近使用Bitmap的大小。

Bitmap Format

GlideBuilder类还可以设置一个全局缺省首选Bitmap规格。

默认情况下Glide使用RGB_565,因为它只需要两个字节,比使用高质量和系统默认ARGB_8888节省一半的内存。然而RGB_565在某些图像条带会有问题,也不支持透明度。

如果在您的应用程序有图像条带问题和/或你想要尽可能高的图像质量,您可以使用setDecodeFormat setDecodeFormat方法

比如:Glide配置方式有2种:1,清单文件。2,代码配置

public class FileGlideModule  implements GlideModule{
    @Override
    public void applyOptions(final Context context, GlideBuilder builder) {
//        builder.setDiskCache(new InternalCacheDiskCacheFactory(context));
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
      /*  builder.setDiskCache(new DiskCache.Factory() {
            @Override
            public DiskCache build() {
                File imgFile = new File(Environment.getExternalStorageDirectory()+"/Android/data/com.leying365");
                return DiskLruCacheWrapper.get(imgFile,DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);
            }
        });*/
        MemorySizeCalculator calculator = new MemorySizeCalculator(context);
        builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
        builder.setBitmapPool(new LruBitmapPool(calculator.getBitmapPoolSize()));
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }
}

系统Target:
每个Target的泛型都有三种格式:Bitmap,GlideDrawable,GifDrawable
比如:
SimpleTarget


        SimpleTarget target = new SimpleTarget() {
            @Override
            public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
                    new ImageView(context).setImageBitmap(resource);
            }
        };
        Glide.with(context).load("url").asBitmap().into(target);

如果是:Glide.with(context).load("url").into(target);
target泛型应该是SimpleTarget

如果是:Glide.with(context).load("url").asGif().into(target);
 target泛型应该是SimpleTarget


ImageViewTarget

GlideDrawable:

  Glide.with(context).load("url").into(new ImageViewTarget(new ImageView(context)) {
            @Override
            protected void setResource(GlideDrawable resource) {

            }
        });

Bitmap:

 Glide.with(context).load("url").asBitmap().into(new ImageViewTarget(new ImageView(context)) {
            @Override
            protected void setResource(Bitmap resource) {

            }
        });

GifDrawable:

   Glide.with(context).load("url").asGif().into(new ImageViewTarget(new ImageView(context)) {
            @Override
            protected void setResource(GifDrawable resource) {

            }
        });

类的继承关系图如下:

Glide详解_第1张图片

Glide详解_第2张图片


自定义动画

1,资源文件:
Glide.with(context).load(“url”).animate(R.anim.fade_in).into(iv);
2,属性动画
GlideAnimation四个子类:
   ViewPropertyAnimation
   ViewAnimation
   NoAnimation
   DrawableCrossFadeViewAnimation

        ViewPropertyAnimation.Animator animator =  new ViewPropertyAnimation.Animator() {
            @Override
            public void animate(View view) {
                view.setAlpha( 0f );
                ObjectAnimator fadeAnim = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f);
                fadeAnim.setDuration( 2500 );
                fadeAnim.start();
            }
        };
        Glide.with(context).load("url").animate(animator).into(iv);

异常信息获取

 .listener(new RequestListener() {
                    @Override
                    public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GifDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
                        return false;
                    }
                })

自定义bitmap转换

2种方法:transform()和bitmapTransform()

Glide.with(context).load(“url”).transform().into();
Glide.with(context).load(“url”).bitmapTransform().into();

Glide 转换集合 第三方库 : https://github.com/wasabeef/glide-transformations

public class BlurTransformation extends BitmapTransformation {

    private RenderScript rs;

    public BlurTransformation(Context context) {
        super( context );

        rs = RenderScript.create( context );
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        Bitmap blurredBitmap = toTransform.copy( Bitmap.Config.ARGB_8888, true );

        // Allocate memory for Renderscript to work with
        Allocation input = Allocation.createFromBitmap(
            rs, 
            blurredBitmap, 
            Allocation.MipmapControl.MIPMAP_FULL, 
            Allocation.USAGE_SHARED
        );
        Allocation output = Allocation.createTyped(rs, input.getType());

        // Load up an instance of the specific script that we want to use.
        ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        script.setInput(input);

        // Set the blur radius
        script.setRadius(10);

        // Start the ScriptIntrinisicBlur
        script.forEach(output);

        // Copy the output to the blurred bitmap
        output.copyTo(blurredBitmap);

        toTransform.recycle();

        return blurredBitmap;
    }

    @Override
    public String getId() {
        return "blur";
    }
}



自定义glide https://github.com/bumptech/glide/wiki/Configuration

Glide module 是一个抽象方法,全局改变 Glide 行为的一个方式。如果你需要访问 GlideBuilder,你需要去实现一个 GlideModule 接口的公共类

Glide.setup(new GlideBuilder(context)); 该方法告诉你它已经过时了,请使用GlideModule。

注意要在清单文件里配置:
meta-data android:name=”com.mypackage.MyGlideModule” tools:node=”GlideModule” />

public class FileGlideModule  implements GlideModule{
    @Override
    public void applyOptions(final Context context, GlideBuilder builder) {
//builder 内的所有方法你都可以设置。
//        builder.setDiskCache(new InternalCacheDiskCacheFactory(context));
        builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
      /*  builder.setDiskCache(new DiskCache.Factory() {
            @Override
            public DiskCache build() {
                File imgFile = new File(Environment.getExternalStorageDirectory()+"/Android/data/com.leying365");
                return DiskLruCacheWrapper.get(imgFile,DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);
            }
        });*/
        MemorySizeCalculator calculator = new MemorySizeCalculator(context);
        builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
        builder.setBitmapPool(new LruBitmapPool(calculator.getBitmapPoolSize()));
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {

    }
}

GlideBuilder内部方法:

.setMemoryCache(MemoryCache memoryCache)
.setBitmapPool(BitmapPool bitmapPool)
.setDiskCache(DiskCache.Factory diskCacheFactory)
.setDiskCacheService(ExecutorService service)
.setResizeService(ExecutorService service)
.setDecodeFormat(DecodeFormat decodeFormat)



集成okhttp和volley

动态使用ModelLoader

注册组件

Thanks MrFu: http://mrfu.me/2016/02/27/Glide_Getting_Started/

你可能感兴趣的:(Android)