0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开发一个鸿蒙版仿苹果计算器教程.附代码

OpenHarmony威廉希尔官方网站 社区 来源:鸿蒙威廉希尔官方网站 社区 作者: 我曾是少年_ 2021-10-11 14:17 次阅读

众所周知鸿蒙 JS 框架是非常轻量级的 MVVM 模式。通过使用和 Vue2 相似的属性劫持威廉希尔官方网站 实现了响应式系统。

学习鸿蒙很长时间了,想写一个 demo 进行练练手,就选择开发这个仿苹果计算器程序。

先看效果图:

23715caa-2a47-11ec-82a8-dac502259ad0.gif

2390ea70-2a47-11ec-82a8-dac502259ad0.gif

话不多说,上代码

hml:
<divclass="container">
<divclass="header">
<textclass="{{outputClassName}}">{{output}}text>
div>
<divclass="keyboard">
<blockfor="{{keyArr}}">
<divif="{{$item=='0'}}"class="zeroKeys"onclick="onclickNubmer({{$item}})">
<text>
{{$item}}
text>
div>
<divelif="{{$item=='AC'||$item=='+/-'||$item=='%'}}"class="operatorKeys-top"onclick="onclickOper({{$item}})">
<text>
{{$item}}
text>
div>
<divelif="{{$item=='÷'||$item=='×'||$item=='-'||$item=='+'||$item=='='}}"class="operatorKeys-right"onclick="onclickOper({{$item}})">
<text>
{{$item}}
text>
div>
<divelseclass="keyskeys-nubmer"onclick="onclickNubmer({{$item}})">
<text>
{{$item}}
text>
div>
block>
div>
div>

css:

.container{
flex-direction:column;
background-color:#010101;
height:100%;
width:100%;
}

.header{
height:36%;
width:100%;
align-items:flex-end;
padding:2px20px2px10px;
}
.keyboard{
height:64%;
width:100%;
padding:2px10px;
flex-wrap:wrap;
}
.outputText,.outputTextSmall{
width:100%;
height:100px;
color:#FFFFFF;
text-align:end;
}
.outputText{
font-size:80px;
}
.outputTextSmall{
font-size:58px;
}
.keys,.zeroKeys,.operatorKeys-top,.operatorKeys-right{
width:74px;
height:74px;
justify-content:center;
align-items:center;
border-radius:74px;
margin:10px5px;
}
.keys-nubmer,.zeroKeys{
background-color:#333333;
}
.zeroKeys{
width:158px;
}
.operatorKeys-top{
background-color:#a4a4a4;
}
.operatorKeys-right{
background-color:#f79f31;
}
.keys:active,.zeroKeys:active{
background-color:#737373;
}
.keystext,.zeroKeystext,.operatorKeys-righttext{
font-size:42px;
color:#FFFFFF;
}
.operatorKeys-toptext{
font-size:36px;
color:#010101;
}
.operatorKeys-top:active{
background-color:#d9d9d9;
}
.operatorKeys-right:active{
background-color:#f5c891;
}

js:

import{math}from"../../common/js/utils.js";
exportdefault{
data:{
output:"0",
outputClassName:"outputText",
cache:[],//记录输入内容
keyArr:["AC","+/-","%","÷","7","8","9","×","4","5","6","-","1","2","3","+","0",".","="],
reOper:"",//记录点击的运算符
reStr1:"",//记录第一次输入内容
reStr2:"",//记录点击运算符后的内容
bool:false//防止第二次输入内容时内容清空
},
onInit(){
this.$watch("output","watchOutPut")
},
onclickOper(item){
if(item=="AC"){
this.clearComput();
}elseif(item=="+"||item=="-"||item=="×"||item=="÷"){
this.reOper=item;
this.reStr1=this.output;
if(this.cache.length>0){
this.startCompute();
}
this.cache.push(this.reStr1);
}elseif(item=="+/-"){
this.output="-"+this.output;
}elseif(item=="%"){
this.output=math.accDiv(this.output,100);
}elseif(item=="="){
this.reStr2=this.output;
this.cache.push(this.reStr2);
this.startCompute();
}
},
onclickNubmer(item){
if(this.cache.length>0&&!this.bool){
this.output="0";
this.bool=true;
}
if(this.output=="0"&&item!="."){
this.output=item;
}elseif(item=="."){
if(this.output.indexOf(".")==-1){
if(this.output=="0"){
this.output="0."
}else{
this.output+=item;
}
}
}else{
if(this.output.length< 10){
this.output+=item;
}
}
},
watchOutPut(nVal){
if(nVal.length>7&&nVal.length< 10){
this.outputClassName="outputTextSmall";
}else{
this.outputClassName="outputText";
}
},
startCompute(){
switch(this.reOper){
case"+":
this.output=math.accAdd(this.reStr1,this.reStr2);
this.reStr1=this.output;
break;
case"-":
this.output=math.accSub(this.reStr1,this.reStr2);
this.reStr1=this.output;
break;
case"×":
this.output=math.accMul(this.reStr1,this.reStr2);
this.reStr1=this.output;
break;
case"÷":
this.output=math.accDiv(this.reStr1,this.reStr2);
this.reStr1=this.output;
break;
default:
break;
}
},
clearComput(){
this.output="0";
this.reOper="";
this.reStr1="";
this.reStr2="";
this.cache=[];
this.bool=false;
}
}

utils.js:

classMathCalss{
//js精准除法函数
accDiv(arg1,arg2){
lett1=0,
t2=0,
r1,
r2;
try{
t1=arg1.toString().split('.')[1].length;
}catch(e){}
try{
t2=arg2.toString().split('.')[1].length;
}catch(e){}
r1=Number(arg1.toString().replace('.',''));
r2=Number(arg2.toString().replace('.',''));
return(r1/r2)*Math.pow(10,t2-t1);
}

//js精准加法函数
accAdd(arg1,arg2){
varr1,r2,m,c;
try{
r1=arg1.toString().split(".")[1].length;
}
catch(e){
r1=0;
}
try{
r2=arg2.toString().split(".")[1].length;
}
catch(e){
r2=0;
}
c=Math.abs(r1-r2);
m=Math.pow(10,Math.max(r1,r2));
if(c>0){
varcm=Math.pow(10,c);
if(r1>r2){
arg1=Number(arg1.toString().replace(".",""));
arg2=Number(arg2.toString().replace(".",""))*cm;
}else{
arg1=Number(arg1.toString().replace(".",""))*cm;
arg2=Number(arg2.toString().replace(".",""));
}
}else{
arg1=Number(arg1.toString().replace(".",""));
arg2=Number(arg2.toString().replace(".",""));
}
return(arg1+arg2)/m;
}
//js精准减法函数
accSub(arg1,arg2){
letr1,r2,m,n;
try{
r1=arg1.toString().split('.')[1].length;
}catch(e){
r1=0;
}
try{
r2=arg2.toString().split('.')[1].length;
}catch(e){
r2=0;
}
m=Math.pow(10,Math.max(r1,r2));
//动态控制精度长度
n=r1>=r2?r1:r2;
return(arg1*m-arg2*m)/m;
}
//js精准乘法函数
accMul(arg1,arg2){
varm=0,s1=arg1.toString(),s2=arg2.toString();
try{
m+=s1.split(".")[1].length;
}
catch(e){
}
try{
m+=s2.split(".")[1].length;
}
catch(e){
}
returnNumber(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
}
}

exportvarmath=newMathCalss();

为了解决浮点数计算失准问题,我使用一些解决计算失准的函数可供大家参考。
编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62588
  • 代码
    +关注

    关注

    30

    文章

    4786

    浏览量

    68557
  • CSS
    CSS
    +关注

    关注

    0

    文章

    109

    浏览量

    14372
  • 鸿蒙
    +关注

    关注

    57

    文章

    2348

    浏览量

    42830

原文标题:开发一个鸿蒙版仿苹果计算器

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony威廉希尔官方网站 社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LP光纤模式计算器

    :渐变折射率 (GRIN) 光纤 光纤模式计算器允许定义线性偏振贝塞尔模式和线性偏振拉盖尔模式。 对于 GRIN 光纤,定义了梯度常数。 然后通过下式计算折射率 与前种情况样,
    发表于 12-18 13:36

    基于FPGA的计算器设计

    本文通过FPGA实现8位十进制数的加、减、乘、除运算,通过矩阵键盘输入数据和运算符,矩阵键盘的布局图如下所示。该计算器可以进行连续运算,当按下等号后,可以直接按数字进行下次运算,或者按运算符,把上次运算结果作为本次运算的第一个操作数。
    的头像 发表于 10-24 14:28 567次阅读
    基于FPGA的<b class='flag-5'>计算器</b>设计

    CAN位时序参数计算器

    电子发烧友网站提供《CAN位时序参数计算器.pdf》资料免费下载
    发表于 10-11 09:55 1次下载
    CAN位时序参数<b class='flag-5'>计算器</b>

    色环电阻计算器的研究与应用

    理想的色环电阻计算器的界面应该包含颜色选择,让用户能够通过点击或下拉菜单选择各个颜色环
    的头像 发表于 09-18 13:45 317次阅读

    平平无奇计算器:520能对你说多少次?

    5月是爱人爱己爱劳动的月份刚刚过去的5月20日小满遇见520,人生小满胜万全情侣们说“爱意恰逢其时”计算器对小白说“520”……哒哒哒本期测评产品为:简易计算器
    的头像 发表于 05-25 08:04 619次阅读
    平平无奇<b class='flag-5'>计算器</b>:520能对你说多少次?

    HarmonyOS开发案例:【计算器

    基于基础组件、容器组件,实现支持加减乘除混合运算的计算器
    的头像 发表于 05-07 15:31 1383次阅读
    HarmonyOS<b class='flag-5'>开发</b>案例:【<b class='flag-5'>计算器</b>】

    苹果将为iPad推出原生计算器应用

    早前,IT之家曾披露,此次苹果还计划对macOS系统内的计算器应用进行功能升级,这是该软件近10年来的首次重大设计变革。据悉,苹果正在内部测试款名为“GreyParrot”的全新
    的头像 发表于 04-24 14:10 448次阅读

    OpenHarmony开发案例:【分布式计算器

    使用分布式能力实现了简单的计算器应用,可以进行简单的数值计算,支持远程拉起另一个设备的计算器
    的头像 发表于 04-11 15:24 1038次阅读
    OpenHarmony<b class='flag-5'>开发</b>案例:【分布式<b class='flag-5'>计算器</b>】

    AWTK 开源串口屏开发(13) - 计算器应用

    计算器常见的应用程序,在AWTK串口屏中,利用fscript表达式计算函数,无需编写行传统的代码
    的头像 发表于 03-16 08:23 5321次阅读
    AWTK 开源串口屏<b class='flag-5'>开发</b>(13) - <b class='flag-5'>计算器</b>应用

    使用 Taro 开发鸿蒙原生应用 —— 快速上手,鸿蒙应用开发指南

    鸿蒙原生应用。 在 《使用 Taro 开发鸿蒙原生应用》 系列文章中,我们已经介绍了 鸿蒙的基本概念 和 Taro 适配鸿蒙的原理。本文作
    的头像 发表于 02-02 16:09 871次阅读
    使用 Taro <b class='flag-5'>开发</b><b class='flag-5'>鸿蒙</b>原生应用 —— 快速上手,<b class='flag-5'>鸿蒙</b>应用<b class='flag-5'>开发</b>指南

    鸿蒙开发用什么语言?

    两种开发方向 我们常说鸿蒙开发,但是其实鸿蒙开发分为两方向:
    的头像 发表于 01-30 16:12 1534次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>开发</b>用什么语言?

    基于51单片机的计算器设计

    电子发烧友网站提供《基于51单片机的计算器设计.rar》资料免费下载
    发表于 01-12 09:17 39次下载

    鸿蒙开发南向环境搭建教学

    南向开发环境搭建教学,更多鸿蒙开发资料可以前往高清完整版 《鸿蒙开发4.0基础-高阶文档》找保存。(
    发表于 01-05 16:38

    基于51单片机的计算器设计

    电子发烧友网站提供《基于51单片机的计算器设计.rar》资料免费下载
    发表于 01-03 11:33 21次下载

    基于51单片机的简易计算器设计

    基于51单片机的简易计算器设计(实物)
    发表于 01-02 10:02 41次下载