Android 之 图片加载(Fresco/Picasso/Glide)
Fresco
一、依赖引入(Gradle)
在 app/build.gradle
中添加:
dependencies {// 核心库(必选)implementation 'com.facebook.fresco:fresco:3.1.3' // 2025年最新稳定版[3,5](@ref)// 扩展功能(按需添加)implementation 'com.facebook.fresco:animated-gif:3.1.3' // GIF动图支持[3](@ref)implementation 'com.facebook.fresco:webpsupport:3.1.3' // WebP静态图支持[3](@ref)implementation 'com.facebook.fresco:animated-webp:3.1.3' // WebP动图支持[3](@ref)
}
二、基本使用
1.工具类封装(线程安全 + 功能聚合)
import android.net.Uri;
import android.content.Context;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.common.ResizeOptions;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;/*** Fresco图片加载工具类* 功能:初始化、图片加载、圆角/渐进式/GIF控制*/
public class FrescoUtils {// 初始化(Application中调用一次)public static void init(Context context) {Fresco.initialize(context);[2,3](@ref)}// 基础加载(网络/本地图片)public static void loadImage(String url, SimpleDraweeView view) {view.setImageURI(Uri.parse(url));[2,5](@ref)}// 高级加载(支持圆角、渐进式、缩略图)public static void loadImageWithOptions(String url, SimpleDraweeView view, float cornerRadius, boolean isProgressive) {ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)).setProgressiveRenderingEnabled(isProgressive) // 渐进式加载[2](@ref).setResizeOptions(new ResizeOptions(300, 300)) // 压缩尺寸(优化内存)[6](@ref).build();DraweeController controller = Fresco.newDraweeControllerBuilder().setImageRequest(request).setOldController(view.getController()).build();// 动态设置圆角if (cornerRadius > 0) {view.getHierarchy().setRoundingParams(RoundingParams.fromCornersRadius(cornerRadius));[5,6](@ref)}view.setController(controller);}// 加载GIF动图(自动播放)public static void loadGif(String url, SimpleDraweeView view) {DraweeController controller = Fresco.newDraweeControllerBuilder().setUri(Uri.parse(url)).setAutoPlayAnimations(true) // 自动播放[2](@ref).build();view.setController(controller);[3](@ref)}
}
2. 初始化(全局一次)
public class MyApp extends Application {@Overridepublic void onCreate() {super.onCreate();FrescoUtils.init(this); }
}
3. XML布局
<com.facebook.drawee.view.SimpleDraweeViewandroid:id="@+id/iv_avatar"android:layout_width="120dp"android:layout_height="120dp"fresco:placeholderImage="@drawable/ic_placeholder" <!-- 占位图 -->fresco:failureImage="@drawable/ic_error" /> <!-- 失败图[5](@ref) -->
4. 代码调用
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);SimpleDraweeView ivAvatar = findViewById(R.id.iv_avatar);SimpleDraweeView ivBanner = findViewById(R.id.iv_banner);// 基础加载(网络图片)FrescoUtils.loadImage("https://example.com/avatar.jpg", ivAvatar);// 高级加载(圆角+渐进式)FrescoUtils.loadImageWithOptions("https://example.com/banner.jpg",ivBanner,20f, // 圆角半径(单位dp)true // 启用渐进式加载);// 加载GIFFrescoUtils.loadGif("https://example.com/anim.gif",findViewById(R.id.iv_gif));}
}
Picasso
一、依赖引入(Gradle)
在 app/build.gradle
中添加:
dependencies {implementation 'com.squareup.picasso:picasso:2.71828'
}
二、基本使用
1.工具类封装(线程安全 + 功能聚合)
import android.widget.ImageView;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Transformation;/*** Picasso图片加载工具类* 功能:统一配置占位图/错误图/尺寸裁剪/图片变换*/
public class PicassoUtils {// 基础加载(网络/本地资源)public static void loadImage(String url, ImageView imageView) {Picasso.get().load(url).into(imageView);}// 高级加载(占位图+错误图+尺寸调整)public static void loadImageWithPlaceholder(String url, ImageView imageView, int placeholderRes, int errorRes,int width, int height) {Picasso.get().load(url).placeholder(placeholderRes) // 加载中占位图[1,6](@ref).error(errorRes) // 加载失败图.resize(width, height) // 尺寸调整[7](@ref).centerCrop() // 居中裁剪.into(imageView);}// 自定义图片变换(如圆角、灰度化)public static void loadWithTransformation(String url, ImageView imageView, Transformation transformation) {Picasso.get().load(url).transform(transformation) // 自定义变换[7](@ref).into(imageView);}// 取消图片加载请求(防止内存泄漏)public static void cancelRequest(ImageView imageView) {Picasso.get().cancelRequest(imageView); [1](@ref)}
}
2. Activity/Fragment 中使用
// 基础加载
PicassoUtils.loadImage("https://example.com/image.jpg", findViewById(R.id.iv_avatar)
);// 高级加载(占位图+错误图+尺寸裁剪)
PicassoUtils.loadImageWithPlaceholder("https://example.com/banner.jpg",findViewById(R.id.iv_banner),R.drawable.placeholder, // 占位图资源R.drawable.error, // 错误图资源300, // 目标宽度(像素)300 // 目标高度(像素)
);// 自定义圆角变换
Transformation transformation = new RoundedCornersTransformation(20, 0); // 圆角半径20px
PicassoUtils.loadWithTransformation("https://example.com/icon.png",findViewById(R.id.iv_icon),transformation
);// 在onDestroy中取消请求
@Override
protected void onDestroy() {PicassoUtils.cancelRequest(findViewById(R.id.iv_avatar)); [1](@ref)super.onDestroy();
}
3. RecyclerView 适配器中使用
@Override
public void onBindViewHolder(ViewHolder holder, int position) {String imageUrl = dataList.get(position).getImageUrl();if (imageUrl == null || imageUrl.isEmpty()) {// 无URL时加载默认图PicassoUtils.loadImageWithPlaceholder(null, holder.imageView, R.drawable.default_img, R.drawable.error_img,100, 100);} else {// 正常加载网络图PicassoUtils.loadImage(imageUrl, holder.imageView); [4](@ref)}
}
Glide
一、依赖引入(Gradle)
在 app/build.gradle
中添加:
dependencies {// 核心库(需与AndroidX兼容)implementation 'com.github.bumptech.glide:glide:4.16.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0' // 注解处理器// 可选扩展(按需添加)implementation 'com.github.bumptech.glide:okhttp3-integration:4.16.0' // 使用OkHttp网络层implementation 'jp.wasabeef:glide-transformations:4.3.0' // 图片变换(模糊/圆角等)
}
二、基本使用
1.工具类封装(线程安全 + 功能聚合)
import android.content.Context;
import android.widget.ImageView;
import androidx.annotation.DrawableRes;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import jp.wasabeef.glide.transformations.BlurTransformation;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;/*** Glide图片加载工具类(线程安全)*/
public class GlideUtils {// 基础加载(网络/本地资源)public static void loadImage(Context context, String url, ImageView imageView) {Glide.with(context).load(url).into(imageView);}// 带占位图+错误图+缓存策略public static void loadImageWithPlaceholder(Context context, String url, ImageView imageView,@DrawableRes int placeholder, @DrawableRes int errorRes) {RequestOptions options = new RequestOptions().placeholder(placeholder).error(errorRes).diskCacheStrategy(DiskCacheStrategy.ALL); // 缓存所有版本Glide.with(context).load(url).apply(options).into(imageView);}// 指定尺寸 + 圆角处理public static void loadImageWithSizeAndCorner(Context context, String url, ImageView imageView,int width, int height, int cornerRadius) {RequestOptions options = new RequestOptions().override(width, height).transform(new RoundedCornersTransformation(cornerRadius, 0));Glide.with(context).load(url).apply(options).into(imageView);}// 高斯模糊效果(用于背景图)public static void loadBlurImage(Context context, String url, ImageView imageView, int blurRadius) {Glide.with(context).load(url).apply(RequestOptions.bitmapTransform(new BlurTransformation(blurRadius))).into(imageView);}// 加载GIF(自动播放)public static void loadGif(Context context, String url, ImageView imageView) {Glide.with(context).asGif().load(url).into(imageView);}// 清理缓存(内存+磁盘)public static void clearCache(Context context) {Glide.get(context).clearMemory(); // 主线程执行new Thread(() -> Glide.get(context).clearDiskCache()).start(); // 子线程执行}
}
2. Activity/Fragment中使用
// 基础加载
GlideUtils.loadImage(context, "https://example.com/image.jpg", findViewById(R.id.iv_avatar)
);// 带占位图+错误图
GlideUtils.loadImageWithPlaceholder(context,"https://example.com/banner.jpg",findViewById(R.id.iv_banner),R.drawable.placeholder, // 加载中显示R.drawable.error // 加载失败显示
);// 指定尺寸+圆角
GlideUtils.loadImageWithSizeAndCorner(context,"https://example.com/icon.png",findViewById(R.id.iv_icon),200, // 宽度(px)200, // 高度(px)20 // 圆角半径(px)
);// 高斯模糊背景
GlideUtils.loadBlurImage(context,"https://example.com/bg.jpg",findViewById(R.id.iv_background),25 // 模糊半径
);
3. RecyclerView适配器中使用
@Override
public void onBindViewHolder(ViewHolder holder, int position) {String imageUrl = dataList.get(position).getImageUrl();GlideUtils.loadImageWithPlaceholder(holder.itemView.getContext(),imageUrl,holder.imageView,R.drawable.default_item,R.drawable.error_item);
}@Override
public void onViewRecycled(ViewHolder holder) {// 防止图片错位Glide.with(holder.imageView).clear();
}