【环境准备】

• 操作系统:Windows 10

• 开发工具:DevEco Studio 5.0.1 Release Build Version: 5.0.5.306

• 目标设备:华为Mate60 Pro

• 开发语言:ArkTS

• 框架:ArkUI

• API版本:API 13

【项目背景与价值】

在程序员日常开发中,常常需要进行复杂的数学运算(如三角函数、复数计算、幂运算等),但传统计算器存在以下痛点:

1、表达式支持有限:多数不支持括号嵌套或多函数组合
2、科学函数分散:需要多次点击查找功能按钮
本项目基于鸿蒙NEXT的Web组件能力,结合JavaScript的eval函数,打造支持任意数学表达式的专业计算器。典型使用场景:

// 复数运算
Math.sqrt(-4) * 2 → 4i
// 三角函数组合
Math.sin(Math.PI/2) + Math.cos(0) → 2
// 复杂表达式
(2+3)*Math.pow(2,5)/Math.sqrt(9) → 53.333

【技术实现方案】

1、系统架构设计

采用三层架构模式:
表现层:ArkUI构建可视化界面
逻辑层:Web组件执行JavaScript计算
通信层:JavaScriptProxy实现双向通信

2、关键技术选型

【核心代码解析】

1、通信桥接实现

// 计算服务类
class CalculatorService {
// 结果回调方法
postResult = (result: string) => {
this.context.eventHub.emit('formulaEvaluated', result);
}
} // Web组件配置
Web({
src: $rawfile('eval.html'),
controller: this.webController
})
.javaScriptProxy({
name: "harmonyBridge",
object: this.calculatorService,
methodList: ['postResult']
})

实现要点:
使用javaScriptProxy建立双向通道
通过命名空间harmonyBridge暴露原生方法

2、表达式计算流程

<!-- eval.html -->
<script>
function evaluateExpression(expr) {
try {
const result = eval(expr);
harmonyBridge.postResult(String(result));
} catch (e) {
harmonyBridge.postResult(`错误: ${e.message}`);
}
}
</script>

调用

// 点击计算按钮时
this.webController.runJavaScript(`evaluateExpression('${this.formulaInput}')`);

安全机制:

try-catch包裹eval执行
错误信息统一处理
结果强制转换为字符串

3、输入优化设计

// 智能插入推荐表达式
Text(' Math.sin() ')
.onClick(() => {
const pos = this.inputController.getCaretOffset().index;
this.formulaInput =
this.formulaInput.slice(0, pos) +
' Math.sin() ' +
this.formulaInput.slice(pos);
})

交互亮点:

保留函数参数占位符()
自动维护光标位置

【总结】

本方案创新性地利用鸿蒙Web组件解决了ArkTS无法直接执行动态表达式的难题,主要优势体现在:

功能强大:完整支持JavaScript数学库
体验优秀:开发者友好的输入体验
扩展灵活:模块化架构设计

完整代码已开源:https://gitee.com/zhong-congxu/calculator20250322

鸿蒙NEXT开发案例:程序员计算器的更多相关文章

  1. 【VS开发】程序员对内存的理解

    程序员对内存的理解 在C和C++语言开发中,指针.内存一直是学习的重点.因为C语言作为一种偏底层的中低级语言,提供了大量的内存直接操作的方法,这一方面使程序的灵活度最大化,同时也为bug埋下很多隐患. ...

  2. 0基础入门 docker 部署 各种 Prometheus 案例 - 程序员学点xx 总集篇

    目录 大家好, 学点xx 系列也推出一段时间了.虽然 yann 能力有限,但还是收到了很多鼓励与赞赏.对这个系列 yann 还是很喜欢的,特别是 Prometheus 篇,在期间经历公众号 100 篇 ...

  3. win8找到程序员计算器

    最近想用计算器的十进制和十六进制转化的功能,发现win8没有开始菜单了,从网上查了查,原来指令如此简单,特此做笔记,谨防忘记! 操作:win+r打开运行,输入calc,确定就出来了!

  4. php微信支付(仅pc端扫码支付模式二)详细步骤.----仅适合第一次做微信开发的程序员

    本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/10,所以微信支付 ...

  5. php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员

    本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/2,所以微信支付的 ...

  6. 程序员计算器HEX、EDC、OCT等等的意思

    binary 二进制 对应的是 BINoctal 八进制的  ----   OCThexadecimal 十六进制的  --- HEXdecimal 十进制的  -- DEC

  7. Android开发java程序员常用代码,将字符串以逗号分别取出字符串String

    public class StringSplit { public static void main(String[] args) { String sourceStr = "1,2,3,4 ...

  8. java工具类去掉字符串String中的.点。android开发java程序员常用工具类

    下面是工具类详细代码: package com.qq986945193.david; /** * qq986945193 Project * ============================= ...

  9. 10年.NET老程序员推荐的7个开发类工具

    做.NET软件工作已经10年了,从程序员做 到高级程序员,再到技术主管,技术总监.见证了Visual Studio .NET 2003,Visul Studio 2005, Visual Studio ...

  10. 浅谈入行Qt桌面端开发程序员-从毕业到上岗(1):当我们说到桌面端开发时,我们在谈论什么?

    谈谈我自己 大家好,我是轩先生,是一个刚入行的Qt桌面端开发程序员.我的本科是双非一本的数学专业,22年毕业,只是部分课程与计算机之间有所交叉,其实在我毕业的时候并没有想过会成为一名程序员,也没有想过 ...

随机推荐

  1. C#中串口类SerialPort类的详细用法

    原文链:serialport控件的详细用法

  2. [转]OpenLayer4地图全屏的实现

    第一种方式:自实现 1.首先将地图容器的长宽设置成100%. 2.对form 和body标签长宽设置成100%. 3.对浏览器进行全屏设置. 具体代码如下所示(fullextent 为全屏安全ID.) ...

  3. FreeSWITCH日志功能分析及apr模拟

    操作系统版本:Debian 12.5_x64 FreeSWITCH版本: 1.10.11 apr库版本:apr-1.7.4 & apr-util-1.6.3 gcc版本: 12.2.0   日 ...

  4. SQL优化——深分页&排序

    问题背景 在开发 Web 应用或处理数据库查询时,分页是一项常见需求.然而,当面对深度分页(即页码较大,偏移量较高的分页情况)时,性能问题往往接踵而至.比如对一些需要拉特定的页面查询.范围导出.范围计 ...

  5. 前端之canvas实现电子签约完成线上签署功能

    最近发现现在租房还是签合同,越来越多采用电子签约的方式进行,好处不用多说节约成本,节约时间.抱着好奇的心理,尝试自己动手实现一个电子签.原来并不复杂主要通过了canvas绘画能力进行实现的. 主要功能 ...

  6. c# Progress<T>

    c# Progress<T> 用于显示进度........主要是利用IProgress<T> 的Report(T)方法: private void BtnDownload_Cl ...

  7. 第五章 ReentrantLock源码解析

    最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final Reentrant ...

  8. 单点登录-SSO原理

    为什么需要单点登录 单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任. 单点 ...

  9. CPU 性能优化总结

    在Linux系统中,由于成本的限制,往往会存在资源上的不足,例如 CPU.内存.网络.IO 性能.本文,就对 Linux 进程和 CPU 的原理进行分析,总结出 CPU 性能优化的方法. 1. 分析手 ...

  10. 一个简易socket通信结构

    服务端 基本的结构 工作需要又需要用到socketTCP通讯,这么多年了,终于稍微能写点了.让我说其实也说不出个啥来,看了很多的异步后稍微对异步socket的导流 endreceive后 再begin ...