当前位置: 首页 > web >正文

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();
}

http://www.xdnf.cn/news/17043.html

相关文章:

  • [硬件电路-140]:模拟电路 - 信号处理电路 - 锁定放大器概述、工作原理、常见芯片、管脚定义
  • 多模态大模型综述:BLIP-2详解(第二篇)
  • GraphRAG:基于知识图谱的检索增强生成技术解析
  • 【QT】常⽤控件详解(二)windowOpacitycursorfontsetToolTipfocusPolicystyleSheet
  • 设计模式学习[17]---组合模式
  • 使用 Docker 部署 Golang 程序
  • HoloLens+vuforia打包后遇到的问题
  • Android 之 MVP架构
  • SQL154 插入记录(一)
  • VUE工程化
  • 机器学习sklearn:支持向量机svm
  • 【Redis学习路|第一篇】初步认识Redis
  • WebRTC前处理模块技术详解:音频3A处理与视频优化实践
  • 企业自动化交互体系的技术架构与实现:从智能回复到自动评论—仙盟创梦IDE
  • 怎么修改论文格式呢?提供一份论文格式模板
  • 力扣 hot100 Day64
  • C++ 入门基础(3)
  • MySQL半同步复制机制详解:AFTER_SYNC vs AFTER_COMMIT 的优劣与选择
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 76-1(题目+回答)
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 77-1(题目+回答)
  • SEA-RAFT:更简单、更高效、更准确的RAFT架构
  • vulnhub-ELECTRICAL靶场攻略
  • SpringBoot 服务器配置
  • 技术面试知识点详解 - 从电路到编程的全栈面经
  • Python 程序设计讲义(54):Python 的函数——函数概述
  • LVGL代码框架简介
  • 【最新区块链论文录用资讯】CCF A--WWW 2025 23篇
  • 防火墙相关技术内容
  • Tlias案例-登录 退出 打包部署
  • Orange的运维学习日记--25.Linux文件系统基本管理