package com.sw.dualscreen.utils import android.content.Context import android.graphics.Bitmap import android.widget.ImageView import androidx.annotation.DrawableRes import com.bumptech.glide.Glide import com.bumptech.glide.RequestBuilder import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.load.resource.bitmap.CircleCrop import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.Target import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.File /** * Glide图片加载工具类 */ object GlideUtils { // 默认配置 private val defaultOptions = RequestOptions() .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) .skipMemoryCache(false) /** * 普通加载图片 * @param context 上下文 * @param url 图片地址 * @param imageView 目标ImageView * @param placeholderResId 占位图资源ID * @param errorResId 错误图资源ID */ fun loadImage( context: Context, url: Any?, imageView: ImageView, @DrawableRes placeholderResId: Int = 0, @DrawableRes errorResId: Int = 0 ) { val requestBuilder = Glide.with(context) .load(url) .apply(defaultOptions) applyPlaceholder(requestBuilder, placeholderResId, errorResId) .transition(DrawableTransitionOptions.withCrossFade()) .into(imageView) } /** * 加载圆形图片 * @param context 上下文 * @param url 图片地址 * @param imageView 目标ImageView * @param placeholderResId 占位图资源ID * @param errorResId 错误图资源ID */ fun loadCircleImage( context: Context, url: Any?, imageView: ImageView, @DrawableRes placeholderResId: Int = 0, @DrawableRes errorResId: Int = 0 ) { val requestBuilder = Glide.with(context) .load(url) .apply(defaultOptions) .transform(CircleCrop()) applyPlaceholder(requestBuilder, placeholderResId, errorResId) .into(imageView) } /** * 加载圆角图片 * @param context 上下文 * @param url 图片地址 * @param imageView 目标ImageView * @param radius 圆角半径(px) * @param placeholderResId 占位图资源ID * @param errorResId 错误图资源ID */ fun loadRoundCornerImage( context: Context, url: Any?, imageView: ImageView, radius: Int, @DrawableRes placeholderResId: Int = 0, @DrawableRes errorResId: Int = 0 ) { val requestBuilder = Glide.with(context) .load(url) .apply(defaultOptions) .transform(RoundedCorners(radius)) applyPlaceholder(requestBuilder, placeholderResId, errorResId) .into(imageView) } /** * 加载图片并获取Bitmap * @param context 上下文 * @param url 图片地址 * @param callback 加载回调 */ fun loadImageAsBitmap( context: Context, url: Any?, callback: (Bitmap?) -> Unit ) { Glide.with(context) .asBitmap() .load(url) .apply(defaultOptions) .addListener(object : RequestListener { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target, isFirstResource: Boolean ): Boolean { callback(null) return false } override fun onResourceReady( resource: Bitmap, model: Any, target: Target?, dataSource: DataSource, isFirstResource: Boolean ): Boolean { callback(resource) return false } }) .submit() } /** * 清除内存缓存 * @param context 上下文 */ fun clearMemoryCache(context: Context) { Glide.get(context).clearMemory() } /** * 清除磁盘缓存 * @param context 上下文 */ fun clearDiskCache(context: Context) { CoroutineScope(Dispatchers.IO).launch { Glide.get(context).clearDiskCache() } } /** * 获取缓存文件 * @param context 上下文 * @param url 图片地址 * @param callback 回调 */ fun getImageCacheFile( context: Context, url: String, callback: (File?) -> Unit ) { Glide.with(context) .downloadOnly() .load(url) .addListener(object : RequestListener { override fun onLoadFailed( e: GlideException?, model: Any?, target: Target, isFirstResource: Boolean ): Boolean { callback(null) return false } override fun onResourceReady( resource: File, model: Any, target: Target?, dataSource: DataSource, isFirstResource: Boolean ): Boolean { callback(resource) return false } }) .submit() } /** * 暂停请求 * @param context 上下文 */ fun pauseRequests(context: Context) { Glide.with(context).pauseRequests() } /** * 恢复请求 * @param context 上下文 */ fun resumeRequests(context: Context) { Glide.with(context).resumeRequests() } // 私有方法:应用占位图和错误图 private fun applyPlaceholder( requestBuilder: RequestBuilder, @DrawableRes placeholderResId: Int, @DrawableRes errorResId: Int ): RequestBuilder { return requestBuilder.apply { if (placeholderResId != 0) { placeholder(placeholderResId) } if (errorResId != 0) { error(errorResId) } } } }