KMP 实现鸿蒙跨端:Kotlin 环境体感舒适度指数计算工具
本文介绍了一个基于Kotlin Multiplatform(KMP)的环境体感舒适度指数计算工具。该工具通过输入温度、湿度和风速数据,输出体感温度估算值、舒适度等级(偏冷/凉爽/舒适/偏热/炎热)及生活建议。核心算法采用Kotlin实现并通过Kotlin/JS编译为JavaScript模块,最终在ArkTS页面中调用展示。文章详细说明了功能设计、Kotlin实现代码、JavaScript调用方式、
目录
-
概述
-
功能设计
-
Kotlin 实现代码(KMP)
-
JavaScript 调用示例
-
ArkTS 页面集成与调用
-
数据输入与交互体验
-
编译与自动复制流程
-
总结
概述
本案例在 Kotlin Multiplatform (KMP) 工程中实现了一个 环境体感舒适度指数计算工具:
-
输入:一串数字,依次为 温度(℃)、湿度(%)、风速(m/s),例如:
26 60 0.5。 -
输出:
-
体感温度估算值
-
舒适度等级(偏冷/凉爽/舒适/偏热/炎热)
-
基于当前环境的简短建议
-
-
技术路径:Kotlin → Kotlin/JS → JavaScript 模块 → ArkTS 页面调用。
相比纯算法示例,这个工具更贴近日常:你可以基于实时天气数据或者室内传感器数据,快速给出用户能理解的“体感温度”和舒适度提示,适合作为学习/工作环境的辅助信息展示。
功能设计
输入数据格式
环境体感舒适度工具的输入非常直接:
-
使用 空格 分隔三个参数:
-
第 1 个:温度(摄氏度),例如
26 -
第 2 个:相对湿度(百分比),例如
60 -
第 3 个:风速(米/秒),例如
0.5
-
-
示例输入:
26 60 0.5
输出信息结构
Kotlin 函数返回一段结构化的多行文本,包含:
-
标题:环境体感舒适度指数。
-
体感温度估算:根据温湿度和风速综合给出的体感温度(非严格科学公式,仅用于演示)。
-
舒适度等级:根据体感温度区间将环境划分为“偏冷/凉爽/舒适/偏热/炎热”等等级。
-
建议:针对不同等级给出简短的生活建议,如“适当添加衣物”“注意防暑降温”等。
这种输出方式便于 ArkTS 页面直接用一个 Text 组件完整展示,也便于复制到日志或终端进行调试。
Kotlin 实现代码(KMP)
核心实现位于 src/jsMain/kotlin/App.kt,并通过 @JsExport 导出:
@OptIn(ExperimentalJsExport::class)
@JsExport
fun comfortIndexCalculator(inputText: String = "26 60 0.5"): String {
// 输入格式: "温度(℃) 湿度(%) 风速(m/s)", 例如 "26 60 0.5"
val parts = inputText.trim().split(" ").filter { it.isNotEmpty() }
if (parts.size < 3) {
return "❌ 错误: 请按 '温度 湿度 风速' 的格式输入,例如: 26 60 0.5"
}
val temperature = parts[0].toDoubleOrNull()
val humidity = parts[1].toDoubleOrNull()
val windSpeed = parts[2].toDoubleOrNull()
if (temperature == null || humidity == null || windSpeed == null) {
return "❌ 错误: 温度/湿度/风速 解析失败\n示例: 26 60 0.5"
}
// 简单的体感温度估算:随湿度升高而升高,随风速增大而降低
val apparentTemp = temperature + (humidity - 50.0) * 0.05 - windSpeed * 1.2
val comfortLevel = when {
apparentTemp < 10 -> "偏冷"
apparentTemp in 10.0..18.0 -> "凉爽"
apparentTemp in 18.0..26.0 -> "舒适"
apparentTemp in 26.0..30.0 -> "偏热"
else -> "炎热"
}
val suggestion = when (comfortLevel) {
"偏冷" -> "建议适当添加衣物,注意保暖,特别是在早晚温差较大的时候。"
"凉爽" -> "气温较为凉爽,适合散步、学习和工作,注意避免长时间久坐。"
"舒适" -> "当前环境体感舒适,非常适合专注学习或进行轻度运动。"
"偏热" -> "略感闷热,建议补充水分,保持通风,避免长时间高强度活动。"
else -> "体感炎热,注意防暑降温,尽量避免在高温时段长时间户外活动。"
}
return "🌡 环境体感舒适度指数\n" +
"━━━━━━━━━━━━━━━━━━━━━\n" +
"输入参数: 温度 ${temperature}℃, 湿度 ${humidity}%, 风速 ${windSpeed} m/s\n\n" +
"1️⃣ 体感温度估算:\n" +
" 体感温度: ${"" + String.format("%.1f", apparentTemp)}℃\n\n" +
"2️⃣ 舒适度判断:\n" +
" 舒适等级: ${comfortLevel}\n\n" +
"3️⃣ 建议:\n" +
" ${suggestion}\n\n" +
"━━━━━━━━━━━━━━━━━━━━━\n" +
"✅ 分析完成!"
}
代码说明
-
输入解析:
-
使用
split(" ")和filter { it.isNotEmpty() }处理空格,容忍用户多打几个空格。 -
尝试将三个参数转换为
Double,若有任何一个为null,直接返回错误提示,并给出示例。
-
-
体感温度估算:
-
使用一个简单的线性公式:
-
湿度偏高时体感温度上升;
-
风速增大时体感温度下降;
-
-
注意:这不是严格的气象公式,仅用于演示跨端工具的实现思路。
-
-
舒适度区间划分:
-
小于 10℃:偏冷
-
10–18℃:凉爽
-
18–26℃:舒适
-
26–30℃:偏热
-
大于 30℃:炎热
-
-
建议文案:
-
针对每个区间给出一句自然语言建议,方便直接展示给终端用户。
-
JavaScript 调用示例
和其他 Kotlin/JS 导出的函数一样,comfortIndexCalculator 会被编译进 hellokjs.mjs 模块中。在纯 JS 环境里的用法如下:
// 导入 Kotlin/JS 生成的 ES Module
import { comfortIndexCalculator } from './hellokjs.mjs';
// 示例 1:使用默认参数
const result1 = comfortIndexCalculator();
console.log(result1);
// 示例 2:自定义一组环境参数
const result2 = comfortIndexCalculator('30 75 1.2');
console.log(result2);
控制台会打印类似如下的结果:

ArkTS 页面集成与调用
在 OpenHarmony 工程 kmp_ceshiapp 中,我们已经将首页 Index.ets 改造成“环境体感舒适度指数”页面,核心调用逻辑如下:
import { comfortIndexCalculator } from './hellokjs';
@Entry
@Component
struct Index {
@State message: string = '请输入当前温度、湿度和风速';
@State inputText: string = '26 60 0.5';
@State resultText: string = '';
aboutToAppear(): void {
this.calculateComfortIndex();
}
calculateComfortIndex(): void {
try {
const input: string = this.inputText;
const result: string = comfortIndexCalculator(input);
this.resultText = result;
this.message = '✓ 计算完成';
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
this.message = `✗ 错误: ${errorMessage}`;
}
}
build() {
// 省略 UI 细节,重点在于调用关系
}
}
通过这种方式,ArkTS 页面只关心:
-
输入框里的字符串
inputText; -
comfortIndexCalculator返回的一整段分析文本; -
当前状态提示
message。
实际计算逻辑(包括体感温度估算和建议生成)全部由 Kotlin 提供,实现前后端解耦和跨端复用。
数据输入与交互体验
ArkTS 界面主要包含三部分:
-
顶部标题栏:显示“KMP 鸿蒙跨端”和“环境体感舒适度指数”字样。
-
输入区域:
Column() {
Text('输入温度/湿度/风速 (示例: 26 60 0.5):')
.fontSize(14)
.fontWeight(FontWeight.Bold)
.fontColor('#1f2937')
.margin({ bottom: 8 })
TextInput({ placeholder: '例如: 26 60 0.5', text: this.inputText })
.width('100%')
.height(80)
.padding(8)
.border({ width: 1, color: '#d1d5db' })
.borderRadius(6)
.onChange((value: string) => {
this.inputText = value;
})
.margin({ bottom: 12 })
Button('开始分析')
.width('100%')
.height(40)
.margin({ top: 4 })
.backgroundColor('#f59e0b')
.fontColor(Color.White)
.onClick(() => {
this.calculateComfortIndex();
})
}
-
结果区域 + 底部按钮:
-
通过
Scroll+Text组件展示resultText,使用monospace字体保持输出对齐; -
“默认示例”按钮会重置为
26 60 0.5并触发分析; -
“清空”按钮会清除输入和结果,并将
message还原为“请输入当前温度、湿度和风速”。
-
用户体验上,打开页面即可看到默认示例结果,随后只需要修改一行输入并点击“开始分析”即可获得新的环境舒适度评估。
编译与自动复制流程
Kotlin 代码更新后,要让 ArkTS 端使用最新的 comfortIndexCalculator,只需要在项目根目录执行一次脚本:
cd d:\flutter_Obj\kmp_openharmony .\build-and-copy.bat
脚本会自动完成:
-
运行
gradlew build编译 Kotlin/JS; -
在
build/js/packages/hellokjs/kotlin/下生成/更新:-
hellokjs.mjs -
hellokjs.d.ts
-
-
将它们复制到 ArkTS pages 目录:
-
kmp_ceshiapp/entry/src/main/ets/pages/hellokjs.d.ts -
kmp_ceshiapp/entry/src/main/ets/pages/hellokjs.js(由 mjs 改名)。
-
每次修改 App.kt 中的工具函数(包括 comfortIndexCalculator)后,只要重新执行这个脚本,ArkTS 侧就会自动获得最新的实现,无需手动拷贝或改路径。
总结
“环境体感舒适度指数计算工具”展示了如何用 Kotlin + KMP + ArkTS 快速构建一个贴近生活的跨端小工具:
-
在 Kotlin 中实现体感温度估算和舒适度判断逻辑,并通过
@JsExport导出。 -
使用 Kotlin/JS 编译生成 ES Module 和类型声明,使函数可以在 JavaScript/ArkTS 中像本地方法一样调用。
-
在 OpenHarmony ArkTS 页面中,用极少的代码完成输入收集和结果展示,把主要精力放在 UI 和体验上。
配合前面的 BMI、贷款、成绩分析、个人预算、学习打卡等案例,这个环境舒适度工具进一步丰富了 KMP 跨端示例库,你可以在此基础上继续扩展:
-
引入真实气象公式或第三方 API,提高体感温度的准确性;
-
根据不同用户类型(老人、儿童、运动人群)给出差异化建议;
-
将结果和打卡工具结合,记录“适合学习的日子”或“高效学习时段”等信息。
核心思路很简单:用 Kotlin 统一做复杂逻辑,用 ArkTS 做好界面展示和交互,通过 KMP 把两者优雅地拼在一起。
更多推荐



所有评论(0)