上个星期的时候,我想教我朋友做一个简单的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://download.csdn.net/detail/huangyanbin123/7842923

转载于:https://www.cnblogs.com/llguanli/p/7072770.html

仿小米简约Calculator相关推荐

  1. Java仿小米计算器源码_仿小米计算器

    [实例简介] 一款仿小米简约的计算器.支持大部分操作,超过10位没有处理,需要的朋友可以改善一下. [实例截图] [核心代码] Calculator └── Calculator ├── Androi ...

  2. Java仿小米计算器源码_xiaomi-Calculator 仿照小米的计算器功能,作为一个Android的初学者可以参考,界面简单大方。 259万源代码下载- www.pudn.com...

    文件名称: xiaomi-Calculator下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 795 KB 上传时间: 2016-06-13 下载次数: 0 提 ...

  3. 简约大气仿小米社区网站风格的WP主题模板

    简介: 国人精仿小米社区WordPress模板:Misq是一小米气概的WordPress博客主题,合用规模广,外表简练年夜气,撑持二级菜单,统计欣赏量,可分享文章到新浪微博,自界说幻灯片等诸多功效. ...

  4. Java项目:仿小米电子产品售卖商城系统(java+SpringBoot+Vue+MySQL+Redis+ElementUI)

    源码获取:博客首页 "资源" 里下载! 项目描述:这是一个基于SpringBoot+Vue框架开发的仿小米电子产品售卖商城系统.首先,这是一个前后端分离的项目,代码简洁规范,注释说 ...

  5. android 日历仿IOS,基于Android week view仿小米和iphone日历效果

    前言 最近由于项目需求,要做一个仿小米日历的功能,下面显示一天的日程,header以周为单位进行滑动,github上找了很久也没有找到合适的,但找到一相近的开源项目Android-week-view, ...

  6. android仿小米日历,实现一个仿小米日历控件

    先看效果图: 效果图 根据效果,我们可以看到,要实现该控件,需要具备: 容器以及触摸事件处理 周日历布局以及选择,切换上下周处理 月日历布局以及选择,切换上下月处理 首先说说容器 对于其他使用者来说, ...

  7. android应用商店代码,仿小米应用商店Android客户端

    前言 项目Github地址:https://github.com/LXD312569496/XiaoMiDemo 仿小米应用商店的实现,目前完成界面显示和基本功能的开发,代码一般般,后面会继续完善代码 ...

  8. 案例:仿小米logo渐变效果练习

    一.效果: 仿小米logo 二.布局思路 三.代码: 代码如下(示例): <!DOCTYPE html> <html lang="en"><head& ...

  9. Android 11.0 自定义仿小米全面屏手势导航左右手势滑动返回UI效果

    目录 1.概述 2.自定义仿小米全面屏手势导航返回ui布局的核心代码 3.自定义左右手势返回UI样式的核心代码功能分析 3.1 NavigationBarView手势导航布局左右手势返回的相关代码 3 ...

最新文章

  1. Second day in Jumei
  2. 简单自学机器学习理论——正则化和偏置方差的权衡 (Part III )
  3. the enigma x64_【一期】什么是x64、x86,它们有什么区别?
  4. 电商扣减库存_电商平台仓库管理系统究竟有何功能?
  5. RTX5 | 线程管理03 - 线程退出osThreadExit
  6. Java虚拟机-垃圾回收简介
  7. 算法(七):图解动态规划
  8. 使用全备+binlog日志恢复数据库
  9. 设计模式综和实战项目x-gen系列一
  10. matlab 取点画图,matlab如何画图
  11. PSI_压力阻塞信息
  12. python之动态性
  13. matlab实现密堆立方体,LAMMPS如何定义六角密堆结构HCP
  14. 游戏环境公示及处罚名单9月18日
  15. 【15】Vue:02-Vue表单基本操作、表单修饰符、自定义指令、计算属性computed、侦听器watch、过滤器、生命周期、数组变异方法、替换数组、动态数组响应数据、图书列表案例、TODOS案例
  16. 以太网接口与地平面设计3种方案
  17. 【已解决】Unknown error 1146
  18. 利用python声音处理库librosa提取声音信号的mfcc特征及特征融合
  19. 如何从iCloud中下载元气骑士存档
  20. 音乐人工智能与音乐信息科技SCI期刊列表及影响因子

热门文章

  1. 身份证号码有效性检测算法 ( js版 转 .net版 )
  2. Playing Video on iPhone Cocos2D-X
  3. 20181110-软件开发架构2
  4. bzoj 2326: [HNOI2011]数学作业
  5. keyset(),entryset() 遍历 (转)
  6. 基本概念之dos和cmd的区别
  7. 对付惰性必杀:(10+2)*5法
  8. android Merger 代替 FrameLayout:布局优化
  9. 如何安装fedora13的显卡驱动
  10. 用模板来进行类型检查。