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

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.dtcms.com/a/312983.html

相关文章:

  • 第四章:OSPF 协议
  • Docker环境离线安卓安装指南
  • Android 之 存储(Assets目录,SharedPreferences,数据库,内部存储等)
  • 音视频学习(五十):音频无损压缩
  • 使用 Docker 部署 Golang 程序
  • 计数组合学7.12( RSK算法的一些推论)
  • 考研复习-计算机组成原理-第二章-数据的表示和运算
  • PHP面向对象编程与数据库操作完全指南-下
  • 深入解析C++函数重载:从原理到实践
  • 2025年测绘程序设计比赛--基于统计滤波的点云去噪(已获国特)
  • MySQL梳理三:查询与优化
  • python新功能match case|:=|typing
  • Hertzbeat如何配置redis?保存在redis的数据是可读数据
  • 【MySQL安全】什么是SQL注入,怎么避免这种攻击:前端防护、后端orm框架、数据库白名单
  • Android设备认证体系深度解析:GMS/CTS/GTS/VTS/STS核心差异与认证逻辑
  • ELECTRICAL靶机复现练习笔记
  • Leetcode:1.两数之和
  • Java 大视界 -- Java 大数据机器学习模型在金融市场情绪分析与投资决策辅助中的应用(379)
  • ubuntu24.04安装selenium、edge、msedgedriver
  • 05.Redis 图形工具RDM
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第四天(DOM编程和AJAX异步交互)
  • k8s+isulad 国产化技术栈云原生技术栈搭建1-VPC
  • 使用ACK Serverless容器化部署大语言模型FastChat
  • 如何在不停机的情况下,将MySQL单库的数据迁移到分库分表的架构上?
  • 【前端安全】聊聊 HTML 闭合优先级和浏览器解析顺序
  • [AI8051U入门第十五步]W5500实现DHCP自动获取IP
  • SpringBoot+Vue高校实验室预约管理系统 附带详细运行指导视频
  • Matlab算法编程示例4:数值解法求解常微分方程的代码实例
  • Python类与对象指南
  • java贪吃蛇小程序