| @@ -0,0 +1,20 @@ | |||
| package com.xkl.cdl.module | |||
| import android.app.Application | |||
| /** | |||
| * author suliang | |||
| * create 2022/3/14 11:27 | |||
| * Describe: | |||
| */ | |||
| class XKLApplication : Application() { | |||
| override fun onCreate() { | |||
| super.onCreate() | |||
| // ImageLoader.mStrategy = GlideLoaderStrategy() | |||
| } | |||
| } | |||
| @@ -4,12 +4,12 @@ import android.annotation.SuppressLint | |||
| import android.os.Bundle | |||
| import android.os.Looper | |||
| import android.view.View | |||
| import com.bumptech.glide.load.resource.bitmap.CircleCrop | |||
| import com.suliang.common.base.activity.BaseActivity | |||
| import com.suliang.common.util.LogUtil | |||
| import com.suliang.common.util.image.ImageLoader | |||
| import com.suliang.common.util.image.ImageLoaderOption | |||
| import com.suliang.common.util.media.* | |||
| import com.suliang.common.util.media.MPManager.addPlayListener | |||
| import com.suliang.common.util.thread.AppExecutors | |||
| import com.xkl.cdl.R | |||
| import com.xkl.cdl.databinding.ActivitySplashBinding | |||
| @@ -30,7 +30,12 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() { | |||
| override fun loadData() { | |||
| ImageLoader.loadImage(R.mipmap.ic_launcher) | |||
| ImageLoader.loadImage(ImageLoaderOption().apply { | |||
| targetView = binding.img | |||
| resourceId = R.drawable.illustration_splash | |||
| centerInsideEnable = true | |||
| circleEnable = true | |||
| }) | |||
| } | |||
| val util:IMP = MPManager.apply { | |||
| @@ -35,7 +35,7 @@ ext { | |||
| appcompat_version: "1.4.1", | |||
| material_version : "1.3.0", | |||
| lifecycle_version: "2.5.0-alpha02", | |||
| glide_version : "4.1.0", | |||
| glide_version : "4.11.0", | |||
| ] | |||
| //必须依赖 | |||
| dependencies_required = [ | |||
| @@ -72,6 +72,8 @@ ext { | |||
| //Glide 依赖和配置 | |||
| Glide : "com.github.bumptech.glide:glide:${versions.glide_version}", | |||
| GlideCompiler : "com.github.bumptech.glide:compiler:${versions.glide_version}", | |||
| //Glide translation | |||
| GlideTranslation: "jp.wasabeef:glide-transformations:4.3.0" | |||
| ] | |||
| @@ -46,11 +46,17 @@ dependencies { | |||
| rootProject.ext.dependencies_required.each{ k,v -> implementation v} | |||
| testImplementation rootProject.ext.dependencies_testImplementation.junit | |||
| rootProject.ext.dependencies_androidTestImplementation.each{ k,v -> androidTestImplementation v} | |||
| def customDependencies = rootProject.ext.dependencies_custom | |||
| //状态栏 | |||
| api rootProject.ext.dependencies_custom.UltimateBarX | |||
| api customDependencies.UltimateBarX | |||
| //glide | |||
| api rootProject.ext.dependencies_custom.Glide | |||
| kapt rootProject.ext.dependencies_custom.GlideCompiler | |||
| api customDependencies.Glide | |||
| kapt customDependencies.GlideCompiler | |||
| //glide translation | |||
| api customDependencies.GlideTranslation | |||
| } | |||
| @@ -18,4 +18,12 @@ | |||
| # If you keep the line number information, uncomment this to | |||
| # hide the original source file name. | |||
| #-renamesourcefileattribute SourceFile | |||
| #-renamesourcefileattribute SourceFile | |||
| -keep public class * implements com.bumptech.glide.module.GlideModule | |||
| -keep public class * extends com.bumptech.glide.module.AppGlideModule | |||
| -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { | |||
| **[] $VALUES; | |||
| public *; | |||
| } | |||
| @@ -1,7 +1,17 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | |||
| xmlns:tools="http://schemas.android.com/tools" | |||
| package="com.suliang.common"> | |||
| <!--网络权限--> | |||
| <uses-permission android:name="android.permission.INTERNET"/> | |||
| <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> | |||
| <!--本地外置存储权限--> | |||
| <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> | |||
| <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" | |||
| tools:ignore="ScopedStorage" /> | |||
| <!--networkSecurityConfig,usesCleartextTraffic 二选一都可以9.0-P以上高版本的http连接,否则连接失败 | |||
| android:networkSecurityConfig="@xml/network_security_config" | |||
| android:usesCleartextTraffic="true" | |||
| @@ -1,30 +0,0 @@ | |||
| package com.suliang.common.util.image | |||
| import java.lang.Exception | |||
| /** | |||
| * author suliang | |||
| * create 2022/3/11 16:14 | |||
| * Describe: Glide 加载的具体实现 | |||
| * https://juejin.cn/post/6844903463134953479#heading-3 | |||
| */ | |||
| internal class GlideLoader: ILoaderStrategy { | |||
| override fun loadImage(option: LoaderOptions) { | |||
| when{ | |||
| option.targetView == null -> throw Exception("Glide Option targetView is not empty") | |||
| } | |||
| } | |||
| override fun clearMemoryCache() { | |||
| } | |||
| override fun clearDiskCache() { | |||
| } | |||
| } | |||
| @@ -0,0 +1,182 @@ | |||
| package com.suliang.common.util.image | |||
| import android.graphics.Bitmap | |||
| import android.graphics.drawable.Drawable | |||
| import com.bumptech.glide.Glide | |||
| import com.bumptech.glide.RequestBuilder | |||
| import com.bumptech.glide.load.MultiTransformation | |||
| import com.bumptech.glide.load.Transformation | |||
| import com.bumptech.glide.load.resource.bitmap.* | |||
| import com.bumptech.glide.load.resource.gif.GifDrawable | |||
| import com.suliang.common.util.AppGlobals | |||
| import jp.wasabeef.glide.transformations.BlurTransformation | |||
| import java.io.File | |||
| import kotlin.concurrent.thread | |||
| /** | |||
| * author suliang | |||
| * create 2022/3/11 16:14 | |||
| * Describe: Glide 加载的具体实现 | |||
| * https://juejin.cn/post/6844903463134953479#heading-3 | |||
| */ | |||
| class GlideLoaderStrategy : IBaseLoaderStrategy { | |||
| override fun clearMemoryCache() { | |||
| Glide.get(AppGlobals.application).clearMemory() | |||
| } | |||
| override fun clearDiskCache() { | |||
| thread { | |||
| Glide.get(AppGlobals.application).clearDiskCache() | |||
| } | |||
| } | |||
| override fun loadImage(option: ImageLoaderOption) { | |||
| //如果上下文和图片目标有一个不存在,则报异常 | |||
| if (option.context == null && option.targetView == null) { | |||
| throw Exception("the Glide Option context or targetView is not empty") | |||
| } | |||
| if (option.context == null) { | |||
| option.context = option.targetView!!.context | |||
| } | |||
| option.context?.let { | |||
| load(option) | |||
| } | |||
| } | |||
| private fun initNormalDrawableGlideRequest(option: ImageLoaderOption): RequestBuilder<Drawable> { | |||
| return GlideApp.with(option.context!!).asDrawable().load(source(option)).placeholder(option.placeholderResId) | |||
| .error(option.errorResId).fallback(option.fallback) | |||
| } | |||
| private fun initNormalFileGlideRequest(option: ImageLoaderOption): RequestBuilder<File> { | |||
| return GlideApp.with(option.context!!).asFile().load(source(option)).placeholder(option.placeholderResId) | |||
| .error(option.errorResId).fallback(option.fallback) | |||
| } | |||
| private fun initNormalBitmapGlideRequest(option: ImageLoaderOption): RequestBuilder<Bitmap> { | |||
| return GlideApp.with(option.context!!).asBitmap().load(source(option)).placeholder(option.placeholderResId) | |||
| .error(option.errorResId).fallback(option.fallback) | |||
| } | |||
| private fun initNormalGifGlideRequest(option: ImageLoaderOption): RequestBuilder<GifDrawable> { | |||
| return GlideApp.with(option.context!!).asGif().load(source(option)).placeholder(option.placeholderResId) | |||
| .error(option.errorResId).fallback(option.fallback) | |||
| } | |||
| /** 普通加载 */ | |||
| private fun load(option: ImageLoaderOption) { | |||
| when { | |||
| option.asBitmap -> { | |||
| initNormalBitmapGlideRequest(option).transform(initTranslation(option)).into(option.targetView!!) | |||
| } | |||
| option.asGif -> { | |||
| initNormalGifGlideRequest(option).transform(initTranslation(option)).into(option.targetView!!) | |||
| } | |||
| option.asFile -> { | |||
| initNormalFileGlideRequest(option).transform(initTranslation(option)).into(option.targetView!!) | |||
| } | |||
| else -> { | |||
| initNormalDrawableGlideRequest(option).transform(initTranslation(option)).into(option.targetView!!) | |||
| } | |||
| } | |||
| } | |||
| private fun initTranslation(option: ImageLoaderOption): MultiTransformation<Bitmap> { | |||
| val list: MutableList<Transformation<Bitmap>> = ArrayList() | |||
| list.add(BlurTransformation(25, 3)) | |||
| //gravity 模式 | |||
| if (option.centerInsideEnable) { | |||
| list.add(CenterInside()) | |||
| } else if (option.fitCenterEnable) { | |||
| list.add(FitCenter()) | |||
| } else { | |||
| list.add(CenterCrop()) | |||
| } | |||
| //圆形 | |||
| if (option.circleEnable) { | |||
| list.add(CircleCrop()) | |||
| } | |||
| //圆角 | |||
| if (option.rounderCorners != 0) { | |||
| list.add(RoundedCorners(option.rounderCorners)) | |||
| } | |||
| //模糊 | |||
| if (option.blurEanble) { | |||
| list.add(BlurTransformation(25, 3)) | |||
| } | |||
| return MultiTransformation(list) | |||
| } | |||
| /** 最终加载资源*/ | |||
| private fun source(option: ImageLoaderOption) = | |||
| option.bitmap ?: option.drawable ?: option.uri ?: option.url ?: option.file ?: option.byteArray | |||
| ?: option.resourceId | |||
| // /** 加载圆角图片 */ | |||
| // private fun loadRounderCorner(option: ImageLoaderOption) { | |||
| // when { | |||
| // option.asBitmap -> { | |||
| // initNormalBitmapGlideRequest(option).transform(RoundedCorners(option.rounderCorners)) | |||
| // .into(option.targetView!!) | |||
| // } | |||
| // option.asGif -> { | |||
| // initNormalGifGlideRequest(option).transform(RoundedCorners(option.rounderCorners)) | |||
| // .into(option.targetView!!) | |||
| // } | |||
| // option.asFile -> { | |||
| // initNormalFileGlideRequest(option).transform(RoundedCorners(option.rounderCorners)) | |||
| // .into(option.targetView!!) | |||
| // } | |||
| // else -> { | |||
| // initNormalDrawableGlideRequest(option).transform(RoundedCorners(option.rounderCorners)) | |||
| // .into(option.targetView!!) | |||
| // } | |||
| // } | |||
| //// GlideApp.with(option.context).load(source(option)).transform(RoundedCorners(option.rounderCorners)) | |||
| //// .into(option.targetView!!) | |||
| // } | |||
| // | |||
| // /** 加载圆形图片 */ | |||
| // private fun loadCircle(option: ImageLoaderOption) { | |||
| // when { | |||
| // option.asBitmap -> { | |||
| // initNormalBitmapGlideRequest(option).transform(CircleCrop()).into(option.targetView!!) | |||
| // } | |||
| // option.asGif -> { | |||
| // initNormalGifGlideRequest(option).transform(CircleCrop()).into(option.targetView!!) | |||
| // } | |||
| // option.asFile -> { | |||
| // initNormalFileGlideRequest(option).transform(CircleCrop()).into(option.targetView!!) | |||
| // } | |||
| // else -> { | |||
| // initNormalDrawableGlideRequest(option).transform(CircleCrop()).into(option.targetView!!) | |||
| // } | |||
| // } | |||
| // GlideApp.with(option.context).load(source(option)).transform(CircleCrop()).into(option.targetView!!) | |||
| // } | |||
| // | |||
| // /** 高斯模糊 */ | |||
| // private fun loadBlur(option: ImageLoaderOption) { | |||
| // val list: MutableList<Transformation<Bitmap>> = ArrayList() | |||
| // list.add(BlurTransformation(25, 3)) | |||
| // | |||
| // when { | |||
| // option.centerInsideEnable -> list.add(CenterInside()) | |||
| // option.fitCenterEnable -> list.add(FitCenter()) | |||
| // option.circleEnable -> list.add(CircleCrop()) //圆形 | |||
| // } | |||
| // | |||
| // list.add(CenterCrop()) | |||
| // | |||
| // | |||
| // val multiTransformation = MultiTransformation(list) | |||
| // GlideApp.with(option.context).load(source(option)).transform(multiTransformation).into(option.targetView!!) | |||
| // } | |||
| } | |||
| @@ -1,17 +1,13 @@ | |||
| package com.suliang.common.util.image | |||
| import android.net.Uri | |||
| import android.widget.ImageView | |||
| import java.io.File | |||
| /** | |||
| * author suliang | |||
| * create 2022/3/11 15:45 | |||
| * Describe: 策略接口 | |||
| */ | |||
| interface ILoaderStrategy { | |||
| interface IBaseLoaderStrategy { | |||
| fun loadImage(option : LoaderOptions) | |||
| fun loadImage(option : ImageLoaderOption) | |||
| /** | |||
| * 清理内存缓存 | |||
| @@ -1,11 +1,8 @@ | |||
| package com.suliang.common.util.image | |||
| import android.content.Context | |||
| import android.net.Uri | |||
| import android.widget.ImageView | |||
| import androidx.annotation.DrawableRes | |||
| import java.io.File | |||
| import java.net.URL | |||
| /** | |||
| * author suliang | |||
| @@ -21,43 +18,54 @@ import java.net.URL | |||
| * https://juejin.cn/post/6844903463134953479#heading-3 | |||
| * https://www.jianshu.com/p/19420b151507 | |||
| * https://blog.csdn.net/EthanCo/article/details/102587193 | |||
| * https://www.jianshu.com/p/e26130a93289 | |||
| */ | |||
| object ImageLoader : ILoaderStrategy { | |||
| object ImageLoader { | |||
| //具体实现的策略,外部可设置 | |||
| private var mStrategy: ILoaderStrategy = GlideLoader() | |||
| var mStrategy: IBaseLoaderStrategy? = GlideLoaderStrategy() | |||
| public fun setMStrategy(strategy: ILoaderStrategy) { | |||
| this.mStrategy = mStrategy | |||
| fun loadImage(option: ImageLoaderOption) { | |||
| mStrategy?.loadImage(option) | |||
| } | |||
| fun loadImage(imageView: ImageView, url: String) { | |||
| loadImage(LoaderOptions(url).apply { targetView = imageView }) | |||
| loadImage(ImageLoaderOption().apply { | |||
| this.url = url | |||
| targetView = imageView | |||
| }) | |||
| } | |||
| fun loadImage(imageView: ImageView, file: File) { | |||
| loadImage( LoaderOptions(file = file).apply { targetView = imageView }) | |||
| loadImage(ImageLoaderOption().apply { | |||
| this.file = file | |||
| targetView = imageView | |||
| }) | |||
| } | |||
| fun loadImage(imageView: ImageView, drawableRes: Int) { | |||
| loadImage(LoaderOptions(drawableResId = drawableRes).apply { targetView = imageView }) | |||
| fun loadImage(imageView: ImageView, resourceId: Int) { | |||
| loadImage(ImageLoaderOption().apply { | |||
| this.resourceId = resourceId | |||
| targetView = imageView | |||
| }) | |||
| } | |||
| fun loadImage(imageView: ImageView, uri: Uri) { | |||
| loadImage(LoaderOptions(uri = uri).apply { targetView = imageView }) | |||
| loadImage(ImageLoaderOption().apply { | |||
| this.uri = uri | |||
| targetView = imageView | |||
| }) | |||
| } | |||
| override fun loadImage(option: LoaderOptions) { | |||
| mStrategy.loadImage(option) | |||
| } | |||
| // override fun clearMemoryCache() { | |||
| // mStrategyBase.clearMemoryCache() | |||
| // } | |||
| // | |||
| // override fun clearDiskCache() { | |||
| // mStrategyBase.clearDiskCache() | |||
| // } | |||
| override fun clearMemoryCache() { | |||
| mStrategy.clearMemoryCache() | |||
| } | |||
| override fun clearDiskCache() { | |||
| mStrategy.clearDiskCache() | |||
| } | |||
| } | |||
| @@ -0,0 +1,94 @@ | |||
| package com.suliang.common.util.image | |||
| import android.content.Context | |||
| import android.graphics.Bitmap | |||
| import android.graphics.drawable.Drawable | |||
| import android.net.Uri | |||
| import android.widget.ImageView | |||
| import androidx.annotation.DrawableRes | |||
| import com.bumptech.glide.Glide | |||
| import com.bumptech.glide.request.target.Target | |||
| import com.suliang.common.R | |||
| import java.io.File | |||
| import java.net.URL | |||
| /** | |||
| * author suliang | |||
| * create 2022/3/14 10:27 | |||
| * Describe: 图片加载配置,所有配置信息都放入这里面 | |||
| */ | |||
| class ImageLoaderOption { | |||
| //占位符 | |||
| //选项: RequestBuilder、 RequestOption、 | |||
| //变换: 改变加载的图片 Transformations 可以获取资源并修改它,然后返回被修改后的资源。通常变换操作是用来完成剪裁或对位图应用过滤器,但它也可以用于转换GIF动画,甚至自定义的资源类型。 | |||
| // fitCenter() centerCrop() CircleCrop() transform(.....) | |||
| //目标: Target 是介于请求和请求者之间的中介者的角色。Target 负责展示占位符,加载资源,并为每个请求决定合适的尺寸 | |||
| //过渡 | |||
| //配置 | |||
| //缓存 | |||
| //资源重用 | |||
| /** 上下文 */ | |||
| var context : Context? = null | |||
| /** 目标view */ | |||
| var targetView: ImageView? = null | |||
| /** 占位符是当请求正在执行时被展示的 Drawable 。*/ | |||
| var placeholderResId: Int = 0 | |||
| /** 错误符: 在请求永久性失败时展示。error Drawable 同样也在请求的url/model为 null ,且并没有设置 fallback Drawable 时展示*/ | |||
| var errorResId: Int = 0 | |||
| /** 后备回调符 : 在请求的url/model为 null 时展示 主要目的是允许用户指示 null 是否为可接受的正常情况*/ | |||
| var fallback : Int = 0 | |||
| //资源必须设置一样 | |||
| var bitmap : Bitmap? = null | |||
| var drawable : Drawable ? = null | |||
| var url: String ? = null | |||
| var uri : Uri ? = null | |||
| var file : File ? = null | |||
| var resourceId : Int = 0 | |||
| var byteArray : ByteArray ? = null | |||
| // var asDrawable : Boolean = true //默认 | |||
| var asBitmap : Boolean = false | |||
| var asGif : Boolean = false | |||
| var asFile: Boolean = false | |||
| /**是否居中裁剪: 默认*/ | |||
| // var centerCropEnable: Boolean = false | |||
| /** 居中全显 */ | |||
| var centerInsideEnable: Boolean = false | |||
| var fitCenterEnable: Boolean = false | |||
| //圆角px值 | |||
| var rounderCorners : Int = 0 | |||
| //是否模糊 | |||
| var blurEanble : Boolean = false | |||
| //是否圆形图片 | |||
| var circleEnable : Boolean = false | |||
| //fitCenter | |||
| //RequestOption | |||
| //target | |||
| //后台 FutureTarget<Bitemap> f = Glide.with(context).asBitmap().load(url).submit(width,height); f.get() // Glide.with(context).clear(f) | |||
| // ImageView的自动变换 | |||
| // 在Glide中,当你为一个 ImageView 开始加载时,Glide可能会自动应用 FitCenter 或 CenterCrop ,这取决于view的 ScaleType 。 | |||
| // 如果 scaleType 是 CENTER_CROP , Glide 将会自动应用 CenterCrop 变换。 | |||
| // 如果 scaleType 为 FIT_CENTER 或 CENTER_INSIDE ,Glide会自动使用 FitCenter 变换。 | |||
| // 当然,你总有权利覆写默认的变换,只需要一个带有 Transformation 集合的 RequestOptions 即可。另外,你也可以通过使用 dontTransform() 确保不会自动应用任何变换。 | |||
| } | |||
| @@ -1,61 +0,0 @@ | |||
| package com.suliang.common.util.image | |||
| import android.graphics.drawable.Drawable | |||
| import android.net.Uri | |||
| import android.widget.ImageView | |||
| import androidx.annotation.IdRes | |||
| import java.io.File | |||
| import java.net.URL | |||
| /** | |||
| * author suliang | |||
| * create 2022/3/11 15:45 | |||
| * Describe: 加载配置 | |||
| * 提取通用的View、加载路径等多参数 | |||
| */ | |||
| class LoaderOptions @JvmOverloads constructor(var url: String? = null, var file: File? = null, | |||
| var drawableResId: Int = -1, var uri: Uri? = null) { | |||
| /** 预加载图 */ | |||
| var placeholderResId: Int = -1 | |||
| var placeHolderDrawable: Drawable? = null | |||
| /** 错误图 */ | |||
| var errorResId: Int = -1 | |||
| /**是否居中裁剪*/ | |||
| var centerCropEnable: Boolean = false | |||
| /** 居中全显 */ | |||
| var centerInsideEnable: Boolean = false | |||
| /**是否缓存到本地*/ | |||
| var skipLocalCache: Boolean = false | |||
| var skipNetCache: Boolean = false | |||
| var targetWidth: Int = -1 | |||
| var targetHeight: Int = -1 | |||
| //圆角角度 | |||
| var bitmapAngle: Float = -1f | |||
| //图片 | |||
| var targetView: ImageView? = null | |||
| //回调 | |||
| // var callBack: BitmapCallBack? = null | |||
| // fun into(view: ImageView) { | |||
| // this.targetView = view | |||
| // ImageLoader.loadImage(this) | |||
| // } | |||
| // fun bitmap(callBack: BitmapCallBack) { | |||
| // this.callBack = callBack | |||
| // ImageLoader.loadOption(this) | |||
| // } | |||
| } | |||
| @@ -0,0 +1,65 @@ | |||
| package com.suliang.common.util.image | |||
| import android.content.Context | |||
| import android.util.Log | |||
| import com.bumptech.glide.Glide | |||
| import com.bumptech.glide.GlideBuilder | |||
| import com.bumptech.glide.Registry | |||
| import com.bumptech.glide.annotation.GlideModule | |||
| import com.bumptech.glide.load.DecodeFormat | |||
| import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool | |||
| import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory | |||
| import com.bumptech.glide.load.engine.cache.LruResourceCache | |||
| import com.bumptech.glide.load.engine.executor.GlideExecutor | |||
| import com.bumptech.glide.module.AppGlideModule | |||
| import com.bumptech.glide.module.LibraryGlideModule | |||
| import com.bumptech.glide.request.RequestOptions | |||
| /** | |||
| * author suliang | |||
| * create 2022/3/14 10:46 | |||
| * Describe: Generated API 目前仅可以在 Application 模块内使用。这一限制可以让我们仅持有一份 Generated API, | |||
| * 而不是各个 Library 和 Application 中均有自己定义出来的 Generated API。 | |||
| * 这一做法会让 Generated API 的调用更简单,并确保 Application 模块中 Generated API 调用的选项在各处行为一致。 | |||
| * 这一限制在接下来的版本中也许会被取消(以实验性或其他的方式给出) | |||
| * | |||
| * 与 Glide.with() 不同,诸如 fitCenter() 和 placeholder() 等选项在 Builder 中直接可用,并不需要再传入单独的 RequestOptions 对象 | |||
| * | |||
| * GlideApp.with(fragment).load(myUrl).placeholder(R.drawable.placeholder).fitCenter().into(imageView); | |||
| * | |||
| * | |||
| * https://blog.csdn.net/MldXTieJiang/article/details/109347774 全局配置 | |||
| */ | |||
| @GlideModule | |||
| class MyGlideApp : AppGlideModule() { | |||
| //已经迁移到 Glide v4 的 AppGlideModule 和 LibraryGlideModule ,你可以完全禁用清单解析。这样可以改善 Glide 的初始启动时间,并避免尝试解析元数据时的一些潜在问题 | |||
| override fun isManifestParsingEnabled(): Boolean { | |||
| return false | |||
| } | |||
| override fun applyOptions(context: Context, builder: GlideBuilder) { | |||
| builder.apply { | |||
| val cacheSize = Runtime.getRuntime().maxMemory() / 8 | |||
| //设置Bitmap的缓存池 | |||
| setBitmapPool(LruBitmapPool(30)) | |||
| //设置内存缓存 | |||
| setMemoryCache(LruResourceCache(cacheSize)) | |||
| //设置磁盘缓存 | |||
| setDiskCache(InternalCacheDiskCacheFactory(context)) | |||
| //设置读取不在缓存中的资源的线程 | |||
| setResizeExecutor(GlideExecutor.newSourceExecutor()) | |||
| //设置读取磁盘缓存中的资源的线程 | |||
| setDiskCacheExecutor(GlideExecutor.newDiskCacheExecutor()) | |||
| //设置日子级别 | |||
| setLogLevel(Log.DEBUG) | |||
| //设置全局选项 | |||
| // val apply = RequestOptions().apply { | |||
| // format(DecodeFormat.PREFER_RGB_565) | |||
| // } | |||
| // setDefaultRequestOptions(apply) | |||
| } | |||
| } | |||
| } | |||