在当前的Android开发中,我们除去较早前使用的
ImageLoader
之外,可能用的较多的就是Picasso
、Glide
或是类似fackbook的图片加载工具,我们使用这些框架的主要原因还是使用便捷,深深的被那种一行代码的就实现图片加载的功能所吸引…
建议直接跳到 Glide - 项目实战 !基本可满足业务需求了 ~
此篇包含了Picasso、Glide这俩种框架的简单使用与自封工具,需要使用的话,直接copy出Util就可以使用了,主讲Glide、辅讲Picasso ~
俩者区别
-
Glide比Picasso加载速度快,但Glide比Picasso需要更大的空间来缓存;
-
Glide加载图像及磁盘缓存的方式都优于Picasso,且Glide更有利于减少OutOfMemoryError的发生;
-
Glide可以加载Gif动图,Picasso不可以加载动图
-
Picasso加载的图片比Glide加载的图片平滑(可忽略不计)
Picasso
基础配置
简单讲一下使用方式,未深入~
AndroidManifest(添加权限)
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
添加依赖
compile 'com.squareup.picasso:picasso:2.5.2'
加载方式
//context:上下文 loadurl:需要加载的图片地址 imageView:图片的承载控件
Picasso.with(context).load(loadUrl).into(imageView);
使用场景
MainActivity
package com.example.picassodemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
public class MainActivity extends AppCompatActivity {
private TextView mTv;
private ImageView mIv;
private TextView mTv2;
private ImageView mIV2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
}
private void initView() {
mTv = (TextView) findViewById(R.id.tv_btn1);
mIv = (ImageView) findViewById(R.id.iv_one);
mTv2 = (TextView) findViewById(R.id.tv_btn2);
mIV2 = (ImageView) findViewById(R.id.iv_two);
}
private void initEvent() {
final String url="http://cdn.duitang.com/uploads/item/201604/27/20160427004300_QfKwt.jpeg";
mTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Picasso.with(getApplicationContext()).load(url).into(mIv);
}
});
mTv2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PicassoUtil.picassoPrimary(getApplication(),url,mIV2);
}
});
}
}
activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context="com.example.picassodemo.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp"
android:id="@+id/tv_btn1"
android:text="加载" />
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/iv_one"
android:layout_weight="1"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="5dp"
android:id="@+id/tv_btn2"
android:text="加载" />
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/iv_two"
android:layout_weight="1"
/>
</LinearLayout>
自封工具
自封的Util,可直接拿到项目中使用(PicassoUtil)
PicassoUtil
package com.example.picassodemo;
import android.content.Context;
import android.widget.ImageView;
import com.squareup.picasso.Picasso;
import java.io.File;
public class PicassoUtil {
//基础使用 - 网络加载
public static void picassoPrimary(Context context, String loadUrl, ImageView imageView) {
Picasso.with(context).load(loadUrl).into(imageView);
}
//显错使用 - 网络加载
public static void picassoIntermediate(Context context, String loadUrl, int errorImageView, ImageView imageView) {
Picasso.with(context).load(loadUrl).error(errorImageView).into(imageView);
}
//占位使用 - 网络加载 - 推荐
public static void picassoAdvanced(Context context, String loadUrl, int placeImageView, int errorImageView, ImageView imageView) {
Picasso.with(context).load(loadUrl).placeholder(placeImageView).error(errorImageView).into(imageView);
}
//限制使用(可设置图片大小,圆角) - 网络加载
public static void picassoClip(Context context, String loadUrl, int width, int height, ImageView imageView) {
Picasso.with(context).load(loadUrl).resize(width, height).centerCrop().into(imageView);
}
//资源加载
public static void picassoResource(Context context, int resource, ImageView imageView) {
Picasso.with(context).load(resource).into(imageView);
}
//本地加载
public static void picassoFile(Context context, String file, ImageView imageView) {
Picasso.with(context).load(new File(file)).into(imageView);
}
//Adapter取消已经在视野之外的ImageView- 此封装可能有误,建议不要使用此方法
public static void picassoCancel(Context context, String url,ImageView imageView){
/**
* 在Adapter的getView中执行String url = getItem(position)
* 之后获取url输入到第二个参数就可以
* */
Picasso.with(context).load(url).into(imageView);
}
}
Glide
基础配置
AndroidManifest清单文件 - 添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
build.gradle添加依赖(如不使用butterknife,可不添加):
compile 'com.jakewharton:butterknife:6.1.0'
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:24.0.0'
加载方式
//context:上下文 loadurl:需要加载的图片地址 imageView:图片的承载控件
Glide.with(context).load(loadUrl).into(imageView);
常用API - 使用方式:RequestOptions options = new RequestOptions() .对应API
功能 | API |
---|---|
加载中占位图 | .placeholder |
加载失败占位图 | .error |
制定图片大小 | .override(wigth, height) |
默认为false,及自动缓存,如设置为true则是不缓存 | .skipMemoryCache(true) |
硬盘缓存 | .diskCacheStrategy() |
静态图(可不指定,框架自动区分) | .asBitmap() |
gif图(可不指定,框架自动区分) | .asGif() |
.diskCacheStrategy() 硬盘缓存有以下几个参数
- DiskCacheStrategy.NONE: 表示不缓存任何内容
- DiskCacheStrategy.DATA: 表示只缓存原始图片
- DiskCacheStrategy.RESOURCE: 表示只缓存转换过后的图片
- DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片
- DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种缓存策略(默认选项)
Glide加载图片可以进行一些变换的操作;比如圆角,模糊等…
添加图片变换的用法非常简单,我们只需要在RequestOptions中串接transforms()方法,并将想要执行的图片变换操作作为参数传入transforms()方法即可
RequestOptions options = new RequestOptions()
.transforms(...);
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
基本使用
- MainActivity
package com.example.glide;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity {
@InjectView(R.id.iv)
ImageView mIv;
@InjectView(R.id.tv)
TextView mTv;
@InjectView(R.id.tv_2)
TextView mTv2;
@InjectView(R.id.iv_2)
ImageView mIv2;
String url_one = "http://inthecheesefactory.com/uploads/source/nestedfragment/fragments.png";
String url_two = "http://hsp-static-file.oss-cn-shanghai.aliyuncs.com/app/icon/thirdparty/guessing_competition.png";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
}
@OnClick({R.id.tv, R.id.tv_2})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.tv:
Glide.with(getApplicationContext()).load(url_one).into(mIv);
Toast.makeText(getApplication(), "普通触发", Toast.LENGTH_LONG).show();
break;
case R.id.tv_2:
GlideUtil.glideAdvanced(getApplicationContext(), url_two, R.drawable.camera_icon , R.drawable.close_icon, mIv2);
Toast.makeText(getApplication(), "工具触发", Toast.LENGTH_LONG).show();
break;
}
}
}
- activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.glide.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv"
android:padding="5dp"
android:gravity="center"
android:text="Glide" />
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/iv"
android:layout_weight="1"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_2"
android:padding="5dp"
android:gravity="center"
android:text="GlideUtil" />
<ImageView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/iv_2"
android:layout_weight="1"
/>
</LinearLayout>
自封工具
GlideUtil (初级版 - 2017年使用)
package com.example.glide;
import android.content.Context;
import android.net.Uri;
import android.widget.ImageView;
import com.bumptech.glide.DrawableTypeRequest;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import java.io.File;
public class GlideUtil {
/*适合自己的才是最好的*/
//基础使用 - 网络加载 - 推荐
public static void glidePrimary(Context context,String loadUrl, ImageView imageView){
Glide.with(context).load(loadUrl).into(imageView);
}
//显错使用 - 网络加载 - 推荐
public static void glideIntermediate(Context context, String loadUrl, int errorImageView, ImageView imageView) {
Glide.with(context).load(loadUrl).error(errorImageView).into(imageView);
}
//占位使用 - 加载中显示的占位图 - 推荐
public static void glide(Context context, String loadUrl, int placeImageView, ImageView imageView) {
Glide.with(context).load(loadUrl).placeholder(placeImageView).into(imageView);
}
//占位使用 - 加载中显示的占位图 - 加载失败显示的占位图 网络加载 - 推荐
public static void glideAdvanced(Context context, String loadUrl, int placeImageView, int errorImageView, ImageView imageView) {
Glide.with(context).load(loadUrl).placeholder(placeImageView).error(errorImageView).into(imageView);
}
//限制使用(如图片本身较小,依旧会吧ImageView的width,height拉伸) - 网络加载
public static void glideCrop(Context context, String loadUrl, ImageView imageView) {
Glide.with(context).load(loadUrl).centerCrop().into(imageView);
}
//限制使用(图片缩放,ImageView显示小于等于ImageView大小,但是不会填充满当前的ImageView) - 网络加载
public static void glideFit(Context context, String loadUrl, ImageView imageView) {
Glide.with(context).load(loadUrl).fitCenter().into(imageView);
}
//限制使用(glideCrop-glideFit)俩者测试-以后者的方法为主要显示处理 - 网络加载
public static void glideCrop_Fit(Context context, String loadUrl, ImageView imageView) {
Glide.with(context).load(loadUrl).fitCenter().centerCrop().into(imageView);
}
//资源加载
public static void glideResource(Context context, int resource, ImageView imageView) {
Glide.with(context).load(resource).into(imageView);
}
//本地加载 - 可显示图片
public static void glideFile(Context context, String file, ImageView imageView) {
Glide.with(context).load(new File(file)).into(imageView);
}
//本地加载 - 可显示视频
public static void glideVideo(Context context, String path, ImageView imageView) {
Glide.with(context).load(Uri.fromFile(new File(path))).into(imageView);
}
//显示Gif动画
public static void glideIsGif(Context context,String loadUrl,ImageView imageView){
Glide.with(context).load(loadUrl).asGif().into(imageView);
}
//跳过内存缓存
public static void glideSkipCache(Context context,String loadUrl,ImageView imageView){
Glide.with(context).load(loadUrl).skipMemoryCache(true).into(imageView);
}
//跳过磁盘缓存
public static void glideDiskCache(Context context,String loadUrl,ImageView imageView){
Glide.with(context).load(loadUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView);
}
/**
DiskCacheStrategy.NONE 什么都不缓存
DiskCacheStrategy.SOURCE 仅仅只缓存原来的全分辨率的图像
DiskCacheStrategy.RESULT 仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
DiskCacheStrategy.ALL 缓存所有版本的图像(默认行为)
* */
//跳过缓存
public static void glideDiskCachex(Context context,String loadUrl,ImageView imageView){
Glide.with(context).load(loadUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView);
Glide.with(context).load(loadUrl).skipMemoryCache(true).into(imageView);
}
//清除内存缓存
public static void glideClear(Context context){
Glide.get(context).clearMemory();
}
//优先加载
public static void glidePriority_high(Context context,String loadUrl,ImageView imageView){
Glide.with(context).load(loadUrl).priority(Priority.priority.HIGH).into(imageView);
}
//优后加载
public static void glidePriority_low(Context context,String loadUrl,ImageView imageView){
Glide.with(context).load(loadUrl).priority(Priority.priority.LOW).into(imageView);
}
//用原图的比例作为缩略图 - 如无法使用请在比例之后后缀 - f
public static void glideBreviary(Context context,String loadUrl,float ratio,ImageView imageView){
Glide.with(context).load(loadUrl).thumbnail(ratio).into(imageView);
}
//用其他图片做位缩略图
public static void glideBreviary_others(Context context,int resource,String loadUrl,float ratio,ImageView imageView) {
DrawableTypeRequest<Integer> covering = Glide.with(context).load(resource);
Glide.with(context).load(loadUrl).thumbnail(covering).into(imageView);
}
/**
* 图形处理需要导入相关依赖:
* compile 'jp.wasabeef:glide-transformations:2.0.0'
* 库:
* wasabeef/glide-transformations
* 建议:
* 涉及的圆形头像,可以在into的imageview处使用CircleImageVIew
*
* 因当前项目并没有导入这个依赖,所以只是进行了封装,如需使用这项功能,自行导入依赖,解开注释即可
* */
//图形裁剪
public static void glidePicture_Tailor(Context context,String loadUrl,ImageView imageView){
// Glide.with(context).load(loadUrl) .bitmapTransform(new CropCircleTransformation(context)).into(imageView);
}
//圆角处理
public static void glidePicture_Circular(Context context,String loadUrl,int width,int height,ImageView imageView){
// Glide.with(context).load(loadUrl).bitmapTransform(new RoundedCornersTransformation(context,width,height,RoundedCornersTransformation.CornerType.ALL)).into(imageView);
}
//灰度处理
public static void glidePicture_Color(Context context,String loadUrl,ImageView imageView){
// Glide.with(context).load(loadUrl).bitmapTransform(new GrayscaleTransformation(context));
}
}
GlideUtil (中级版 - 2018年使用)
package com.bakheet.garage.utils;
import android.content.Context;
import android.os.Environment;
import android.view.View;
import android.widget.ImageView;
import com.bakheet.garage.R;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.bitmap.CircleCrop;
import com.bumptech.glide.request.RequestOptions;
import java.io.File;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
/**
* Created 2017/11/09.
* @describe: 图片加载工具类
*/
public class GlideUtil {
/**
* 加载网络图片
* @param imageUrl 网络图片路径
* @param imageView 被设置的imageview
*/
public static void showImage(Context context, String imageUrl, ImageView imageView) {
if (context != null) {
RequestOptions options = new RequestOptions().centerCrop().placeholder(R.mipmap.placeholder_brand).error(R.mipmap.placeholder_brand).diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(context).load(imageUrl).apply(options).into(imageView);
}
}
/**
* 加载正常图片,需自定义占位图
* @param imageUrl 网络图片路径
* @param imageView 被设置的imageview
* @param placeholderResId 占位图资源id
*/
public static void showImage(Context context, String imageUrl, ImageView imageView, int placeholderResId) {
if (context != null) {
RequestOptions options = new RequestOptions().centerCrop().placeholder(placeholderResId).error(placeholderResId).diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(context).load(imageUrl).apply(options).into(imageView);
}
}
public static void showImage(Context context, String imageUrl, View imageView, int placeholderResId) {
if (context != null) {
RequestOptions options = new RequestOptions().placeholder(placeholderResId).error(placeholderResId).diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(context).load(imageUrl).apply(options).into((ImageView) imageView);
}
}
public static void showImage(Context context, int imageUrl, View imageView, int placeholderResId) {
if (context != null) {
RequestOptions options = new RequestOptions().placeholder(placeholderResId).error(placeholderResId).diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(context).load(imageUrl).apply(options).into((ImageView) imageView);
}
}
/**
* 自定义图片缩放方式
*/
public static void showImage(Context context, String imageUrl, View imageView, int placeholderResId, int radius, RoundedCornersTransformation.CornerType cornerType) {
if (context != null) {
RequestOptions options = RequestOptions.bitmapTransform(new RoundedCornersTransformation(radius, 0, cornerType))
.placeholder(placeholderResId).error(placeholderResId);
Glide.with(context).load(imageUrl).apply(options).into((ImageView) imageView);
}
}
/**
* 加载毛玻璃、高斯模糊效果 图片
*/
/* public static void showBlur(Context context, String imageUrl, ImageView imageView, int placeholderResId) {
Glide.with(context).load(imageUrl).bitmapTransform(new BlurTransformation(context, 25)).crossFade().placeholder(placeholderResId).centerCrop().into(imageView);
}*/
/**
* 加载圆图 +毛玻璃图片
*/
public static void showCircle(Context context, String imageUrl, ImageView imageView, int placeholderResId) {
if (context != null) {
Glide.with(context).load(imageUrl).apply(RequestOptions.bitmapTransform(new CircleCrop()).placeholder(placeholderResId)).into(imageView);
}
}
/**
* 加载毛玻璃、高斯模糊效果 图片
*/
/* public static void showRound(Context context, String imageUrl, ImageView imageView, int placeholderResId) {
Glide.with(context).load(imageUrl).bitmapTransform(new RoundedCornersTransformation(context, 30, 0, RoundedCornersTransformation.CornerType.ALL)).crossFade().placeholder(placeholderResId).centerCrop().into(imageView);
}*/
/**
* 加载网络图片
* @param imageUrl 网络图片路径
* @param imageView 被设置的imageview
*/
public static void showImage(Context context, int imageUrl, ImageView imageView) {
if (context != null) {
RequestOptions options = new RequestOptions().centerCrop().placeholder(R.mipmap.placeholder_brand).error(R.mipmap.placeholder_brand).diskCacheStrategy(DiskCacheStrategy.NONE);
Glide.with(context).load(imageUrl).apply(options).into(imageView);
}
}
/**
* Glide加载本地图片
*/
public static void showFileImage(Context context, String filePath, ImageView imageView) {
if (context != null) {
//本地文件
File file = new File(Environment.getExternalStorageDirectory(), filePath);
//加载图片
Glide.with(context).load(file).into(imageView);
}
}
/**
* Glide图片下载
*/
public static File downImageFile(Context context, String imageUrl) {
File file = null;
try {
file = Glide.with(context)
.load(imageUrl)
.downloadOnly(1280, 720)
.get();
} catch (Exception e) {
e.printStackTrace();
}
return file;
}
}
Glide - 项目实战
今年再用这个工具的时候,在加载网络图片到本地的时候遇到了一些缓存问题,故此记录一波 ~
对了,为了方便体验效果, 此demo已经上传,如需体验记得要修改内部的图片路径地址 ~
基础配置
AndroidManifest清单文件 - 添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
build.gradle(app)添加依赖
//这里用的是Android Studio3.0
implementation 'com.github.bumptech.glide:glide:4.3.1'
annotationProcessor('com.github.bumptech.glide:compiler:4.3.1')
implementation 'com.github.bumptech.glide:okhttp3-integration:4.3.1'
implementation 'androidx.appcompat:appcompat:1.0.2'
CustomGlideModule配置类 - 主要设置图片缓存的大小和存储地址
package nk.com.newglidetool;
import android.content.Context;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.LruResourceCache;
import com.bumptech.glide.module.AppGlideModule;
/**
* @author MrLiu
* @date 2020/8/26
* desc Glide基础配置
*/
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 设置缓存大小为20mb
int memoryCacheSizeBytes = 1024 * 1024 * 30; // 30mb
// 设置内存缓存大小
builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
// 根据SD卡是否可用选择是在内部缓存还是SD卡缓存
if (isSDCardEnable()) {
builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context, "HYManagerImages", memoryCacheSizeBytes));
} else {
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "HYManagerImages", memoryCacheSizeBytes));
}
}
// 针对V4用户可以提升速度
@Override
public boolean isManifestParsingEnabled() {
return false;
}
/**
* 查看是否存在SD卡
*/
private boolean isSDCardEnable() {
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
return true;
} else
return false;
}
}
工具封装
GlideUtils - 加载时候区分是否缓存当前图片!这里要注意GlideApp报红,找不到包时编译一下项目即可,也就是AndroidStudio给一锤子就行
package nk.com.newglidetool;
import android.content.Context;
import android.widget.ImageView;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
/**
* @author MrLiu
* @date 2020/8/26
* desc
*/
public class GlideUtils {
/**
* 磁盘缓存
*/
public static void initImageWithFileCache(Context context, String url, ImageView imageView) {
GlideApp.with(context)
.load(url)
.placeholder(R.mipmap.ic_launcher)
.transition(DrawableTransitionOptions.withCrossFade(100))//淡入淡出100m
.diskCacheStrategy(DiskCacheStrategy.ALL)
.dontAnimate()
.centerCrop()
.into(imageView);
}
/**
* Glide跳过内存缓存
*/
public static void initImageNoCache(Context context, String url, ImageView imageView) {
GlideApp.with(context)
.load(url)
.placeholder(R.mipmap.ic_launcher)
.skipMemoryCache(true)
.dontAnimate()
.centerCrop()
.into(imageView);
}
/**
* 内存缓存清理(主线程)
*/
public static void clearMemoryCache(Context context) {
GlideApp.get(context).clearMemory();
}
/**
* 磁盘缓存清理(子线程)
*/
public static void clearFileCache(final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
GlideApp.get(context).clearDiskCache();
}
}).start();
}
}
使用方式
MainActivity
package nk.com.newglidetool;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//承载控件
img = findViewById(R.id.iv_img);
//图片加载且缓存(如不需要缓存使用另一种方法即可)
GlideUtils.initImageWithFileCache(MainActivity.this,"这里填入需要加载的网络图片地址即可",img);
}
@Override
protected void onDestroy() {
super.onDestroy();
//根据业务场景记得清理缓存,一般在MainActivity的onDestroy中进行缓存释放
GlideUtils.clearFileCache(this);
GlideUtils.clearMemoryCache(this);
}
}
Glide优化点
首次加载慢
如图,设置dontAnimate(),从而去除动画效果
加载图片不全
可逐个尝试,如前几步已满足需求,则无需继续往下观赏 ~
首先查看Glide加载种是否有设置中心裁剪属性 - centerCrop() ,如有则删除;如没有则加入fitCenter(),具体如下
如上方设置后依旧未解决问题,那么我们需要看一下承载视图的ImageView下ScaleType的设置 ~
提示:layout_width、layout_height自行根据需求进行设置
- 尝试未设置ScaleType的效果
<ImageView
android:id="@+id/iv_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
- 尝试设置ScaleType="fitXY"的效果
<ImageView
android:id="@+id/iv_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
/>