添加了副屏显示逻辑控制
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
package com.sw.dualscreen.utils
|
||||
|
||||
class Debouncer(private val delayMillis: Long) {
|
||||
private var lastActionTime = 0L
|
||||
|
||||
/**
|
||||
* 执行防抖操作
|
||||
* @param action 要执行的操作
|
||||
* @return Boolean 是否执行了操作 (true=已执行, false=被防抖)
|
||||
*/
|
||||
fun debounce(action: () -> Unit): Boolean {
|
||||
val currentTime = System.currentTimeMillis()
|
||||
if (currentTime - lastActionTime >= delayMillis) {
|
||||
lastActionTime = currentTime
|
||||
action()
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 重置防抖计时
|
||||
fun reset() {
|
||||
lastActionTime = 0L
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,236 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user