236 lines
6.6 KiB
Kotlin
236 lines
6.6 KiB
Kotlin
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<Bitmap> {
|
|
|
|
override fun onLoadFailed(
|
|
e: GlideException?,
|
|
model: Any?,
|
|
target: Target<Bitmap?>,
|
|
isFirstResource: Boolean
|
|
): Boolean {
|
|
callback(null)
|
|
return false
|
|
}
|
|
|
|
override fun onResourceReady(
|
|
resource: Bitmap,
|
|
model: Any,
|
|
target: Target<Bitmap?>?,
|
|
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<File> {
|
|
override fun onLoadFailed(
|
|
e: GlideException?,
|
|
model: Any?,
|
|
target: Target<File?>,
|
|
isFirstResource: Boolean
|
|
): Boolean {
|
|
callback(null)
|
|
return false
|
|
}
|
|
|
|
override fun onResourceReady(
|
|
resource: File,
|
|
model: Any,
|
|
target: Target<File?>?,
|
|
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 <T> applyPlaceholder(
|
|
requestBuilder: RequestBuilder<T>,
|
|
@DrawableRes placeholderResId: Int,
|
|
@DrawableRes errorResId: Int
|
|
): RequestBuilder<T> {
|
|
return requestBuilder.apply {
|
|
if (placeholderResId != 0) {
|
|
placeholder(placeholderResId)
|
|
}
|
|
if (errorResId != 0) {
|
|
error(errorResId)
|
|
}
|
|
}
|
|
}
|
|
} |