当前位置: 首页 > 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.lryc.cn/news/608961.html

相关文章:

  • 禁闭求生2 免安 中文 离线运行版
  • 【数据结构与算法】数据结构初阶:排序内容加餐(二)——文件归并排序思路详解(附代码实现)
  • 【LeetCode 热题 100】84. 柱状图中最大的矩形——(解法一)单调栈+三次遍历
  • 二叉树的锯齿形层次遍历
  • 9.苹果ios逆向-FridaHook-ios中的算法(CCCrypt)
  • CCF-GESP 等级考试 2025年6月认证C++一级真题解析
  • wordpress登陆前登陆后显示不同的顶部菜单
  • 最简单的零基础软件测试学习路线
  • Libevent(5)之使用教程(4)工具
  • k8s黑马教程笔记
  • 快速搭建一个非生产k8s环境
  • 【运维基础】Linux 硬盘分区管理
  • k8s+isulad 国产化技术栈云原生技术栈搭建4-添加worker节点
  • Hyper-V + Centos stream 9 搭建K8s集群(二)
  • k8s+isulad 国产化技术栈云原生技术栈搭建3-master节点安装
  • [硬件电路-148]:数字电路 - 什么是CMOS电平、TTL电平?还有哪些其他电平标准?发展历史?
  • Go语言实战案例:TCP服务器与客户端通信
  • 案例介绍|JSON数据格式的转换|pyecharts模块简介
  • Kafka——怎么重设消费者组位移?
  • 构建企业级Web应用:AWS全栈架构深度解析
  • AtCoder Beginner Contest 417
  • [硬件电路-147]:模拟电路 - DC/DC电压的三种架构:升压(Boost)、降压(Buck)或升降压(Buck-Boost)
  • 跨语言模型中的翻译任务:XLM-RoBERTa在翻译任务中的应用
  • 界面规范4-按钮
  • IntelliJ IDEA开发编辑器摸鱼看股票数据
  • Parcel 使用详解:零配置的前端打包工具
  • 关于车位引导及汽车乘梯解决方案的专业性、系统性、可落地性强的综合设计方案与技术实现说明,旨在为现代智慧停车楼提供高效、安全、智能的停车体验。
  • electron-多线程
  • 嵌入式——数据结构:单向链表的函数创建
  • 常见的深度学习模块/操作中的维度约定(系统性总结)