KMP中的资源处理(字符串,图片等)

前言

以安卓开发者的视角,资源有很多种类,不过常用的是这几种

而KMP中的UI一般用Compose

其中的anim,layout,colors,themes都使用代码的形式实现

而KMP中目前貌似没有通用的字符串和图片资源管理和获取的方式,于是我们自己实现一下

正文

字符串资源

字符串的实现我的实现很简单,就是直接用一个单例类来记录各种字符串资源

大概实现是这样:

/**
 * creator: lt
 * effect : 字符串资源
 * warning: 
 */
object Strings {
    val separator: String
        //单词间的分隔符
        get() {
            return when (LanguageManager.currLanguage) {
                EN -> " "
                ZH -> ""
            }
        }
    val respose_error: String
        get() {
            return when (LanguageManager.currLanguage) {
                EN -> "Server error, please try again later!"
                ZH -> "服务器错误,请稍后再试!"
            }
        }
}

其中 LanguageManager.currLanguage 是一个自定义的state,所以文本是可以响应式的根据语言改变app内的文本的(ps:可以这么做,不过目前我是用的是隐式参数的方式)

使用方式为:

Text(Strings.respose_error)

简单方便

图片资源

图片资源我们也可以像字符串资源一样使用代码的形式来实现

实现方式:

object Painters {
    val select: Painter
        @Composable
        get() = PainterGenerator.generate("select", "")
    val back: Painter
        @Composable
        get() {
            return when (LanguageManager.currLanguage) {
                EN -> PainterGenerator.generate("back", "")
                ZH -> PainterGenerator.generate("back", "zh")
            }
        }
}

select是单语言时的形式,back是有多种语言时的形式,同样可以响应式的根据语言自动切换图片

使用方式:

Image(Painters.back,null)

同样很简单

然后我们看一下 PainterGenerator.generate 是怎么实现的

common:

/**
 * creator: lt
 * effect : Painter生成器,用于生成静态的图片资源
 * warning:
 */
expect object PainterGenerator {
    /**
     * 生成Painter
     * drawable-zh-xxhdpi/ic_launcher.webp
     * [imageName]文件名: ic_launcher
     * [languageName]资源的语言: zh  如果zh目录中没有,则需传空字符串(要保证传的资源的语言的目录中要有这个图片才行)
     */
    @Composable
    fun generate(
        imageName: String,
        languageName: String,
    ): Painter
}

android:

actual object PainterGenerator {
    private var currLocale = 
    private val androidResource =
        Resources(
            app.assets,
            app.resources.displayMetrics,
            Configuration(app.resources.configuration)
        )

    /**
     * 生成Painter
     * drawable-zh-xxhdpi/ic_launcher.webp
     * [imageName]文件名: ic_launcher
     * [languageName]资源的语言: zh
     */
    @Composable
    actual fun generate(
        imageName: String,
        languageName: String
    ): Painter = remember(imageName, languageName) {
        //如果没有指定语言,就是用默认语言的图片,如果指定了语言,就设置一下资源的语言
        if (languageName.isEmpty())
            androidResource.configuration.setLocale(currLocale)
        else
            androidResource.configuration.setLocale(Locale(languageName))
        //获取drawable的id
        val id = ExceptionUtil.releaseCatchThrowable({
            androidResource.getIdentifier(
                imageName, "drawable", app.packageName
            )
        }) ?: R.drawable.load_error
        //根据id,使用带有语言设置的资源来加载
        BitmapPainter(
            androidResource.getDrawable(id).asT<BitmapDrawable>().bitmap.asImageBitmap()
        )
    }
}

安卓的实现复杂一些,其实就是通过 resource 对象的 getIdentifier 方法,然后设置相应的语言并通过文件夹名和文件名来找到相应的资源id,并加载,然后将bitmap转换为相应资源

ps:使用此方式安卓不能混淆资源名和混淆移除无用的resource文件

desktop 和 iOS:

actual object PainterGenerator {
    /**
     * 生成Painter
     * drawable-zh-xxhdpi/ic_launcher.webp
     * [imageName]文件名: ic_launcher
     * [languageName]资源的语言: zh
     */
    @Composable
    actual fun generate(
        imageName: String,
        languageName: String
    ): Painter = painterResource(remember(imageName, languageName) {
        "drawable%s-xxhdpi/%s.webp".format(
            if (languageName.isEmpty()) "" else "-$languageName",
            imageName
        )
    })
}

desktop和iOS没啥说的,其实就是用了自带的api,内部是通过classLoder(desktop)加载的资源

js:

actual object PainterGenerator {
    /**
     * 生成Painter
     * drawable-zh-xxhdpi/ic_launcher.webp
     * [imageName]文件名: ic_launcher
     * [languageName]资源的语言: zh
     */
    @OptIn(ExperimentalResourceApi::class)
    @Composable
    actual fun generate(
        imageName: String,
        languageName: String
    ): Painter {
        val state: MutableState<LoadState<ImageBitmap>> =
            remember(imageName, languageName) { mutableStateOf(LoadState.Loading()) }
        LaunchedSafeEffect(imageName, languageName) {
            state.value = try {
                LoadState.Success(
                    resource(
                        "drawable%s-xxhdpi/%s.webp".format(
                            if (languageName.isEmpty()) "" else "-$languageName",
                            imageName
                        )
                    ).readBytes()
                        .toImageBitmap()
                )
            } catch (e: Exception) {
                e.w()
                LoadState.Error(e)
            }
        }
        return BitmapPainter(state.value.orEmpty())
    }
}

js的实现也是使用了自带的api,不过是异步的,因为内部是走的网络请求加载的资源

然后我们可以通过配置资源目录,将每个端的资源目录指向一个目录

这样就实现了图片资源管理的功能

ps:其实图片资源的类我们完全可以通过ksp去生成,不过这不是这篇文章的重点,感兴趣的同学可以自己动手试试,参考:使用KSP处理注解和生成Kotlin代码

end

对Kotlin或KMP感兴趣的同学可以进Q群 101786950

如果这篇文章对您有帮助的话

可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统的功能模块主要是实现管理员服务端;首页、个人心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值