android开发笔记之Android Studio使用Glide

Glide 介绍

An image loading and caching library for Android focused on smooth scrolling
安卓上专注于平滑滑动的图片加载和缓存库。

Glide有以下特点:

  • 1.注重 list中的图片在scroll状态下的流畅性。
  • 2.可以展示视频图像,普通格式图片和GIF格式。
  • 3.默认网络请求使用的是httpurlconnection,同时支持自定义使用volley 或者 ok。
  • 4.自定义多个请求的优先级,重要的图片,可以设置高的优先级,优先加载。
  • 5.可以给url 设置一个签名,当url 指向不变,图片内容变化时,根据签名不同,去自动更换以缓存的图片,这一点是imagoader无法做到的。
  • 6.更有一个非常优秀的特点,可以在非ImageView 类型上面加载图片。
  • 7.Glide 对内存的使用非常优秀,并且Glide生命周期与Activity生命周期绑定,更好的分配回收内存。

导入库

导入Glide

    //add glide
    compile 'com.github.bumptech.glide:glide:3.8.0'

我们可以和picasso做比较,导入picasso:

    //add picasso
    compile 'com.squareup.picasso:picasso:2.5.1'

使用方法

Picasso基本使用方法:

Picasso.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(imageView_00);

Glide基本使用方法:

Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(imageView_01);
  GlideApp
    .with(myFragment)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_spinner)
    .into(myImageView);

with() :使Glide 的生命周期与当前对象绑定,可以是Activity Fragment Context等等。
load():可以加载一个本地图片,或者网络图片地址,也可以是Android工程的 内部Resource 图片资源。
into():将展示在ImageView 对象。

虽然两者看起来一样,但是Glide更易用,因为Glide的with方法不光接受Context,还接受Activity 和 Fragment,Context会自动的从他们获取。图片加载会和Activity/Fragment的生命周期保持一致.

这里写图片描述

效果图:
这里写图片描述

ARGB_8888效果图

Glide的默认Bitmap格式为RGB_565,但是如果你觉得难以接受,可以创建一个新的GlideModule将Bitmap格式转换到ARGB_8888:

import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.module.GlideModule;

public class GlideConfiguration implements GlideModule {

    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // Apply options to the builder here.
        builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
        // register ModelLoaders here.
    }
}

在AndroidManifest.xml中将GlideModule定义为meta-data:

        <meta-data android:name="android.com.debugdemo.TestGlide.GlideConfiguration"
                   android:value="GlideModule"/>

可以得到如下效果图:

这里写图片描述

这个细小的效果差别,你感觉到了吗?

transform或bitmapTransform()

比如模糊效果:

import android.content.Context;
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;

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(20);

        // 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";
    }
}
        imageView_03 = (ImageView) findViewById(R.id.imageView_03);
        Glide.with(TestGlideDemo.this)
                .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
                //.transform(new BlurTransformation(context))
                .bitmapTransform( new BlurTransformation( context ) ) // this would work too!
                .into(imageView_03);

效果图:
这里写图片描述

加载GIF动态图

music为应用中的gif动态图,/drawable/music.gif,我们加载此图片显示:

        imageView_05 = (ImageView) findViewById(R.id.imageView_05);
        Glide.with(context)
                .load(R.drawable.music)
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imageView_05);

关键方法的说明

1thumbnail(float sizeMultiplier)
请求给定系数的缩略图。如果缩略图比全尺寸图先加载完,就显示缩略图,否则就不显示。系数sizeMultiplier必须在(0,1)之间,可以递归调用该方法。

2.sizeMultiplier(float sizeMultiplier).
在加载资源之前给Target大小设置系数。

3.diskCacheStrategy(DiskCacheStrategy strategy).
设置缓存策略。
DiskCacheStrategy.SOURCE:缓存原始数据,DiskCacheStrategy.RESULT:缓存变换(如缩放、裁剪等)后的资源数据,DiskCacheStrategy.NONE:什么都不缓存
DiskCacheStrategy.ALL:缓存SOURC和RESULT。
默认采用DiskCacheStrategy.RESULT策略,对于download only操作要使用DiskCacheStrategy.SOURCE。

4.priority(Priority priority).
指定加载的优先级,优先级越高越优先加载,但不保证所有图片都按序加载。枚举Priority.IMMEDIATE,Priority.HIGH,Priority.NORMAL,Priority.LOW。
默认为Priority.NORMAL。

5.dontAnimate().
移除所有的动画。

6.animate(int animationId).
在异步加载资源完成时会执行该动画。
如:animate(android.R.anim.fade_out)
.animate( android.R.anim.slide_in_left ) // or R.anim.zoom_in

7.animate(ViewPropertyAnimation.Animator animator).
在异步加载资源完成时会执行该动画。

8.placeholder(int resourceId).
设置资源加载过程中的占位Drawable。

9.placeholder(Drawable drawable).
设置资源加载过程中的占位Drawable。

10.fallback(int resourceId).
设置model为空时要显示的Drawable。如果没设置fallback,model为空时将显示error的Drawable,如果error的Drawable也没设置,就显示placeholder的Drawable。

11.fallback(Drawable drawable).
设置model为空时显示的Drawable。

12.error(int resourceId).
设置load失败时显示的Drawable。

13.error(Drawable drawable).
设置load失败时显示的Drawable。

14.override(int width, int height).
重新设置Target的宽高值(单位为pixel)。

15.into(Y target).
设置资源将被加载到的Target。

16.into(ImageView view).
设置资源将被加载到的ImageView。取消该ImageView之前所有的加载并释放资源。

17.into(int width, int height).
后台线程加载时要加载资源的宽高值(单位为pixel)。

18.preload(int width, int height).
预加载resource到缓存中(单位为pixel)。

19.skipMemoryCache(boolean skip).
设置是否跳过内存缓存,但不保证一定不被缓存(比如请求已经在加载资源且没设置跳过内存缓存,这个资源就会被缓存在内存中)。

20.listener(RequestListener

使用技巧

1.清除内存缓存:

// 必须在UI线程中调用
Glide.get(context).clearMemory();

2.清除磁盘缓存:

   // 必须在后台线程中调用,建议同时clearMemory()
   Glide.get(applicationContext).clearDiskCache();
        new Thread(new Runnable() {
            @Override
            public void run() {
                Glide.get(context).clearDiskCache();
            }
        }).start();

3.禁止内存缓存:

.skipMemoryCache(true)

4.禁止磁盘缓存:

 .diskCacheStrategy(DiskCacheStrategy.NONE)

5.指定资源的优先加载顺序:

    //优先加载
    Glide
        .with(context)
        .load(heroImageUrl)
        .priority(Priority.HIGH)
        .into(imageViewHero);
    //后加载
    Glide
        .with(context)
        .load(itemImageUrl)
        .priority(Priority.LOW)
        .into(imageViewItem);

6.先显示缩略图,再显示原图:

    //用原图的1/10作为缩略图
    Glide
        .with(this)
        .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
        .thumbnail(0.1f)
        .into(iv_0);
    //用其它图片作为缩略图
    DrawableRequestBuilder<Integer> thumbnailRequest = Glide
        .with(this)
        .load(R.drawable.news);
    Glide.with(this)
        .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
        .thumbnail(thumbnailRequest)
        .into(iv_0);

7.对图片进行裁剪、模糊、滤镜等处理:
推荐使用独立的图片处理库:wasabeef/glide-transformations,使用也很简单:

  compile 'jp.wasabeef:glide-transformations:2.0.0'

之后我们就可以使用GenericRequestBuilder或其子类的transform()或bitmapTransform()方法设置图片转换了:

    //圆形裁剪
    Glide.with(this)
        .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
        .bitmapTransform(new CropCircleTransformation(this))
        .into(iv_0);
    //圆角处理
    Glide.with(this)
        .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
        .bitmapTransform(new RoundedCornersTransformation(this,30,0, RoundedCornersTransformation.CornerType.ALL))
        .into(iv_0);
    //灰度处理
    Glide.with(this)
        .load("http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png")
        .bitmapTransform(new GrayscaleTransformation(this))
        .into(iv_0);
    //其它变换...

8.加载 View Animation

Glide.with(MainActivity.this)
        .load(Images.urls[position])
        .error(R.mipmap.ic_launcher)
        .animate(R.anim.glide_slide_in_left_bounce
        .centerCrop()
        .into(holder.mImageView);

glide_slide_in_left_bounce.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000"
     android:interpolator="@android:anim/bounce_interpolator">
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"/>
    <translate android:fromXDelta="-100%p" android:toXDelta="0"/>
</set>

9.加载 Property Animation

ViewPropertyAnimation.Animator animatorSet = new ViewPropertyAnimation.Animator() {
    @Override
    public void animate(View view) {
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0f, 1f);
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 0f, 1f);
        ObjectAnimator rotation = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f);
        AnimatorSet set = new AnimatorSet();
        set.playTogether(scaleX,scaleY,rotation);
        set.setDuration(500);
        set.start();
    }
};

Glide.with(MainActivity.this)
        .load(Images.urls[position])
        .error(R.mipmap.ic_launcher)
        .animate(animatorSet)
        .centerCrop()
        .into(holder.mImageView);

参考资料

1.glide
https://github.com/bumptech/glide
2.Google推荐的图片加载库Glide介绍
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2650.html
3.Glide(图片异步加载缓存库)的方法介绍
http://blog.csdn.net/github_36796968/article/details/53303673
4.Glide使用详解(一)
http://blog.csdn.net/shangmingchao/article/details/51125554
5.(源码分析)Glide(图片异步加载缓存库)的方法介绍
http://blog.csdn.net/u011733020/article/details/52319283
6.Android Glide 优化用户体验
http://blog.csdn.net/zwlove5280/article/details/53321778

猜你喜欢

转载自blog.csdn.net/hfreeman2008/article/details/78964841