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();
}
相关推荐
安东尼肉店6 小时前
Android compose屏幕适配终极解决方案
android
2501_916007476 小时前
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包)
android·ios·小程序·https·uni-app·iphone·webview
feiyangqingyun7 小时前
基于Qt和FFmpeg的安卓监控模拟器/手机摄像头模拟成onvif和28181设备
android·qt·ffmpeg
用户20187928316711 小时前
ANR之RenderThread不可中断睡眠state=D
android
煤球王子11 小时前
简单学:Android14中的Bluetooth—PBAP下载
android
小趴菜822711 小时前
安卓接入Max广告源
android
齊家治國平天下11 小时前
Android 14 系统 ANR (Application Not Responding) 深度分析与解决指南
android·anr
ZHANG13HAO11 小时前
Android 13.0 Framework 实现应用通知使用权默认开启的技术指南
android
【ql君】qlexcel12 小时前
Android 安卓RIL介绍
android·安卓·ril
写点啥呢12 小时前
android12解决非CarProperty接口深色模式设置后开机无法保持
android·车机·aosp·深色模式·座舱