第三方库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, GlideAnimation super 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) {
}
});
类的继承关系图如下:
自定义动画
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/