Android 之 图片加载(Fresco/Picasso/Glide)

Fresco​

一、依赖引入(Gradle)

app/build.gradle 中添加:

Groovy 复制代码
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.工具类封装(线程安全 + 功能聚合)

java 复制代码
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. ​​初始化(全局一次)​

java 复制代码
public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        FrescoUtils.init(this); 
    }
}

3. ​​XML布局

XML 复制代码
<com.facebook.drawee.view.SimpleDraweeView
    android: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. ​​代码调用​

java 复制代码
public class MainActivity extends AppCompatActivity {
    @Override
    protected 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     // 启用渐进式加载
        );

        // 加载GIF
        FrescoUtils.loadGif(
            "https://example.com/anim.gif",
            findViewById(R.id.iv_gif)
        );
    }
}

Picasso

一、依赖引入(Gradle)

app/build.gradle 中添加:

Groovy 复制代码
dependencies {
   implementation 'com.squareup.picasso:picasso:2.71828'  
}

​ 二、基本使用

1.工具类封装(线程安全 + 功能聚合)

java 复制代码
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 中使用​

java 复制代码
// 基础加载
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 适配器中使用

java 复制代码
@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 中添加:

Groovy 复制代码
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.工具类封装(线程安全 + 功能聚合)

java 复制代码
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中使用​

java 复制代码
// 基础加载
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适配器中使用​

java 复制代码
@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();
}
相关推荐
Yang-Never1 小时前
Kotlin -> 普通Lambda vs 挂起Lambda
android·开发语言·kotlin·android studio
来来走走1 小时前
Flutter开发 MaterrialApp基本属性介绍
android·flutter
2501_915921432 小时前
移动端 WebView 视频无法播放怎么办 媒体控件错误排查与修复指南
android·ios·小程序·https·uni-app·iphone·webview
安卓开发者7 小时前
Android JUnit 测试框架详解:从基础到高级实践
android·junit·sqlserver
hcgeng7 小时前
如何在Android中创建自定义键盘布局
android·keyboard
Jomurphys7 小时前
Android 优化 - 日志 Log
android
狂浪天涯8 小时前
Android 16 显示系统 | 从View 到屏幕系列 - 7 | SurfaceFling Commit
android
_祝你今天愉快8 小时前
HashMap 底层原理 (JDK 1.8 源码分析)
android·java·后端
尘云逸9 小时前
将开发的软件安装到手机:环境配置、android studio设置、命令行操作
android·react native·adb·智能手机·gradle·android studio·android-studio