android studio 项目 :UI设计高精度实现简单计算器

作者:wow_awsl_qwq 时间:2022-07-14 02:09:29 

UI设计:

实验目的:

自主完成一个简单APP的设计工作,综合应用已经学到的Android UI设计技巧,重点注意合理使用布局。
实验要求:

  • 1.完成一个计算器的设计,可以以手机自带的计算器为参考。设计过程中,注意考虑界面的美观性,不同机型的适应性,以及功能的完备性。

  • 2.注意结合Activity的生命周期,考虑不同情况下计算器的界面状态。

  • 3.如有余力,可以考虑实现一个高精度科学计算型的计算器。

实现效果:

整数和浮点数的加减乘除、取余、开根号,异号、清零 计算结果全部实现。

精度保留到小数点后100位,比如下面是√3的计算结果。(可以自行修改精度)

android studio 项目 :UI设计高精度实现简单计算器

完全满足日常使用,可以取代手机自带的计算器软件。。。

android studio 项目 :UI设计高精度实现简单计算器

程序主要包含Mainactivity.javaCalculator.java activity_main.xml三个文件,分别用于控制、逻辑和视图。符合MVC框架。

文件结构:

android studio 项目 :UI设计高精度实现简单计算器

代码:

MainActivity.java


package com.example.calculator;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

TextView textView1,textView2,textView_op,textView_res;
   Calculator calculator;

@Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

textView1=(TextView) findViewById(R.id.textview_num1);
       textView2=(TextView)findViewById(R.id.textview_num2);
       textView_op=(TextView)findViewById(R.id.textview_op);
       textView_res=(TextView)findViewById(R.id.textview_res);

Button t_C=(Button) findViewById(R.id.C);
       Button t_genhao=(Button) findViewById(R.id.genhao);
       Button t_quyu=(Button) findViewById(R.id.quyu);
       Button t_add=(Button) findViewById(R.id.add);

Button t_num7=(Button) findViewById(R.id.num7);
       Button t_num8=(Button) findViewById(R.id.num8);
       Button t_num9=(Button) findViewById(R.id.num9);
       Button t_sub=(Button) findViewById(R.id.sub);

Button t_num4=(Button) findViewById(R.id.num4);
       Button t_num5=(Button) findViewById(R.id.num5);
       Button t_num6=(Button) findViewById(R.id.num6);
       Button t_xinghao=(Button) findViewById(R.id.xinghao);

Button t_num1=(Button) findViewById(R.id.num1);
       Button t_num2=(Button) findViewById(R.id.num2);
       Button t_num3=(Button) findViewById(R.id.num3);
       Button t_chuhao=(Button) findViewById(R.id.chuhao);

Button t_jiahuojian=(Button) findViewById(R.id.jiahuojian);
       Button t_num0=(Button) findViewById(R.id.num0);
       Button t_dian=(Button) findViewById(R.id.dian);
       Button t_denhao=(Button) findViewById(R.id.denhao);

calculator=new Calculator();

View.OnClickListener buttonlistener=new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               String show=((Button)view).getText().toString();
               calculator.process(show);
               textView1.setText(calculator.getSnum1());
               textView_op.setText(calculator.getSop());
               textView2.setText(calculator.getSnum2());
               textView_res.setText(calculator.getSres());
           }
       };
       t_num0.setOnClickListener(buttonlistener);
       t_num1.setOnClickListener(buttonlistener);
       t_num2.setOnClickListener(buttonlistener);
       t_num3.setOnClickListener(buttonlistener);
       t_num4.setOnClickListener(buttonlistener);
       t_num5.setOnClickListener(buttonlistener);
       t_num6.setOnClickListener(buttonlistener);
       t_num7.setOnClickListener(buttonlistener);
       t_num8.setOnClickListener(buttonlistener);
       t_num9.setOnClickListener(buttonlistener);

t_C.setOnClickListener(buttonlistener);
       t_genhao.setOnClickListener(buttonlistener);
       t_quyu.setOnClickListener(buttonlistener);
       t_jiahuojian.setOnClickListener(buttonlistener);

t_add.setOnClickListener(buttonlistener);
       t_sub.setOnClickListener(buttonlistener);
       t_xinghao.setOnClickListener(buttonlistener);
       t_chuhao.setOnClickListener(buttonlistener);

t_dian.setOnClickListener(buttonlistener);
       t_denhao.setOnClickListener(buttonlistener);

}

Calculator.java

package com.example.calculator;

import static java.math.BigDecimal.ROUND_HALF_UP;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;

public class Calculator {
   BigDecimal b1,b2,bres;
   boolean floatflag1,floatflag2;
   int scale;
   String snum1,snum2,sop,sres;
   enum state{state_i1,state_i2,state_init,state_res};
   state s;
   //enum operator{op_add,op_sub,op_mul,op_div,op_none}
   //operator op;

public Calculator(){
       scale=100;
       floatflag1=false;
       floatflag2=false;
       clear();
   }
   public void process(String show)
   {
       if(show.charAt(0)>='0'&& show.charAt(0)<='9')//输入数字
       {
           switch (s)
           {
               case state_init:
                   if(show.charAt(0)=='0')break;
                   snum1=show;
                   s=state.state_i1;
                   break;
               case state_i1:
                   snum1+=show;
                   break;
               case state_i2:
                   snum2+=show;
                   break;
               case state_res:
                   clear();
                   process(show);
                   break;
           }
       }
       else//输入操作符
       {
           switch (show)
           {
               case "C":
                   clear();
                   break;
               case "+":
                   switch (s)
                   {
                       case state_init: sop=show;s=state.state_i2;
                       break;
                       case state_i1: sop=show;s=state.state_i2;
                       break;
                       case state_i2:
                           if(snum2=="")
                           {
                               sop=show;
                               break;
                           }
                           snum1=getres(2);snum2="";sres="";sop=show;
                           break;
                       case state_res:
                           if(sres.contains("error"))
                           {
                               clear();
                               break;
                           }
                           sop=show;snum1=sres;snum2="";sres="";s=state.state_i2;
                           break;
                   }
                   break;
               case "=":
                   switch (s)
                   {
                       case state_i1:
                           if(snum1.charAt(snum1.length()-1)=='.')snum1+="0";
                           sres=snum1;
                           snum1="";
                           snum2="";
                           sop="";
                           s=state.state_res;
                           break;
                       case state_i2:

if(snum2=="")break;
                           if(snum2.charAt(snum2.length()-1)=='.')break;
                           sres=getres(2);
                           snum1="";
                           snum2="";
                           sop="";
                           s=state.state_res;
                           break;
                       default:break;
                   }
                   break;
               case "-":
                   switch (s)
                   {
                       case state_init: sop=show;s=state.state_i2;
                           break;
                       case state_i1: sop=show;s=state.state_i2;
                           break;
                       case state_i2:
                           if(snum2=="")
                           {
                               sop=show;
                               break;
                           }
                           snum1=getres(2);snum2="";sres="";sop=show;
                           break;
                       case state_res:
                           if(sres.contains("error"))
                           {
                               clear();
                               break;
                           }
                           sop=show;snum1=sres;snum2="";sres="";s=state.state_i2;
                           break;
                   }
                   break;
               case "*":
                   switch (s)
                   {
                       case state_init: sop=show;s=state.state_i2;
                           break;
                       case state_i1: sop=show;s=state.state_i2;
                           break;
                       case state_i2:
                           if(snum2=="")
                           {
                               sop=show;
                               break;
                           }
                           snum1=getres(2);snum2="";sres="";sop=show;
                           break;
                       case state_res:
                           if(sres.contains("error"))
                           {
                               clear();
                               break;
                           }
                           sop=show;snum1=sres;snum2="";sres="";s=state.state_i2;
                           break;
                   }
                   break;
               case "/":
                   switch (s)
                   {
                       case state_init: sop=show;s=state.state_i2;
                           break;
                       case state_i1: sop=show;s=state.state_i2;
                           break;
                       case state_i2:
                           if(snum2=="")
                           {
                               sop=show;
                               break;
                           }
                           snum1=getres(2);snum2="";sres="";sop=show;
                           break;
                       case state_res:
                           if(sres.contains("error"))
                           {
                               clear();
                               break;
                           }
                           sop=show;snum1=sres;snum2="";sres="";s=state.state_i2;
                           break;
                   }
                   break;
               case "√":
                   switch (s)
                   {
                       case state_init: snum1="";snum2="";sop="";sres="0";s=state.state_res;
                           break;
                       case state_i1: sop=show;sres=getres(1);snum1="";snum2="";sop="";s=state.state_res;
                           break;
                       case state_i2:
                           if(snum2=="")break;
                           String t=snum1;snum1=snum2;
                           String t_op=sop;sop=show;
                           snum2=getres(1);
                           snum1=t;
                           sop=t_op;
                           sres="";
                           break;
                       case state_res:
                           if(sres.contains("error"))
                           {
                               clear();
                               break;
                           }
                           sop=show;
                           snum1=sres;
                           sres=getres(1);
                           snum1="";
                           sop="";
                           break;
                   }
                   break;
               case "%":
                   switch (s)
                   {
                       case state_init:
                           break;
                       case state_i1:
                           if(snum1.contains("."))break;
                           sop=show;s=state.state_i2;
                           break;
                       case state_i2:
                           if(snum2=="")
                           {
                               if(!snum1.contains("."))
                               sop=show;
                               break;
                           }
                           snum1=getres(2);snum2="";sres="";sop=show;
                           break;
                       case state_res:
                           if(sres.contains("error"))
                           {
                               clear();
                               break;
                           }
                           if(sres.contains("."))break;
                           sop=show;snum1=sres;snum2="";sres="";s=state.state_i2;
                           break;
                   }
                   break;
               case "+/-":
                   switch (s)
                   {
                       case state_init:
                           break;
                       case state_i1:
                           if(snum1.charAt(0)!='-')
                           snum1="-"+snum1;
                           else snum1=snum1.substring(1);
                           break;
                       case state_i2:
                           if(snum2=="")break;
                           if(snum2.charAt(0)!='-')
                               snum2="-"+snum2;
                           else snum2=snum2.substring(1);
                           break;
                       case state_res:
                           if(sres.contains("error"))
                           {
                               clear();
                               break;
                           }
                           if(sres.charAt(0)!='-'&& !sres.equals(0))
                               sres="-"+sres;
                           else sres=sres.substring(1);
                           snum1=sres;
                           snum2="";
                           sres="";
                           sop="";
                           if(snum1.equals("0"))
                               s=state.state_init;
                           else
                           s=state.state_i1;
                           break;
                   }
                   break;
               case ".":
                   switch (s)
                   {
                       case state_init:
                           snum1+=show;
                           s=state.state_i1;
                           break;
                       case state_i1:
                           if(snum1.contains("."))break;
                           else snum1+=show;
                           break;
                       case state_i2:
                           if(snum2.equals("")){
                               if(sop.equals("%"))break;
                               snum2="0.";
                               break;
                           }
                           if(sop.equals("%")||snum2.contains("."))break;
                           else snum2+=show;
                           break;
                       case state_res:
                           break;
                   }
                   break;
           }
       }
   }

public String getSnum1()
   {
       return  snum1;
   }
   public String getSnum2()
   {
       return snum2;
   }
   public String getSop()
   {
       return sop;
   }
   public String getSres()
   {
       return sres;
   }

public void clear()
   {
       snum1="0";
       snum2="";
       sop="";
       sres="";
       s=state.state_init;
       b1=BigDecimal.valueOf(0);
       b2=BigDecimal.valueOf(0);
       bres=BigDecimal.valueOf(0);
   }
   public String getres(int flag)
   {
       String t="null";
       if(flag==1)
       {
           b1=new BigDecimal(snum1);
           if(snum1.equals("0"))return t="0";
           if(sop.equals("√"))
           {
               bres=sqrt(b1,scale);
               t=bres.toString();
               return  t;
           }
           else if(sop.equals("+/-"))
           {
               //略了,直接字符串处理
           }
       }
       else if(flag==2)
       {
           b1=new BigDecimal(snum1);
           b2=new BigDecimal(snum2);
           switch (sop)
           {
               case "+":
                   bres=b1.add(b2);
                   t=bres.toString();
                   break;
               case "-":
                   bres=b1.subtract(b2);
                   t=bres.toString();
                   break;
               case "*":
                   bres=b1.multiply(b2);
                   t=bres.toString();
                   break;
               case "/":
                   if(b2.equals(BigDecimal.valueOf(0)))return t="error: / by zero";
                   bres=b1.divide(b2,scale,RoundingMode.HALF_UP);
                   t=bres.toString();
                   break;
               case "%":
                   if(b2.equals(BigDecimal.valueOf(0)))return t="error: / by zero";
                   bres=b1.remainder(b2);
                   t=bres.toString();
                   break;
           }
       }
       return t;
   }

public static BigDecimal sqrt(BigDecimal value, int scale){         //高精度浮点数开根号
       BigDecimal num2 = BigDecimal.valueOf(2);
       int precision = 100;
       MathContext mc = new MathContext(precision, RoundingMode.HALF_UP);
       BigDecimal deviation = value;
       int cnt = 0;
       while (cnt < precision) {
           deviation = (deviation.add(value.divide(deviation, mc))).divide(num2, mc);
           cnt++;
       }
       deviation = deviation.setScale(scale, BigDecimal.ROUND_HALF_UP);
       return deviation;
   }

}

布局文件:activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical">

<TextView
       android:id="@+id/textview_num1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"

android:text="0"
       android:textAlignment="textEnd"
       android:textColor="#009688"
       android:textSize="24sp"
       android:textStyle="bold" />
   <TextView
       android:id="@+id/textview_op"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"

android:text=""
       android:textAlignment="textEnd"
       android:textColor="#009688"
       android:textSize="24sp"
       android:textStyle="bold" />
   <TextView
       android:id="@+id/textview_num2"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"

android:text=""
       android:textAlignment="textEnd"
       android:textColor="#009688"
       android:textSize="24sp"
       android:textStyle="bold" />

<TextView
       android:id="@+id/textview_res"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"

android:text=""
       android:textAlignment="textEnd"
       android:textColor="#009688"
       android:textSize="24sp"
       android:textStyle="bold" />

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:orientation="horizontal">

<Button
           android:id="@+id/C"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="C" />

<Button
           android:id="@+id/genhao"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="√" />

<Button
           android:id="@+id/quyu"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="%" />

<Button
           android:id="@+id/add"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="+" />

</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:orientation="horizontal">

<Button
           android:id="@+id/num7"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="7" />

<Button
           android:id="@+id/num8"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="8" />

<Button
           android:id="@+id/num9"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="9" />

<Button
           android:id="@+id/sub"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="-" />

</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:orientation="horizontal">

<Button
           android:id="@+id/num4"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="4" />

<Button
           android:id="@+id/num5"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="5" />

<Button
           android:id="@+id/num6"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="6" />

<Button
           android:id="@+id/xinghao"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="*" />

</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:orientation="horizontal">

<Button
           android:id="@+id/num1"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="1" />

<Button
           android:id="@+id/num2"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="2" />

<Button
           android:id="@+id/num3"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="3" />

<Button
           android:id="@+id/chuhao"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="/" />

</LinearLayout>

<LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:orientation="horizontal">

<Button
           android:id="@+id/jiahuojian"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="+/-" />

<Button
           android:id="@+id/num0"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="0" />

<Button
           android:id="@+id/dian"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="." />

<Button
           android:id="@+id/denhao"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:text="=" />

</LinearLayout>

</LinearLayout>

来源:https://blog.csdn.net/qq_42641977/article/details/120903908

标签:android,studio,UI设计,计算器
0
投稿

猜你喜欢

  • Android WebView 不支持 H5 input type="file" 解决方法

    2022-08-30 21:07:08
  • SpringBoot中利用AOP和拦截器实现自定义注解

    2022-09-14 00:26:53
  • 一篇文章带你轻松了解C# Lock关键字

    2023-08-15 20:48:32
  • 详解c# 委托链

    2021-10-06 23:17:59
  • 浅析Java线程的中断机制

    2023-11-19 20:11:50
  • Spring Boot Maven Plugin打包异常解决方案

    2022-04-17 11:23:41
  • Android绘制仪表盘指针刻度

    2022-06-17 03:23:07
  • win7配置adb环境变量的方法步骤

    2022-11-10 16:45:12
  • Android实现底部支付弹窗效果

    2022-06-12 13:39:43
  • Android自定义View实现打字机效果

    2022-01-13 11:03:41
  • Android仿微信录制语音功能

    2022-10-18 15:54:18
  • Android获取设备传感器的方法

    2022-10-07 10:50:16
  • java实现构造无限层级树形菜单

    2021-11-11 05:46:22
  • SpringBoot路径映射实现过程图解

    2023-11-13 04:01:11
  • Spring定时任务使用及如何使用邮件监控服务器

    2023-01-12 16:38:58
  • C#使用WebSocket实现聊天室功能

    2022-08-10 09:29:33
  • 浅谈springcloud常用依赖和配置

    2023-11-24 07:50:02
  • 详解java 客户端链接不上redis解决方案

    2023-11-12 10:12:15
  • java基于UDP实现在线聊天功能

    2021-06-08 00:01:44
  • C#检查指定对象是否存在于ArrayList集合中的方法

    2023-07-28 00:45:17
  • asp之家 软件编程 m.aspxhome.com