Compose-jb图片加载库load-the-image,适用于KMM Compose desktop桌面端(Windows,Linux,MacOs)

2023-05-16

前言

Android平台上有很多优秀的图片加载框架,比如Glide,Picasso,Fresco

而Compose-jetpack上的图片加载框架有Coil

但Compose-jb上却暂时没有图片加载框架,正好我有用Compose-jb写一些小工具,有图片加载的需求,于是就仿照Android平台的图片加载库写了一个具有简单功能的图片加载库

项目已开源,地址: load-the-image (github.com) 欢迎star

示例:

功能

1.简单的支持多个桌面平台的图片加载(部分格式异步加载)

2.支持多种格式:网络链接,本地文件,资源路径,InputStream,Bitmap,Image,ByteArray等,且支持自定义支持的格式

3.支持双重缓存:内存缓存和本地缓存,内存缓存支持配置最大内存,本地缓存支持配置缓存路径或自定义缓存配置

正文

使用方式

首先我们使用Compose展示图片一般都使用Image函数,其中一个函数的第一个入参是Painter类型,而我们的api就是返回一个Painter类型的对象,所以使用方式很简单,如下代码所示:

//url="https://img.zcool.cn/community/017e625e57415ea801216518c25819.jpg@1280w_1l_2o_100sh.jpg"
Image(rememberImagePainter(url), "")

对的,使用就是这么简单,当然使用该项目需要你引用一下远程依赖

基础配置

我就默认Compose-jb都是使用gradle+kts配置的了emmm

1. 在你根目录下的build.gradle.kts中添加:

buildscript {
    repositories {
        maven("https://jitpack.io")//this
        ...
    }
}

allprojects {
    repositories {
        maven("https://jitpack.io")//this
        ...
    }
}

2.在你的Compose-jb项目的代码目录(一般是desktop)下的build.gradle.kts中添加:

kotlin {
    sourceSets {
        val jvmMain by getting {
            dependencies {
                ...
                implementation("com.github.ltttttttttttt:load-the-image:1.0.2")//this
            }
        }
    }
}

 ps:最新版本参考:Github 或 JitPack

3.推荐:统一配置一下加载失败时展示的失败图路径:

fun main() {
    LoadTheImageManager.defaultErrorImagePath = "drawable-xxhdpi/load_error.jpeg"//this
    application {
        Window(onCloseRequest = ::exitApplication) {
            MaterialTheme {
                Image(rememberImagePainter("https://img.zcool.cn/community/017e625e57415ea801216518c25819.jpg@1280w_1l_2o_100sh.jpg"),"")
            }
        }
    }
}

ps: 资源位置大概这样,当然你可以自定义资源放的位置(可以查看github上的代码):

4.推荐:将compose-jb(desktop)的版本提升至1.1.1或以上

根据反馈,发现1.1.0版本compose-jb有bug,会启动不了

自定义配置

1.配置图片加载时的占位图和加载失败的图片

首先统一配置加载失败的图片已经在上面第三点写过了

单独配置,String格式的rememberImagePainter方法中有个placeholderResource参数表示占位图:

使用如下:

rememberImagePainter(url,占位图)

 如果想单独配置占位图和加载失败图和更多其他参数时,可以使用DataToBeLoaded类型的参数,使用如下所示:


    rememberImagePainter(DataToBeLoaded(url).apply {
        placeholderResource = 占位图
        errorImagePath = 加载失败图
    })

2.修改内存缓存大小:

LoadTheImageManager.memoryCache = ImageLruMemoryCache(99999/*最大的字节大小*/)

默认内存缓存大小为:maxOf(50M,总内存的1%)

默认内存缓存策略使用LRU,如果想改成别的策略,可以自定义一个类,然后实现ImageCache接口,实现相应方法,然后修改一下即可:

LoadTheImageManager.memoryCache = 你的实现类

3.修改文件缓存位置:

LoadTheImageManager.fileCache = ImageFileCache(File("C://test_dir"))

 默认文件缓存位置为:此电脑->图片->LoadTheImageCache

默认缓存使用md5做为文件名,如果想自定义策略或文件缓存方式,可以自定义一个类,然后实现ImageCache接口,实现相应方法,然后修改一下即可:

LoadTheImageManager.fileCache = 你的实现类

4.修改网络图片加载使用的网络引擎:

 默认网络引擎使用的是jvm自带的HttpURLConnection,如果想改成别的网络,可以自定义一个类,然后实现HttpLoader接口,实现相应方法,然后修改一下即可:

LoadTheImageManager.httpLoader = 你的实现类

 5.图片加载的rememberImagePainter函数支持多种格式输入,且可以自定义

除了这些定义好的格式,你也可以自定义自己的格式支持和解析:

首先自定义一个类实现LoadTheImage接口,在canLoad函数中判断自身是否支持此数据,然后进行加载即可,比如以下的支持加载字节数组:

 然后在配置一下:

LoadTheImageManager.loadTheImage.add(ByteArrayLoadTheImage())//当然目前此库已经支持字节数组了,不需要手动添加ByteArrayLoadTheImage

 最后可以这样使用:

rememberImagePainter(DataToBeLoaded(byteArrayOf()))//最好还是自己封装一下函数

多平台配置

一般使用Compose-jb的时候,可能会一起开发多平台项目(KMM),比如Android平台和Web平台,我们也可以适配一下做成多平台的图片加载代码

desktop端使用本库load-the-image,Android端使用Coil

配置

首先在基础配置的基础上,先在你的common文件夹中的build.gradle.kts中添加:

val desktopMain by getting{
	dependencies {
        ...
		implementation 'com.github.ltttttttttttt:load-the-image:1.0.2'
	}
}

commonMain中添加一个多平台函数:

@Composable
expect fun rememberImagePainter(url: String): Painter

androidMain中实现实现该函数(和其他平台(如果有)),使用Coil:

@Composable
actual fun rememberImagePainter(url: String): Painter =
    coil.compose.rememberImagePainter(data = url)

desktopMain中实现实现该函数:

@Composable
actual fun rememberImagePainter(url: String): Painter =
    com.lt.load_the_image.rememberImagePainter(url)

然后在desktop平台中或共享代码平台中都可以使用这个定义的函数了

如果配置不成功也可以直接看我的github上如何配置的

项目已开源,地址: load-the-image (github.com) 欢迎star

end

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Compose-jb图片加载库load-the-image,适用于KMM Compose desktop桌面端(Windows,Linux,MacOs) 的相关文章

  • docker部署nodejs项目

    本文主要分享使用docker部署nodejs项目 使用docker部署项目主要分为三步 1 创建nodejs项目 编写package json为项目安装依赖所用 34 name 34 34 expressPro 34 34 version
  • Android 开发跨进程大图

    对于跨进程传输数据的问题 xff0c 我之前也写了一篇 xff0c 配合阅读效果更好 xff1a Android 开发太难了 xff0c 这异常竟然捕获不到 xff1f 1 抛一个问题 这一天 xff0c 法海想锻炼小青的定力 xff0c
  • linux修改键位:ctrl与caps调换

    ctrl比caps的使用频率更高 xff0c 但是ctrl的位置却对小拇指并不友好 有时使用gnome tweak tool设置键位并没有生效 下面介绍两个简单的方法修改键位 1 使用xmodmap修改键位 我们可以使用包管理器轻松安装xm
  • pandas无法打开.xlsx文件,xlrd.biffh.XLRDError: Excel xlsx file; not supported

    原因是最近xlrd更新后只支持 xls文件 所以pandas read excel xxx xlsx 会报错 可以安装旧版xlrd xff0c 在终端中运行 xff1a pip3 uninstall xlrd pip3 install xl
  • python&多路归并

    问题 xff1a 在项目中 xff0c 需从待分析的数据中选出最大的前几名 xff0c 但由于数据量太大 xff0c 直接排序会内存报错 xff0c 因此尝试用多路归并的思路来解决问题 接口 xff1a 一个目录下有x个已排序好的csv 最
  • 03_spring的基本配置

    bean元素的id和name属性 在Spring配置中 xff0c id和name属性都可以表示bean元素的名称 xff0c 不同的是 xff1a id属性 xff0c 遵守XML语法ID约束 必须以字母开始 xff0c 可以使用字母 数
  • Linux服务器的登录与使用

    Linux服务器的登录与使用 关于登录Linux服务器的方式有很多种 xff0c 本文重点介绍了Linux和Windows下的登录和使用Linux服务器的方式 Linux服务器 服务器可看为是一台功能配置强大的电脑 xff0c 有独立的操作
  • Angular2 - [innerHTML] && pipe(把字符串里的 /n 替换成 <br/>)

    需求 把接口返回的使用说明字符串innerHTML出来 xff1b 本来想直接 innerHTML 就可以了 xff0c 但是事不遂人愿 xff0c 那就写个pipe过滤一下 xff1b 过程 接口返回字符串 xff1a 34 coupon
  • vscode ftp-sync 插件使用

    插件安装和配置 1 下载ftp sync插件 extensions中直接搜索安装即可 2 ctrl 43 shift 43 p 选择执行Ftp sync init 配置文件json含义如下 span class token punctuat
  • Ubuntu16.04终端执行`sudo apt-get update`遇到appstream问题

    Ubuntu 16 04 终端执行sudo apt get update遇到问题 E xff1a Problem executing scripts APT Update Post Invoke Success br 39 if usr b
  • Cloudflare5s盾破解|爬虫自动验证|解决方案

    一 什么是Cloudflare5s盾 Cloudflare是一个网站加速和安全服务提供商 Cloudflare 5s盾是指网站防御模式 xff0c 它可以防止恶意流量和攻击 xff0c 如DDoS SQL注入 XSS等 xff0c 保护网站
  • 若依Vue入门——服务器部署篇

    目录 前端 xff0c ruoyi ui 编译 部署 后端 xff0c ruoyi 使用若依前后端分离的Vue 43 Springboot脚手架 xff0c 进行编译与在Windows Server服务器上的部署 使用IDEA作为IDE 使
  • Spring启动流程解析(总)

    一 xff0c Spring启动流程概述 Spring的IoC容器在实现控制反转和依赖注入的过程中 xff0c 可以划分为两个阶段 xff1a 容器启动阶段 Bean实例化阶段 容器初始化 加载配置 分析配置信息 将Bean信息装配到Bea
  • Node,docker 中安装node.js

    1 启动docker服务 首先启动docker服务 systemctl start docker 2 获取node最新镜像 启动完成之后拉取node最新镜像 xff1a docker pull node 然后开始等待 xff0c 最后拉取完
  • 慎用!!! rm -rf 潜藏着巨大的危险!

    平时删除文件爱偷个懒 笔直 rm rf 过去就不想事了 今天碰到一个很意外的情况 以前也有碰到过 但总没留意到 在这里记下提醒自己 希望大家也多留个神 先说说 rm 的用法 官方的描述是这样的 rm 命令可以删除一个目录中的一个或多个文件或
  • 个人面试细节、技巧总结(没有面试题哦!)

    面试除了自身技能过硬外 xff0c 良好的沟通 xff0c 平和的心态 xff0c 细节的拿捏也都是额外的加分项 最后 xff0c 以些许运气加以点缀 xff0c offer 便八九不离十了 参加工作两年有余 xff0c 只大专文凭 xff
  • EFCore 实现连接MySQL并创建实体类

    EFCore 实现连接MySQL并创建实体类 所需文件版本 1 Pomelo EntityFrameworkCore MySql 2 2 0 2 Microsoft EntityFrameworkCore Tools 2 2 0 3 Pom
  • Win10设置文件夹背景色

    右键个性化 选择左侧的颜色 xff0c 根据自己的喜欢进行设置
  • 快速计算代码行小工具

    非常方便用于统计代码行的小工具叫line counter xff0c 使用以下命令获取工具 pip install line counter 使用 34 line 34 命令可以获取当前目录下的文件与行数统计 xff0c 效果如下 line
  • 协议栈设计_LwIP笔记

    文章目录 LWIP主进程工作链路层LWIP数据包收发函数框架ARP 地址解析协议 表ARP表查询IP层ICMP处理 Internet 控制报文协议 TCPIP Thread线程启动流程 tcpip thread主线程处理 LWIP主进程工作

随机推荐