Glide图片处理框架(含圆角哦)

Glide图片加载库的使用

(转自:Android开发中文站 » Glide图片加载库的使用)

Glide是 Google推荐的图片加载库,它可以支持来自url,Android资源,文件,Uri中的图片加载,同时还支持gif图片的加载,以及各种图片显示前的bitmap处理(例如:圆角图片,圆形图片,高斯模糊,旋转,灰度等等),缓存处理,请求优先级处理,动画处理,缩略图处理,图片大小自定义等等.可谓是非常的强大.

1.添加Glide库

需要在build.gradle中加入依赖,目前最新的版本是3.7.0,Glide库地址

 compile 'com.github.bumptech.glide:glide:3.7.0'

2.加载网络图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
  * Created by mChenys on 2016/6/6.
  */
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         String url =  "http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png" ;
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         Glide.with( this ).
                 load(url).
                 asBitmap().  //强制处理为bitmap
                 into(targetView); //显示到目标View中
     }
}

3.加载资源图片

1
2
3
4
5
6
7
8
9
10
11
12
13
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         int  resourceId = R.drawable.test;
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         Glide.with( this ).
                 load(resourceId).
                 asBitmap().
                 into(targetView);
     }
}

4.加载本地文件图片

1
2
3
4
5
6
7
8
9
10
11
12
13
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         File file =  new  File(Environment.getExternalStorageDirectory(),  "test.jpg" );
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         Glide.with( this ).
                 load(file).
                 asBitmap().
                 into(targetView);
     }
}

5.从Uri中加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
  * Created by mChenys on 2016/6/6.
  */
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         Uri uri = Uri.parse( "android.resource://"  this .getPackageName() +  "/"  + R.drawable.test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         Glide.with( this ).
                 load(uri).
                 asBitmap().
                 into(targetView);
     }
}

6.加载gif图片

1
2
3
4
5
6
7
8
9
10
11
12
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         Glide.with( this ).
                 load(R.drawable.smail).
                 asGif(). //注意:这里显示的指明了要加载的是gif图片,当然即使不指明,glide也会自己判断.
                 into(targetView);
     }
}

效果图:

Glide图片处理框架(含圆角哦)_第1张图片


7.设置默认图片和加载失败时显示的图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         Glide.with( this ).
                 load(R.drawable.test).
                 asBitmap().
                 placeholder(R.drawable.bg_loading). //加载中显示的图片
                 error(R.drawable.bg_error). //加载失败时显示的图片
                 into(targetView);
     }
}

8.淡入显示效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         Glide.with( this ).
                 load(R.drawable.test).
                 placeholder(R.drawable.bg_loading). //加载中显示的图片
                 error(R.drawable.bg_error). //加载失败时显示的图片
                 crossFade(). //淡入显示,注意:如果设置了这个,则必须要去掉asBitmap
                 into(targetView);
     }
}

另外,crossFade还可以接收一个参数来设置淡入显示效果的持续时间,crossFade(int duration);
如果你想直接显示图片,而不是淡入显示图片,则可以通过dontAnimate()方法设置.

9.调整图片像素大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         Glide.with( this ).
                 load(R.drawable.test).
                 placeholder(R.drawable.bg_loading). //加载中显示的图片
                 error(R.drawable.bg_error). //加载失败时显示的图片
                 crossFade( 1000 ). //淡入显示的时间,注意:如果设置了这个,则必须要去掉asBitmap
                 override( 80 , 80 ). //设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
                 into(targetView);
     }
}

10.设置CenterCrop,FitCenter

CenterCrop,FitCenter都是对目标图片进行裁剪,了解过ImageView的ScaleType属性就知道,这2种裁剪方式在ImageView上也是有的,分别对应ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
         Glide.with( this ).
                 load(R.drawable.test).
                 placeholder(R.drawable.bg_loading). //加载中显示的图片
                 error(R.drawable.bg_error). //加载失败时显示的图片
                 crossFade( 1000 ). //淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
                 override( 80 , 80 ). //设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
                 centerCrop(). //中心裁剪,缩放填充至整个ImageView
                 into(targetView);
     }
}

11.缓存策略设置

内存缓存设置,通过skipMemoryCache(boolean)来设置是否需要缓存到内存,默认是会缓存到内存的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
  * Created by mChenys on 2016/6/6.
  */
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
         Glide.with( this ).
                 load(R.drawable.test).
                 placeholder(R.drawable.bg_loading). //加载中显示的图片
                 error(R.drawable.bg_error). //加载失败时显示的图片
                 crossFade( 1000 ). //淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
                 override( 80 , 80 ). //设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
                 centerCrop(). //中心裁剪,缩放填充至整个ImageView
                 skipMemoryCache( true ). //跳过内存缓存
                 into(targetView);
     }
}

磁盘缓存,磁盘缓存通过diskCacheStrategy(DiskCacheStrategy)来设置,DiskCacheStrategy一共有4种模式:

  1. DiskCacheStrategy.NONE:什么都不缓存
  2. DiskCacheStrategy.SOURCE:仅缓存原图(全分辨率的图片)
  3. DiskCacheStrategy.RESULT:仅缓存最终的图片,即修改了尺寸或者转换后的图片
  4. DiskCacheStrategy.ALL:缓存所有版本的图片,默认模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
         Glide.with( this ).
                 load(R.drawable.test).
                 placeholder(R.drawable.bg_loading). //加载中显示的图片
                 error(R.drawable.bg_error). //加载失败时显示的图片
                 crossFade( 1000 ). //淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
                 override( 80 80 ). //设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
                 centerCrop(). //中心裁剪,缩放填充至整个ImageView
                 skipMemoryCache( true ). //跳过内存缓存
                 diskCacheStrategy(DiskCacheStrategy.RESULT). //保存最终图片
                 into(targetView);
     }
}

12.缓存设置

在GlideModule 中,我们可以设置磁盘缓存的位置,磁盘缓存的大小和内存缓存的大小,同时还可以设置图片的显示质量.

要是用GlideModule ,需要创建它的实现类,然后在manifests中申明实现类的全类路径:

1
2
3
< meta-data
           android:name = "com.example.mchenys.httputilsdemo.image.glide.module.SimpleGlideModule"
           android:value = "GlideModule"  />

GlideModule 的实现类,需要实现applyOptions方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
  * 所以你知道要创建一个额外的类去定制 Glide。
  * 下一步是要全局的去声明这个类,让 Glide 知道它应该在哪里被加载和使用。
  * Glide 会扫描 AndroidManifest.xml 为 Glide module 的 meta 声明。
  * 因此,你必须在 AndroidManifest.xml 的 <application> 标签内去声明这个SimpleGlideModule。
  * Created by mChenys on 2016/6/10.
  */
public  class  SimpleGlideModule  implements  GlideModule {
     public  static  DiskCache cache;
 
     @Override
     public  void  applyOptions(Context context, GlideBuilder builder) {
         // 在 Android 中有两个主要的方法对图片进行解码:ARGB8888 和 RGB565。前者为每个像素使用了 4 个字节,
         // 后者仅为每个像素使用了 2 个字节。ARGB8888 的优势是图像质量更高以及能存储一个 alpha 通道。
         // Picasso 使用 ARGB8888,Glide 默认使用低质量的 RGB565。
         // 对于 Glide 使用者来说:你使用 Glide module 方法去改变解码规则。
         builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
         //设置缓存目录
         File cacheDir = PathUtils.getDiskCacheDir(context, CacheConfig.IMG_DIR);
 
         cache = DiskLruCacheWrapper.get(cacheDir, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE); // 250 MB
         builder.setDiskCache( new  DiskCache.Factory() {
             @Override
             public  DiskCache build() {
                 return  cache;
             }
         });
         //设置memory和Bitmap池的大小
         MemorySizeCalculator calculator =  new  MemorySizeCalculator(context);
         int  defaultMemoryCacheSize = calculator.getMemoryCacheSize();
         int  defaultBitmapPoolSize = calculator.getBitmapPoolSize();
 
         int  customMemoryCacheSize = ( int ) ( 1.2  * defaultMemoryCacheSize);
         int  customBitmapPoolSize = ( int ) ( 1.2  * defaultBitmapPoolSize);
 
         builder.setMemoryCache( new  LruResourceCache(customMemoryCacheSize));
         builder.setBitmapPool( new  LruBitmapPool(customBitmapPoolSize));
     }
 
     @Override
     public  void  registerComponents(Context context, Glide glide) {
     }
}

13.设置图片请求的优先级

Glide 可以用 Priority 枚举来设置图片的加载优先级,这样我们就可以针对那些需要显示的图片设置高的优先级了.

Priority 有4种级别:

  • Priority.LOW
  • Priority.NORMAL
  • Priority.HIGH
  • Priority.IMMEDIATE

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
     * 高优先级加载
     * @param url
     * @param imageView
     * @param listener
     */
    public  static  void  loadImageWithHighPriority(Object url,ImageView imageView,  final  LoaderListener listener) {
        if  (url ==  null ) {
            if  (listener !=  null ) {
                listener.onError();
            }
        else  {
            Glide.with(imageView.getContext()).
                    load(url).
                    asBitmap().
                    priority(Priority.HIGH). //高优先级
                    dontAnimate().
                    listener( new  RequestListener<Object, Bitmap>() {
                        @Override
                        public  boolean  onException(Exception e, Object model, Target<Bitmap> target,  boolean isFirstResource) {
                            if  ( null  != listener) {
                                listener.onError();
                            }
                            return  false ;
                        }
 
                        @Override
                        public  boolean  onResourceReady(Bitmap resource, Object model, Target<Bitmap> target,  boolean  isFromMemoryCache,  boolean  isFirstResource) {
                            if  ( null  != listener) {
                                listener.onSuccess();
                            }
                            return  false ;
                        }
                    }).into(imageView);
        }
    }

14.设置加载缩略图

通过设置缩略图,我们可以在显示目标图片之前先展示一个第分辨率或者其他图片,当全分辨率的目标图片在后台加载完成后,
Glide会自动切换显示全像素的目标图片.

设置缩略图有2种方式:
通过thumbnail(float)指定0.0f~1.0f的原始图像大小,例如全像素的大小是500*500,如果设置为thumbnail为0.1f,即目标图片的10%,显示的缩略图大小就是50*50;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
 
         Glide.with( this ).
                 load(R.drawable.test).
                 placeholder(R.drawable.bg_loading). //加载中显示的图片
                 error(R.drawable.bg_error). //加载失败时显示的图片
                 crossFade( 1000 ). //淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
                 override( 80 80 ). //设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
                 centerCrop(). //中心裁剪,缩放填充至整个ImageView
                 skipMemoryCache( true ). //跳过内存缓存
                 diskCacheStrategy(DiskCacheStrategy.RESULT). //保存最终图片
                 thumbnail( 0 .1f). //10%的原图大小
                 into(targetView);
     }
}

通过thumbnail(DrawableRequestBuilder)方式来指定缩略图,该缩略图可以使用load的所有方式(网络,文件,uri,资源)加载.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public  class  TestGlideActivity  extends  Activity {
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_test);
         ImageView targetView = (ImageView) findViewById(R.id.iv_target);
         //缩略图请求
         DrawableRequestBuilder<String> thumbnailRequest = Glide
                 .with( this )
                 .load( "http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png" );
 
         Glide.with( this ).
                 load(R.drawable.test).
//                placeholder(R.drawable.bg_loading).//加载中显示的图片
//                error(R.drawable.bg_error).//加载失败时显示的图片
//                crossFade(1000).//淡入淡出,注意:如果设置了这个,则必须要去掉asBitmap
                 override( 80 80 ). //设置最终显示的图片像素为80*80,注意:这个是像素,而不是控件的宽高
                 centerCrop(). //中心裁剪,缩放填充至整个ImageView
                 skipMemoryCache( true ). //跳过内存缓存
                 diskCacheStrategy(DiskCacheStrategy.RESULT). //保存最终图片
                 thumbnail(thumbnailRequest). //设置缩略图
                 into(targetView);
     }

15,设置圆角


public class GlideCircleTransform extends BitmapTransformation {
    public GlideCircleTransform(Context context) {
        super(context);
    }

    @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        // TODO this could be acquired from the pool too
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        return result;
    }

    @Override public String getId() {
        return getClass().getName();
    }
}

自定义一个extend BitmapTransformation的方法,把获得的bitmap转化成圆形图片,下面是使用方法
private RequestManager glideRequest;
glideRequest = Glide.with(this);
glideRequest.load("https://www.baidu.com/img/bdlogo.png").transform(new GlideCircleTransform(context)).into(imageView);

这里不得不强调下Glide的一个强大的功能,当你在With后面的传Activity或者Fragment,Glide就可以根据当前Activity或者Fragment的生命周期维护图片的生命周期,比如但activity销毁的时候,就会自动取消需要加载的图片  
下载图片转换层圆角图片的方法
public class GlideRoundTransform extends BitmapTransformation {

    private static float radius = 0f;

    public GlideRoundTransform(Context context) {
        this(context, 4);
    }

    public GlideRoundTransform(Context context, int dp) {
        super(context);
        this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
    }

    @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return roundCrop(pool, toTransform);
    }

    private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
        canvas.drawRoundRect(rectF, radius, radius, paint);
        return result;
    }

    @Override public String getId() {
        return getClass().getName() + Math.round(radius);
    }
}

在这个方法里面,你可以自定义圆角的大小,使用方式也非常简单
glideRequest.load("https://www.baidu.com/img/bdlogo.png").transform(new GlideRoundTransform(context)).into(imageView);

glideRequest.load("https://www.baidu.com/img/bdlogo.png").transform(new GlideRoundTransform(context, 10)).into(imageView);


大神的博客可以看一下
http://blog.csdn.net/lvwenbo0107/article/details/50965161

你可能感兴趣的:(android图片处理)