当前位置:首页>编程日记>正文

仿小米简约Calculator

     上个星期的时候,我想教我朋友做一个简单的app。想来想去教什么比較好。当时看见小米的计算器认为比較美丽,就想这个简单。然后就開始动手做了。我以为能够一个小时能够搞定。没想到花了快一天的时间。

哎。突然想起曾经公司的CTO的话,一切都是从简单開始的。



       我自己的思路是:将计算器的item分为:integer,float,运算符,用list去存储。

然后我通过标记上一次输入的标记。推断它是否该插入list还是拿到last改动。然后依据先遍历高级运算,得到结果,将i-1设置为得到的结果。移除i+1,i。

再遍历低级运算,最后得到list(0)就是所须要的结果。当然,肯定须要非常多推断之类,由于demo的原因,我没有再去改善它。由于这个毕竟是我个人思路,假设有哪位朋友有更好的想法,能够给我留言。


1.输入的model

package com.example.calculator;public class InputItem {private String input;private int type;public InputItem() {super();}public InputItem(String input, int type) {super();this.input = input;this.type = type;}public String getInput() {return input;}public void setInput(String input) {this.input = input;}public int getType() {return type;}public void setType(int type) {this.type = type;}interface InputType {public static final int INT_TYPE = 0; //int 类型public static final int DOUBLE_TYPE=1; //double 类型public static final int OPERATOR_TYPE = 2; //操作符类型public static final int ERROR = 3; //操作符类型}@Overridepublic String toString() {return "InputItem [input=" + input + ", type=" + type + "]";}}


2.逻辑运算

package com.example.calculator;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import com.example.calculator.InputItem.InputType;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.annotation.SuppressLint;
import android.app.Activity;import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener{private TextView mShowResultTv;  //显示结果private TextView mShowInputTv;   //显示输入的字符private Button mCBtn;private Button mDelBtn;private Button mAddBtn;private Button mSubBtn;private Button mMultiplyBtn;private Button mDividebtn;private Button mZeroButton;private Button mOnebtn;private Button mTwoBtn;private Button mThreeBtn;private Button mFourBtn;private Button mFiveBtn;private Button mSixBtn;private Button mSevenBtn;private Button mEightBtn;private Button mNineBtn;private Button mPointtn;private Button mEqualBtn;private HashMap<View,String> map; //将View和String映射起来 private List<InputItem> mInputList; //定义记录每次输入的数private int mLastInputstatus = INPUT_NUMBER; //记录上一次输入状态public static final int INPUT_NUMBER = 1; public static final int INPUT_POINT = 0;public static final int INPUT_OPERATOR = -1;public static final int END = -2;public static final int ERROR= -3;public static final int SHOW_RESULT_DATA = 1;public static final String nan = "NaN";public static final String infinite = "∞";@SuppressLint("HandlerLeak")private Handler mHandler = new Handler(){public void handleMessage(Message msg) {if(msg.what == SHOW_RESULT_DATA){mShowResultTv.setText(mShowInputTv.getText());mShowInputTv.setText(mInputList.get(0).getInput());clearScreen(mInputList.get(0));}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView(); initData(); }/*** 初始化view*/private void initView() {mShowResultTv = (TextView) this.findViewById(R.id.show_result_tv);mShowInputTv = (TextView)this.findViewById(R.id.show_input_tv);mCBtn = (Button)this.findViewById(R.id.c_btn);mDelBtn= (Button)this.findViewById(R.id.del_btn);mAddBtn= (Button)this.findViewById(R.id.add_btn);mMultiplyBtn= (Button)this.findViewById(R.id.multiply_btn);mDividebtn= (Button)this.findViewById(R.id.divide_btn);mZeroButton = (Button)this.findViewById(R.id.zero_btn);mOnebtn= (Button)this.findViewById(R.id.one_btn);mTwoBtn= (Button)this.findViewById(R.id.two_btn);mThreeBtn= (Button)this.findViewById(R.id.three_btn);mFourBtn= (Button)this.findViewById(R.id.four_btn);mFiveBtn= (Button)this.findViewById(R.id.five_btn);mSixBtn= (Button)this.findViewById(R.id.six_btn);mSevenBtn= (Button)this.findViewById(R.id.seven_btn);mEightBtn= (Button)this.findViewById(R.id.eight_btn);mNineBtn= (Button)this.findViewById(R.id.nine_btn);mPointtn= (Button)this.findViewById(R.id.point_btn);mEqualBtn= (Button)this.findViewById(R.id.equal_btn);mSubBtn = (Button)this.findViewById(R.id.sub_btn);setOnClickListener();//调用监听事件}/*** 初始化数据*/private void initData() {if(map == null)map = new HashMap<View, String>();map.put(mAddBtn,getResources().getString(R.string.add));map.put(mMultiplyBtn,getResources().getString(R.string.multply));map.put(mDividebtn,getResources().getString(R.string.divide));map.put(mSubBtn, getResources().getString(R.string.sub));map.put(mZeroButton ,getResources().getString(R.string.zero));map.put(mOnebtn,getResources().getString(R.string.one));map.put(mTwoBtn,getResources().getString(R.string.two));map.put(mThreeBtn,getResources().getString(R.string.three));map.put(mFourBtn,getResources().getString(R.string.four));map.put(mFiveBtn,getResources().getString(R.string.five));map.put(mSixBtn,getResources().getString(R.string.six));map.put(mSevenBtn,getResources().getString(R.string.seven));map.put(mEightBtn,getResources().getString(R.string.eight));map.put(mNineBtn,getResources().getString(R.string.nine));map.put(mPointtn,getResources().getString(R.string.point));map.put(mEqualBtn,getResources().getString(R.string.equal));mInputList = new ArrayList<InputItem>();mShowResultTv.setText("");clearAllScreen();}/*** 设置监听事件*/private void setOnClickListener() {mCBtn.setOnClickListener(this);mDelBtn.setOnClickListener(this);mAddBtn.setOnClickListener(this);mMultiplyBtn.setOnClickListener(this);mDividebtn.setOnClickListener(this);mSubBtn.setOnClickListener(this);mZeroButton.setOnClickListener(this);mOnebtn.setOnClickListener(this);mTwoBtn.setOnClickListener(this);mThreeBtn.setOnClickListener(this);mFourBtn.setOnClickListener(this);mFiveBtn.setOnClickListener(this);mSixBtn.setOnClickListener(this);mSevenBtn.setOnClickListener(this);mEightBtn.setOnClickListener(this);mNineBtn.setOnClickListener(this);mPointtn.setOnClickListener(this);mEqualBtn.setOnClickListener(this);}/*** 点击事件*/@Overridepublic void onClick(View arg0) {switch (arg0.getId()) {case R.id.c_btn:clearAllScreen();break;case R.id.del_btn:back();break;case R.id.point_btn:inputPoint(arg0);break;case R.id.equal_btn:operator();break;case R.id.add_btn:case R.id.sub_btn:case R.id.multiply_btn:case R.id.divide_btn:inputOperator(arg0);break;default:inputNumber(arg0);break;}}/*** 点击=之后開始运算*/private void operator() {if(mLastInputstatus == END ||mLastInputstatus == ERROR || mLastInputstatus == INPUT_OPERATOR|| mInputList.size()==1){return;}mShowResultTv.setText("");startAnim();findHighOperator(0);if(mLastInputstatus != ERROR){findLowOperator(0);}mHandler.sendMessageDelayed(mHandler.obtainMessage(SHOW_RESULT_DATA), 300);}private void startAnim(){mShowInputTv.setText(mShowInputTv.getText()+getResources().getString(R.string.equal));Animation anim = AnimationUtils.loadAnimation(this, R.anim.screen_anim);mShowInputTv.startAnimation(anim);}/*** 输入点* @param view*/private void inputPoint(View view) {if(mLastInputstatus == INPUT_POINT){return;}if(mLastInputstatus == END || mLastInputstatus == ERROR){clearInputScreen();}String key = map.get(view);String input = mShowInputTv.getText().toString();if(mLastInputstatus == INPUT_OPERATOR){input = input+"0";} mShowInputTv.setText(input+key);addInputList(INPUT_POINT, key);}/*** 输入数字* @param view*/private void inputNumber(View view){if(mLastInputstatus == END || mLastInputstatus == ERROR){clearInputScreen();}String key = map.get(view);if("0".equals(mShowInputTv.getText().toString())){mShowInputTv.setText(key);}else{mShowInputTv.setText(mShowInputTv.getText() + key);}addInputList(INPUT_NUMBER, key);}/*** 输入运算符* @param view*/private void inputOperator(View view) {if(mLastInputstatus == INPUT_OPERATOR || mLastInputstatus == ERROR){return;}if(mLastInputstatus == END){mLastInputstatus = INPUT_NUMBER;}String key = map.get(view);if("0".equals(mShowInputTv.getText().toString())){mShowInputTv.setText("0"+key);mInputList.set(0,new InputItem("0",InputItem.InputType.INT_TYPE));}else{mShowInputTv.setText(mShowInputTv.getText() + key);}addInputList(INPUT_OPERATOR, key);}/*** 回退操作*/private void back() {if(mLastInputstatus == ERROR){clearInputScreen();}String str = mShowInputTv.getText().toString();if(str.length() != 1){mShowInputTv.setText(str.substring(0, str.length()-1));backList();}else{mShowInputTv.setText(getResources().getString(R.string.zero));clearScreen(new InputItem("",InputItem.InputType.INT_TYPE));}}/*** 回退InputList操作*/private void backList() {InputItem item = mInputList.get(mInputList.size() - 1);if (item.getType() == InputItem.InputType.INT_TYPE) {//获取到最后一个item,并去掉最后一个字符String input = item.getInput().substring(0,item.getInput().length() - 1);//假设截完了,则移除这个item,并将当前状态改为运算操作符if ("".equals(input)) {mInputList.remove(item);mLastInputstatus = INPUT_OPERATOR;} else {//否则设置item为截取完的字符串。并将当前状态改为numberitem.setInput(input);mLastInputstatus = INPUT_NUMBER;}//假设item是运算操作符 则移除。} else if (item.getType() == InputItem.InputType.OPERATOR_TYPE) {mInputList.remove(item);if (mInputList.get(mInputList.size() - 1).getType() == InputItem.InputType.INT_TYPE) {mLastInputstatus = INPUT_NUMBER;} else {mLastInputstatus = INPUT_POINT;}//假设当前item是小数} else {String input = item.getInput().substring(0,item.getInput().length() - 1);if ("".equals(input)) {mInputList.remove(item);mLastInputstatus = INPUT_OPERATOR;} else {if (input.contains(".")) {item.setInput(input);mLastInputstatus = INPUT_POINT;} else {item.setInput(input);mLastInputstatus = INPUT_NUMBER;}}}}//清理屏private void clearAllScreen() {clearResultScreen();clearInputScreen();}private void clearResultScreen(){mShowResultTv.setText("");}private void clearInputScreen() {mShowInputTv.setText(getResources().getString(R.string.zero));mLastInputstatus = INPUT_NUMBER;mInputList.clear();mInputList.add(new InputItem("", InputItem.InputType.INT_TYPE));}//计算完毕private void clearScreen(InputItem item) {if(mLastInputstatus != ERROR){mLastInputstatus = END;}mInputList.clear();mInputList.add(item);}//实现高级运算public int findHighOperator(int index) {if (mInputList.size() > 1 && index >= 0 && index < mInputList.size())for (int i = index; i < mInputList.size(); i++) {InputItem item = mInputList.get(i);if (getResources().getString(R.string.divide).equals(item.getInput())|| getResources().getString(R.string.multply).equals(item.getInput())) {int a,b; double c,d;if(mInputList.get(i - 1).getType() == InputItem.InputType.INT_TYPE){a = Integer.parseInt(mInputList.get(i - 1).getInput());if(mInputList.get(i + 1).getType() == InputItem.InputType.INT_TYPE){b = Integer.parseInt(mInputList.get(i + 1).getInput());if(getResources().getString(R.string.multply).equals(item.getInput())){mInputList.set(i - 1,new InputItem( String.valueOf(a * b),InputItem.InputType.INT_TYPE));}else{if(b == 0){mLastInputstatus = ERROR;if(a==0){clearScreen(new InputItem(nan,InputType.ERROR));}else{clearScreen(new InputItem(infinite,InputType.ERROR));}return -1;}else if(a % b != 0){mInputList.set(i - 1,new InputItem(String.valueOf((double)a / b),InputItem.InputType.DOUBLE_TYPE));}else{mInputList.set(i - 1,new InputItem(String.valueOf((Integer)a / b),InputItem.InputType.INT_TYPE));}}}else{d = Double.parseDouble(mInputList.get(i + 1).getInput());if(getResources().getString(R.string.multply).equals(item.getInput())){mInputList.set(i - 1,new InputItem( String.valueOf(a * d),InputItem.InputType.DOUBLE_TYPE));}else{if(d == 0){mLastInputstatus = ERROR;if(a==0){clearScreen(new InputItem(nan,InputType.ERROR));}else{clearScreen(new InputItem(infinite,InputType.ERROR));}return -1;}mInputList.set(i - 1,new InputItem(String.valueOf(a / d),InputItem.InputType.DOUBLE_TYPE));	}}}else{c = Double.parseDouble(mInputList.get(i-1).getInput());if(mInputList.get(i + 1).getType() == InputItem.InputType.INT_TYPE){b = Integer.parseInt(mInputList.get(i + 1).getInput());if(getResources().getString(R.string.multply).equals(item.getInput())){mInputList.set(i - 1,new InputItem( String.valueOf(c* b),InputItem.InputType.DOUBLE_TYPE));}else{if(b== 0){mLastInputstatus = ERROR;if(c==0){clearScreen(new InputItem(nan,InputType.ERROR));}else{clearScreen(new InputItem(infinite,InputType.ERROR));}return -1;}mInputList.set(i - 1,new InputItem(String.valueOf(c / b),InputItem.InputType.DOUBLE_TYPE));	}}else{d = Double.parseDouble(mInputList.get(i + 1).getInput());if(getResources().getString(R.string.multply).equals(item.getInput())){mInputList.set(i - 1,new InputItem( String.valueOf(mul(c,d)),InputItem.InputType.DOUBLE_TYPE));}else{if(d == 0){mLastInputstatus = ERROR;if(c==0){clearScreen(new InputItem(nan,InputType.ERROR));}else{clearScreen(new InputItem(infinite,InputType.ERROR));}return -1;}mInputList.set(i - 1,new InputItem(String.valueOf(div(c, d)),InputItem.InputType.DOUBLE_TYPE));	}}}mInputList.remove(i + 1);mInputList.remove(i);return findHighOperator(i);}}return -1;}public int findLowOperator(int index) {if (mInputList.size()>1 && index >= 0 && index < mInputList.size())for (int i = index; i < mInputList.size(); i++) {InputItem item = mInputList.get(i);if (getResources().getString(R.string.sub).equals(item.getInput())|| getResources().getString(R.string.add).equals(item.getInput())) {int a,b; double c,d;if(mInputList.get(i - 1).getType() == InputItem.InputType.INT_TYPE){a = Integer.parseInt(mInputList.get(i - 1).getInput());if(mInputList.get(i + 1).getType() == InputItem.InputType.INT_TYPE){b = Integer.parseInt(mInputList.get(i + 1).getInput());if(getResources().getString(R.string.add).equals(item.getInput())){mInputList.set(i - 1,new InputItem( String.valueOf(a + b),InputItem.InputType.INT_TYPE));}else{mInputList.set(i - 1,new InputItem(String.valueOf(a - b),InputItem.InputType.INT_TYPE));	}}else{d = Double.parseDouble(mInputList.get(i + 1).getInput());if(getResources().getString(R.string.add).equals(item.getInput())){mInputList.set(i - 1,new InputItem( String.valueOf(a + d),InputItem.InputType.DOUBLE_TYPE));}else{mInputList.set(i - 1,new InputItem(String.valueOf(a - d),InputItem.InputType.DOUBLE_TYPE));	}}}else{c = Double.parseDouble(mInputList.get(i-1).getInput());if(mInputList.get(i + 1).getType() == InputItem.InputType.INT_TYPE){b = Integer.parseInt(mInputList.get(i + 1).getInput());if(getResources().getString(R.string.add).equals(item.getInput())){mInputList.set(i - 1,new InputItem( String.valueOf(c + b),InputItem.InputType.DOUBLE_TYPE));}else{mInputList.set(i - 1,new InputItem(String.valueOf(c - b),InputItem.InputType.DOUBLE_TYPE));	}}else{d = Double.parseDouble(mInputList.get(i + 1).getInput());if(getResources().getString(R.string.add).equals(item.getInput())){mInputList.set(i - 1,new InputItem( String.valueOf(add(c, d)),InputItem.InputType.DOUBLE_TYPE));}else{mInputList.set(i - 1,new InputItem(String.valueOf(sub(c,d)),InputItem.InputType.DOUBLE_TYPE));	}}}mInputList.remove(i + 1);mInputList.remove(i);return findLowOperator(i);}}return -1;}//currentStatus 当前状态  9  "9" "+"void addInputList(int currentStatus,String inputChar){switch (currentStatus) {case INPUT_NUMBER:if(mLastInputstatus == INPUT_NUMBER){InputItem item = (InputItem)mInputList.get(mInputList.size()-1);item.setInput(item.getInput()+inputChar);item.setType(InputItem.InputType.INT_TYPE);mLastInputstatus = INPUT_NUMBER;}else if(mLastInputstatus == INPUT_OPERATOR){InputItem item = new InputItem(inputChar, InputItem.InputType.INT_TYPE);mInputList.add(item);mLastInputstatus = INPUT_NUMBER;}else if(mLastInputstatus == INPUT_POINT){InputItem item = (InputItem)mInputList.get(mInputList.size()-1);item.setInput(item.getInput()+inputChar);item.setType(InputItem.InputType.DOUBLE_TYPE);mLastInputstatus = INPUT_POINT;}break;case INPUT_OPERATOR:InputItem item = new InputItem(inputChar, InputItem.InputType.OPERATOR_TYPE);mInputList.add(item);mLastInputstatus = INPUT_OPERATOR;break;case INPUT_POINT://pointif(mLastInputstatus == INPUT_OPERATOR){InputItem item1 =  new InputItem("0"+inputChar,InputItem.InputType.DOUBLE_TYPE);mInputList.add(item1); mLastInputstatus = INPUT_POINT;}else{InputItem item1 = (InputItem)mInputList.get(mInputList.size()-1);item1.setInput(item1.getInput()+inputChar);item1.setType(InputItem.InputType.DOUBLE_TYPE);mLastInputstatus = INPUT_POINT;}break;}}public static Double div(Double v1,Double v2){BigDecimal b1 = new BigDecimal(v1.toString());BigDecimal b2 = new BigDecimal(v2.toString());return b1.divide(b2,10,BigDecimal.ROUND_HALF_UP).doubleValue();}public static Double sub(Double v1,Double v2){BigDecimal b1 = new BigDecimal(v1.toString());BigDecimal b2 = new BigDecimal(v2.toString());return b1.subtract(b2).doubleValue();}public static Double add(Double v1,Double v2){BigDecimal b1 = new BigDecimal(v1.toString());BigDecimal b2 = new BigDecimal(v2.toString());return b1.add(b2).doubleValue();}public static Double mul(Double v1,Double v2){BigDecimal b1 = new BigDecimal(v1.toString());BigDecimal b2 = new BigDecimal(v2.toString());return b1.multiply(b2).doubleValue();}
}


http://www.coolblog.cn/news/40a16d300ce891e9.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐