| 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() | |||||
| } | |||||
| } |
| import android.os.Bundle | import android.os.Bundle | ||||
| import android.os.Looper | import android.os.Looper | ||||
| import android.view.View | import android.view.View | ||||
| import com.bumptech.glide.load.resource.bitmap.CircleCrop | |||||
| import com.suliang.common.base.activity.BaseActivity | import com.suliang.common.base.activity.BaseActivity | ||||
| import com.suliang.common.util.LogUtil | import com.suliang.common.util.LogUtil | ||||
| import com.suliang.common.util.image.ImageLoader | 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.* | ||||
| import com.suliang.common.util.media.MPManager.addPlayListener | |||||
| import com.suliang.common.util.thread.AppExecutors | |||||
| import com.xkl.cdl.R | import com.xkl.cdl.R | ||||
| import com.xkl.cdl.databinding.ActivitySplashBinding | import com.xkl.cdl.databinding.ActivitySplashBinding | ||||
| override fun loadData() { | 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 { | val util:IMP = MPManager.apply { |
| appcompat_version: "1.4.1", | appcompat_version: "1.4.1", | ||||
| material_version : "1.3.0", | material_version : "1.3.0", | ||||
| lifecycle_version: "2.5.0-alpha02", | lifecycle_version: "2.5.0-alpha02", | ||||
| glide_version : "4.1.0", | |||||
| glide_version : "4.11.0", | |||||
| ] | ] | ||||
| //必须依赖 | //必须依赖 | ||||
| dependencies_required = [ | dependencies_required = [ | ||||
| //Glide 依赖和配置 | //Glide 依赖和配置 | ||||
| Glide : "com.github.bumptech.glide:glide:${versions.glide_version}", | Glide : "com.github.bumptech.glide:glide:${versions.glide_version}", | ||||
| GlideCompiler : "com.github.bumptech.glide:compiler:${versions.glide_version}", | GlideCompiler : "com.github.bumptech.glide:compiler:${versions.glide_version}", | ||||
| //Glide translation | |||||
| GlideTranslation: "jp.wasabeef:glide-transformations:4.3.0" | |||||
| ] | ] | ||||
| rootProject.ext.dependencies_required.each{ k,v -> implementation v} | rootProject.ext.dependencies_required.each{ k,v -> implementation v} | ||||
| testImplementation rootProject.ext.dependencies_testImplementation.junit | testImplementation rootProject.ext.dependencies_testImplementation.junit | ||||
| rootProject.ext.dependencies_androidTestImplementation.each{ k,v -> androidTestImplementation v} | 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 | //glide | ||||
| api rootProject.ext.dependencies_custom.Glide | |||||
| kapt rootProject.ext.dependencies_custom.GlideCompiler | |||||
| api customDependencies.Glide | |||||
| kapt customDependencies.GlideCompiler | |||||
| //glide translation | |||||
| api customDependencies.GlideTranslation | |||||
| } | } |
| # If you keep the line number information, uncomment this to | # If you keep the line number information, uncomment this to | ||||
| # hide the original source file name. | # 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 *; | |||||
| } |
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| xmlns:tools="http://schemas.android.com/tools" | |||||
| package="com.suliang.common"> | package="com.suliang.common"> | ||||
| <!--网络权限--> | |||||
| <uses-permission android:name="android.permission.INTERNET"/> | <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连接,否则连接失败 | <!--networkSecurityConfig,usesCleartextTraffic 二选一都可以9.0-P以上高版本的http连接,否则连接失败 | ||||
| android:networkSecurityConfig="@xml/network_security_config" | android:networkSecurityConfig="@xml/network_security_config" | ||||
| android:usesCleartextTraffic="true" | android:usesCleartextTraffic="true" |
| 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() { | |||||
| } | |||||
| } |
| 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!!) | |||||
| // } | |||||
| } |
| package com.suliang.common.util.image | package com.suliang.common.util.image | ||||
| import android.net.Uri | |||||
| import android.widget.ImageView | |||||
| import java.io.File | |||||
| /** | /** | ||||
| * author suliang | * author suliang | ||||
| * create 2022/3/11 15:45 | * create 2022/3/11 15:45 | ||||
| * Describe: 策略接口 | * Describe: 策略接口 | ||||
| */ | */ | ||||
| interface ILoaderStrategy { | |||||
| interface IBaseLoaderStrategy { | |||||
| fun loadImage(option : LoaderOptions) | |||||
| fun loadImage(option : ImageLoaderOption) | |||||
| /** | /** | ||||
| * 清理内存缓存 | * 清理内存缓存 |
| package com.suliang.common.util.image | package com.suliang.common.util.image | ||||
| import android.content.Context | |||||
| import android.net.Uri | import android.net.Uri | ||||
| import android.widget.ImageView | import android.widget.ImageView | ||||
| import androidx.annotation.DrawableRes | |||||
| import java.io.File | import java.io.File | ||||
| import java.net.URL | |||||
| /** | /** | ||||
| * author suliang | * author suliang | ||||
| * https://juejin.cn/post/6844903463134953479#heading-3 | * https://juejin.cn/post/6844903463134953479#heading-3 | ||||
| * https://www.jianshu.com/p/19420b151507 | * https://www.jianshu.com/p/19420b151507 | ||||
| * https://blog.csdn.net/EthanCo/article/details/102587193 | * 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) { | 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) { | 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) { | 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() | |||||
| } | |||||
| } | } |
| 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() 确保不会自动应用任何变换。 | |||||
| } |
| 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) | |||||
| // } | |||||
| } |
| 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) | |||||
| } | |||||
| } | |||||
| } |