我正在参加「启航计划」

1、前语

月末端,再写一篇文章和各位分享下,想到啥就写啥了,根本一切示例都是脑子一抽就写出来了。假如写的不好,或许有错误之处,恳请在谈论、私信、邮箱指出,万分感谢。

今日来了解下Coil库,Coil是一个专为Android运用程序设计的轻量级图画加载库,具有以下特色:

  1. 简练易用:Coil供给简略直观的API和易于了解的接口,使得图画加载变得简略而不费力。
  2. 高效性能:Coil运用现代的图画加载技能和优化战略,以完成高效的图画加载和显现,并供给平滑的翻滚体验。
  3. 灵活可定制:Coil答应开发人员经过自定义组件、插件和转换器来扩展其功能,以满意各种不同的图画加载需求。
  4. 主动化:Coil支撑主动化的磁盘和内存缓存办理,以减少对开发人员的额外负担。
  5. 资源优化:Coil能够依据方针设备的屏幕密度主动挑选适当的图画资源,以供给最佳的显现作用。

先看看怎样运用吧

2、依靠

dependencies {
    implementation("io.coil-kt:coil:2.4.0")
}

3、运用

class MainActivity : AppCompatActivity() {
  private lateinit var binding: ActivityMainBinding
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.run {
      iv1.load("https://www.6hu.cc/files/2023/07/1689233672-4f201e885192ad0.jpeg")
     }
   }
}

如何学会使用Coil

没了…………

恶作剧啦,怎样或许没了嘛。

能够看到得益于Kotlin的语法糖,加载图片不能说简略吧,只能说几乎弱智了。不过load是一个多参数的办法的。咱们来看看。

如何学会使用Coil

能够看到有两个参数是带有默许值的,ImageLoaderImageRequest

4、ImageRequest

ImageRequest是用于加载和办理图画的要害概念。ImageRequest方针封装了加载图画所需的一切信息,它为 ImageLoader 供给加载图画所需的一切信息。

1)创立ImageRequest:

你能够运用ImageRequest.Builder()来创立一个ImageRequest方针。在构建器中,你能够指定图画的URL、可选的加载参数和选项。例如:

val request = ImageRequest.Builder(this@MainActivity)
   .data("https://www.6hu.cc/files/2023/07/1689233679-8d2da08340416e0.jpeg")
   .size(400, 300) // 设置图画的方针尺度
   .placeholder(R.mipmap.placeholder) // 设置占位图
   .error(R.mipmap.error) // 设置加载错误时显现的图画
   .build()

2)加载和显现图画

假如创立了ImageRequest方针运用起来也是共同的

iv2.load(request)

3)图画改换和处理

  • 指定图画的URL或任何其他数据源,如文件路径、资源ID等。

    fun data("")
    
  1. 指定图画的方针宽度和高度

    fun size(300, 300)
    
  • 指定图画的缩放类型,如填充(Scale.FILL)、习惯(Scale.FIT)。

    fun scale(Scale.FILL)
    
  • 指定图画的网络缓存战略,如启用缓存(CachePolicy.ENABLED)、禁用缓存(CachePolicy.DISABLED)等。

    fun networkCachePolicy(CachePolicy.ENABLED)
    
  • 指定在加载图画时产生错误时显现的占位图。

    fun error(R.drawable.error)
    
  • 指定在图画加载过程中显现的占位图。

    fun placeholder(R.drawable.placeholder)
    
  • 启用图画加载时的淡入淡出作用,完成平滑的过渡作用。

    fun crossfade(true)
    
  • 添加图画的改换操作,如圆形裁剪(CircleCropTransformation)、高斯含糊(BlurTransformation)等。

    fun transformations(CircleCropTransformation())
    
  • 指定图画的内存缓存战略,如启用缓存(CachePolicy.ENABLED)、禁用缓存(CachePolicy.DISABLED)等。

    fun memoryCachePolicy(CachePolicy.ENABLED)
    
  • 指定图画的磁盘缓存战略,如启用缓存(CachePolicy.ENABLED)、禁用缓存(CachePolicy.DISABLED)等。

    fun diskCachePolicy(CachePolicy.ENABLED)
    
  • 添加图画加载的监听器,可在加载开始、成功或失败时履行相应的操作。

    fun listener(
      onStart = {/* 加载开始时履行的操作 */ },
      onCancel = {/* 加载撤销时履行的操作 */ },
      onError = { request, result ->/* 加载失败时履行的操作 */ },
      onSuccess = { request, result ->/* 加载成功时履行的操作 */ })
    
  • 设置是否启用预乘透明度

    fun premultipliedAlpha(enable: Boolean)
    
  • 置网络恳求的头部信息

    fun addHeader(name: String, value: String)
    
  • 设置当数据源为空时的备用占位符

    fun fallback(drawable: Drawable?)
    
  • 设置是否答应运用 RGB565 格局

    fun allowRgb565(enable: Boolean)
    
  • 答应将结果转换为位图

    fun allowConversionToBitmap(enable: Boolean)
    
  • 设置数据解码的工厂

    fun decoderFactory(factory: Decoder.Factory)
    
  • 设置图画加载的精度

    fun precision(precision: Precision)
    
  • 设置缩略图恳求

    fun thumbnail(thumbnail: RequestBuilder<Drawable>?)
    
  • 设置图画加载的过渡作用

    fun transition(transition: Transition)
    

等等,还有很多啦,就看看文档吧去

大概是下面这么用的,如下

val request2 = ImageRequest.Builder(this@MainActivity)
       .data("https://www.6hu.cc/files/2023/07/1689233672-4f201e885192ad0.jpeg")
       .size(400, 300) // 设置图画的方针尺度
       .scale(Scale.FIT)//Scale.FILL / Scale.FIT
       .networkCachePolicy(CachePolicy.ENABLED).error(R.mipmap.error) // 设置加载错误时显现的图画
       .placeholder(R.mipmap.placeholder) // 设置占位图
       .crossfade(true).transformations(CircleCropTransformation())
       .memoryCachePolicy(CachePolicy.ENABLED).diskCachePolicy(CachePolicy.ENABLED)
       .listener(
         onStart = {/* 加载开始时履行的操作 */ },
         onCancel = {/* 加载撤销时履行的操作 */ },
         onError = { request, result ->/* 加载失败时履行的操作 */ },
         onSuccess = { request, result ->/* 加载成功时履行的操作 */ }
       ).build()

4)撤销图画加载

假如需要撤销正在进行的图画加载操作,你能够运用返回的Disposable方针

如何学会使用Coil

如何学会使用Coil

5、ImageLoader

说完了ImageRequest,咱们接着来说ImageLoader

从名字来看咱们就能猜测负责办理图画加载过程,官方是这么说的

A service class that loads images by executing ImageRequests. Image loaders handle caching, data fetching, image decoding, request management, memory management, and more. Image loaders are designed to be shareable and work best when you create a single instance and share it throughout your app.

一个经过履行ImageRequests加载图画的服务类。图画加载程序处理缓存、数据获取、图画解码、恳求办理、内存办理等。 图片加载器被设计成可同享的,当你创立一个实例并在整个运用程序中同享它时,作用最好。

按照官方说的创立一个同享的实例ImageLoader,咱们能够在Application中创立

class MyApp : Application(), ImageLoaderFactory {
  override fun newImageLoader(): ImageLoader {
    return ImageLoader.Builder(applicationContext)
       .crossfade(true)
       .okHttpClient {
        OkHttpClient.Builder()
           .cache(CoilUtils.createDefaultCache(applicationContext))
           .build()
       }
       .build()
   }
}

同享一个是因为每个 ImageLoader 都有自己的内存缓存、磁盘缓存和 OkHttpClient。所以最好用一个啦。

从上面的代码你能够看到ImageLoader是运用Builder构建出来的,让咱们来看看还有什么特点能够操作吧

class Builder {
  private val applicationContext: Context
  private var defaults: DefaultRequestOptions
  private var memoryCache: Lazy<MemoryCache?>?
  private var diskCache: Lazy<DiskCache?>?
  private var callFactory: Lazy<Call.Factory>?
  private var eventListenerFactory: EventListener.Factory?
  private var componentRegistry: ComponentRegistry?
  private var options: ImageLoaderOptions
  private var logger: Logger?
}

applicationContext就不说了看其他

每一个值都有相关的办法,东西不多,我直接挪列出来吧~

  • okHttpClient(okHttpClient: OkHttpClient)okHttpClient(initializer: () -> OkHttpClient):设置用于网络恳求的OkHttpClient实例。你能够直接传入一个现已创立好的OkHttpClient实例,或许运用懒加载的办法在后台线程上创立OkHttpClient实例。
  • callFactory(callFactory: Call.Factory)callFactory(initializer: () -> Call.Factory):设置用于网络恳求的Call.Factory。你能够直接传入一个现已创立好的Call.Factory实例,或许运用懒加载的办法在后台线程上创立Call.Factory实例。
  • components(builder: ComponentRegistry.Builder.() -> Unit)components(components: ComponentRegistry):设置用于构建和装备ComponentRegistry
  • memoryCache(memoryCache: MemoryCache?)memoryCache(initializer: () -> MemoryCache?):设置内存缓存MemoryCache。你能够直接传入一个MemoryCache实例,或许运用懒加载的办法在后台线程上创立MemoryCache实例。
  • diskCache(diskCache: DiskCache?)diskCache(initializer: () -> DiskCache?):设置磁盘缓存DiskCache。你能够直接传入一个DiskCache实例,或许运用懒加载的办法在后台线程上创立DiskCache实例。
  • allowHardware(enable: Boolean):是否答应运用Bitmap.Config.HARDWARE进行图画加载,默以为true
  • allowRgb565(enable: Boolean):是否在图画没有透明度的情况下主动运用Bitmap.Config.RGB_565,默以为false
  • addLastModifiedToFileCacheKey(enable: Boolean):是否将FilelastModified添加到内存缓存键中,默以为true
  • networkObserverEnabled(enable: Boolean):是否启用离线时主动禁用网络恳求,默以为true
  • respectCacheHeaders(enable: Boolean):是否启用网络缓存头的支撑,默以为true
  • bitmapFactoryMaxParallelism(maxParallelism: Int):设置BitmapFactory并行解码操作的最大数量,默以为4。
  • bitmapFactoryExifOrientationPolicy(policy: ExifOrientationPolicy):设置处理由BitmapFactoryDecoder解码的图画的EXIF方向标志的战略,默以为ExifOrientationPolicy.RESPECT_PERFORMANCE
  • eventListener(listener: EventListener)eventListenerFactory(factory: EventListener.Factory):设置用于接收恳求的事件回调的EventListener
  • crossfade(enable: Boolean)crossfade(durationMillis: Int):启用或设置穿插淡入淡出动画的持续时间。
  • transitionFactory(factory: Transition.Factory):设置默许的过渡动画工厂。
  • precision(precision: Precision):设置恳求的默许精确度。
  • bitmapConfig(bitmapConfig: Bitmap.Config):设置首选的Bitmap.Config
  • dispatcher(dispatcher: CoroutineDispatcher):设置用于履行图画加载任务的调度程序,默以为Dispatchers.Main
  • transformations(vararg transformations: Transformation):设置要运用于加载的图画的转换。
  • allowRgb565OnSlowDevices(enable: Boolean):是否在慢速设备上主动运用Bitmap.Config.RGB_565,默以为true

6、下个篇章

因为篇幅原因,咱们先到这,首要还是介绍特点啦,还有更多用法,下篇立刻~咕咕咕。

假如您有任何疑问、对文章写的不满意、发现错误或许有更好的办法,欢迎在谈论、私信或邮件中提出,非常感谢您的支撑。

7、感谢

  1. 校稿:ChatGpt
  2. 文笔优化:ChatGpt

代码都在这儿啦,或许有所出入,大差不差啦