Android Glide网络图片加载类库使用详解

注意:

①:Glide支持远程图片,本地图片文件,图片资源,多媒体数据库的uri
②:Glide本身就是单例,不需要再做单例的封装,不过可以封装Utils,将其链式编程封装起来,简化代码。
③:Glide支持三级缓存:网络缓存,本地缓存和内存缓存

1:在Module的build.gradle中添加依赖

allprojects {

repositories {

mavenCentral() // jcenter() works as well because it pulls from Maven Central

}

}

dependencies {

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

compile 'com.android.support:support-v4:19.1.0'(注意有V4的就不用添加了)

}


2:混淆

第一步是要讲build.Gradle中的 minifyEnabled 设置为true

然后在 当前module\proguard-rules.pro中添加

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

-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {

**[] $VALUES;

public *;

 }

-keepresourcexmlelements manifest/application/meta-data@value=GlideModule


3:Method

初始化Glide:然后通过链式编程调用其方法

with(Context context)//初始化Glide,参数可以是Context,Activity,FragmentActivity,Fragment


请求获取图片(通过源码其实就是 fromString().load(string),fromString返回一个String类型的构建器)

load(String string)//请求 文件路径/URL来获取图片

load(Uri uri)//请求URL来获取图片

load(byte[] model)//解析字节数组来获取图片

load(File file)//请求图片文件来获取图片(data/data/files/a.jpg)

load(Integer resourceId)//请求资源ID来获取图片(R.drawable.a)


作用于图片方法

thumbnail(float sizeMultiplier)//缩略图:让用户先看到一个低解析度的图,点开后,再加载一个高解析度的图。

priority(Priority priority)//图片加载的优先级Priority.IMMEDIATE,HIGH,NORMAL,LOW(对应 即时,高,正常,低)

transform(BitmapTransformation... transformations)//给加载的图片设计边框(下面有具体的实现)

centerCrop()//如果图片无法填充ImageView,那么就从中间向四周裁剪,图片将imageView填满

fitCenter()//完全显示图片(相当于居中)

crossFade()//淡入淡出的效果

crossFade(int duration)//淡入淡出效果的持续时长

crossFade(Animation animation, int duration)//可以传入一个自定义的补间动画

crossFade(int animationId, int duration)//同上(如果同时在xml中定义了duration,那么xml的优先级高)

dontAnimate()//取消动画

animate(ViewPropertyAnimation.Animator animator)//给图片使用属性动画

animate(int animationId)||(Animation animation)//给图片使用补间动画

加载状态显示的图片

placeholder(int resourceId)//正在加载显示的图片

fallback(Drawable drawable)//加载失败 返回null(如:load( null)加载空指针的时候)显示的图片

error(int resourceId)//加载失败(例如url地址不对)

listener(RequestListener requestListener)//添加监听器,监听图片加载成功或失败,并且可以拿到isFromMemoryCache和isFirstResource状态

缓存处理(Glide用了 内存缓存 和 外存缓存机制,所谓的三级缓存只不过是进行了三次判断,网络缓存其实就是请求,而请求不一定拿的到)

diskCacheStrategy(DiskCacheStrategy strategy)//设置是否使用外部缓存:对应值

DiskCacheStrategy.NONE什么都不缓存

DiskCacheStrategy.SOURCE只缓存最高解析图的image

DiskCacheStrategy.RESULT缓存最后一次那个image,比如有可能你对image做了转化

DiskCacheStrategy.ALLimage的所有版本都会缓存

skipMemoryCache(boolean skip)//设置是否使用内存缓存:对应值 true false


override(int width, int height)//根据宽高(单位:像素)裁剪图片,如果裁剪后发现图片大小没变或者很模糊,是因为ImageViwe中设置了固定宽高

clone()//克隆复制

into(ImageView view)//直接将图片设置给ImageView


//强转 和 释放缓存

asGif()//强转为gif(需要在load()之后调用,因为属于DrawableTypeRequest)

asBitmap()//强转为bitmap

pauseRequests()//取消加载 调用方式:Glide.with(context).pauseRequests();

resumeRequests()//恢复加载 调用方式:Glide.with(context).resumeRequests();

clearDiskCache()//清除磁盘缓存:必须开子线程 Glide.get(context).clearDiskCache();

clearMemory()//释放内存缓存:Glide.get(context).clearMemory();


4:工具类封装:

上面提供的方法基本上大家可以自己进行封装了,本省Glide的调用就比较简单,也可以对以下进行参考:

①:https://github.com/RangerAnan/GlideUtil/blob/master/app/src/main/java/com/ananfcl/glideutil/glide/GlideUtils.java

②:https://github.com/tpnet/GlideUtils/blob/master/GlideUtils.java


5:自定义的遮罩(给加载的图片设置边框,其实就是在图上绘制一层遮罩)

transform(new GlideRoundTransform(context,30))//设置圆角的边框 第二个参数是圆角的角度

transform(new GlideCircleTransform(context))//圆形的边框

	
	//圆形遮罩
	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 Bitmap circleCrop(BitmapPool pool, Bitmap toTransform) {
	            if (toTransform == null) return null;
	            //以最短的边为基准,找到正方形的坐标
	            int size = Math.min(toTransform.getWidth(), toTransform.getHeight());
	            int x = (toTransform.getWidth() - size) / 2;
	            int y = (toTransform.getHeight() - size) / 2;
	
	            // TODO 这也可以从池中获得
	            //根据参数创建新位图
	            Bitmap squared = Bitmap.createBitmap(toTransform, 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);
	
	            /** 在圆形遮罩上绘制一个 红色的圆环(也可以是任意形状比如心形)
	            RectF f = new RectF(x,y,size,size);
	            Paint p = new Paint();
	            p.setColor(Color.RED);
	            p.setAntiAlias(true);
	            p.setStrokeWidth(4);
	            p.setStyle(Paint.Style.STROKE);
	            canvas.drawArc(f,0f,360f,false,p);
	             */
	            return result;
	        }
	
	        @Override
	        public String getId() {
	            return getClass().getName();
	        }
	    }
		
	//圆角
	static 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);
	        }
	    }
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值