案例:计算器
程序员文章站
2022-07-14 13:41:08
...
案例:计算器
效果图
逻辑代码:
部分代码由butterknife自动生成
butterknife配置连接:https://blog.csdn.net/weixin_43671437/article/details/105150307
package com.example.calculator;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
/**
* 简易计算器
* 可以进行简单的计算
* 整数运算
* 复数运算
* 开平方根,加减乘除等等
*
* @author shiqifei
*/
public class MainActivity extends AppCompatActivity {
StringBuilder input = new StringBuilder();
@BindView(R.id.tv_input)
TextView tv_input;
@BindView(R.id.bt_cleanAll)
Button bt_cleanAll;
@BindView(R.id.bt_ride)
Button bt_ride;
@BindView(R.id.bt_except)
Button bt_except;
@BindView(R.id.bt_clean)
Button bt_clean;
@BindView(R.id.bt_7)
Button bt_7;
@BindView(R.id.bt_8)
Button bt_8;
@BindView(R.id.bt_9)
Button bt_9;
@BindView(R.id.bt_plus)
Button bt_plus;
@BindView(R.id.bt_4)
Button bt_4;
@BindView(R.id.bt_5)
Button bt_5;
@BindView(R.id.bt_6)
Button bt_6;
@BindView(R.id.bt_subtract)
Button bt_subtract;
@BindView(R.id.bt_1)
Button bt_1;
@BindView(R.id.bt_2)
Button bt_2;
@BindView(R.id.bt_3)
Button bt_3;
@BindView(R.id.bt_radical)
Button bt_radical;
@BindView(R.id.bt_0)
Button bt_0;
@BindView(R.id.bt_spot)
Button bt_spot;
@BindView(R.id.bt_equal)
Button bt_equal;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
@OnClick({R.id.bt_cleanAll, R.id.bt_ride, R.id.bt_except, R.id.bt_clean, R.id.bt_7, R.id.bt_8, R.id.bt_9, R.id.bt_plus, R.id.bt_4, R.id.bt_5, R.id.bt_6, R.id.bt_subtract, R.id.bt_1, R.id.bt_2, R.id.bt_3, R.id.bt_radical, R.id.bt_0, R.id.bt_spot, R.id.bt_equal})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.bt_1:
input = input.append("1");
tv_input.setText(input);
break;
case R.id.bt_2:
input = input.append("2");
tv_input.setText(input);
break;
case R.id.bt_3:
input = input.append("3");
tv_input.setText(input);
break;
case R.id.bt_4:
input = input.append("4");
tv_input.setText(input);
break;
case R.id.bt_5:
input = input.append("5");
tv_input.setText(input);
break;
case R.id.bt_6:
input = input.append("6");
tv_input.setText(input);
break;
case R.id.bt_7:
input = input.append("7");
tv_input.setText(input);
break;
case R.id.bt_8:
input = input.append("8");
tv_input.setText(input);
break;
case R.id.bt_9:
input = input.append("9");
tv_input.setText(input);
break;
case R.id.bt_0:
input = input.append("0");
tv_input.setText(input);
break;
//加
case R.id.bt_plus:
//有没有数字
input = isString(input);
input = input.append("+");
//判断是否已有一个运算符
input = isReplace(input);
tv_input.setText(input);
break;
//减
case R.id.bt_subtract:
//有没有数字
input = isString(input);
input = input.append("-");
//判断是否已有一个运算符
input = isReplace(input);
tv_input.setText(input);
break;
//乘
case R.id.bt_ride:
//有没有数字
input = isString(input);
input = input.append("×");
//判断是否已有一个运算符
input = isReplace(input);
tv_input.setText(input);
break;
//除
case R.id.bt_except:
//有没有数字
input = isString(input);
input = input.append("÷");
//判断是否已有一个运算符
input = isReplace(input);
tv_input.setText(input);
break;
//开根号
case R.id.bt_radical:
//1、将原字符串替换为结果字符串
input.replace(0,input.length()+1,squareRoot(input));
System.out.println("inputReplace======"+input);
//判断是否为整数
if (isInteger(input.toString())){
tv_input.setText(input.substring(0,input.indexOf(".")));
break;
}
tv_input.setText(input);
break;
//小数点
case R.id.bt_spot:
input = input.append(".");
tv_input.setText(input);
break;
//删除一个
case R.id.bt_clean:
if (input.length() != 0) {
input = input.delete(input.length()-1,input.length());
tv_input.setText(input);
}
break;
//删除所有
case R.id.bt_cleanAll:
if(input.length() != 0){
input = input.delete(0,input.length());
tv_input.setText(input);
}
break;
/**
* 等于
*
* 1、判断是否进行了运算,若没有运算直接输出原来的值。(根据有没有运算符判断)
* 2、判断是否为整数之间的运算,若是就返回整数,若不是返回复数
*
* */
case R.id.bt_equal:
//运算符下表
int op = 0;
//获取文本框内容
StringBuilder serb = new StringBuilder(tv_input.getText());
//运算符下表
op = isOperators(serb);
//1、判断是否进行了运算
if (op != -1){
//运算
String result = Float.toString(getResult(op, serb));
//2、对返回的结果进行处理
if (isInteger(result)){
result = result.substring(0,result.indexOf("."));
}
tv_input.setText(serb+"="+result);
}else{
tv_input.setText(serb);
}
break;
}
}
/**
* 计算
* 点击等号后调用此方法
* 对输入的数字进行+ - * / 运算
*/
private float getResult(int op, StringBuilder result) {
//获取运算符之前的数字
String first = result.substring(0, op);
//获取运算符之后的数字
String end = result.substring(op + 1, result.length());
//根据运算符的不同进行计算
if (result.substring(op, op + 1).equals("+")) {
return Float.parseFloat(first) + Float.parseFloat(end);
} else if (result.substring(op, op + 1).equals("-")) {
return Float.parseFloat(first) - Float.parseFloat(end);
} else if (result.substring(op, op + 1).equals("×")) {
return Float.parseFloat(first) * Float.parseFloat(end);
} else {
return Float.parseFloat(first) / Float.parseFloat(end);
}
}
/**
* 判断有误进行运算操作
* 判断有误运算符
* 有返回下表 没有返回-1
*/
public int isOperators(StringBuilder stb) {
String[] b = {"+", "-", "×", "÷"};
//循环判断是哪个运算符 v
for (int i = 0; i < b.length; i++) {
if (stb.indexOf(b[i]) != -1) {
return stb.indexOf(b[i]);
}
}
return -1;
}
/**
* 判断是否为整数
* 只解决了针对2.0的类型 2.00的尚未解决
*/
public static boolean isInteger(String str) {
return str.endsWith(".0");
}
/**
* squareRoot 开平方根
* 对根号前一个数进行开平方根操作
* 需解决问题:1、对未输入时的开根 " "
* 2、已输入数字进行开根 三种情况 2 2*4 2*
*/
public String squareRoot(StringBuilder stb) {
int index = 0;
//1、查看是否为空或空字符串
stb = isString(stb);
if (!stb.equals("0")) {
//判断是否有运算符
index = isOperators(stb);
if (index != -1) {
//判断运算符后是否有数字
if (index + 1 != stb.length()) {
return stb.substring(0, index + 1) + Math.sqrt(Double.parseDouble(stb.substring(index + 1, stb.length())));
}
return String.valueOf(stb.append("0"));
}
return String.valueOf(Math.sqrt(Double.parseDouble(String.valueOf(stb))));
}
return stb.toString();
}
/**
* 对直接输入运算符或根号问题进行处理
* 输入根号,运算符时
* 若前面没有数字就在他们前面添加一个0
*/
public StringBuilder isString(StringBuilder stb) {
if (stb != null && stb.length() != 0) {//* 1* 1
return stb;
}
System.out.println("修改后==========");
return stb.insert(0, "0");
}
/**
* 点击运算符后操作
* 判断是否已有一个运算符
* 没有:直接返回 有 :新替换旧
*/
public StringBuilder isReplace(StringBuilder stb) { //0* 1**
//判断是否有两个运算符
boolean a = specialCharacters(stb.substring(stb.length() - 1));
boolean b = specialCharacters(stb.substring(stb.length() - 2, stb.length() - 1));
if (a && b) {
stb.deleteCharAt(stb.length() - 2);
return stb;
}
return stb;
}
/**
* 判断字符串中是否有特殊字符
* 有返回true 没有false
* ÷×/-
*/
public boolean specialCharacters(String str) {
String regEx = "[ ×÷+-]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.find();
}
}
布局代码
线性布局+网格布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:textSize="20sp"
android:textStyle="bold"
android:text="简单计算器"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
/>
<TextView
android:id="@+id/tv_input"
android:layout_width="match_parent"
android:layout_height="90dp"
android:gravity="right|bottom"
android:textSize="50sp"
android:background="@drawable/border_radius"
/>
<GridLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:rowCount="5"
android:columnCount="4"
>
<Button
android:id="@+id/bt_cleanAll"
style="@style/btn_style"
android:text="CE"
/>
<Button
android:id="@+id/bt_ride"
style="@style/btn_style"
android:text="×"
/>
<Button
android:id="@+id/bt_except"
style="@style/btn_style"
android:text="÷"
/>
<Button
android:id="@+id/bt_clean"
style="@style/btn_style"
android:text="C"
/>
<Button
android:id="@+id/bt_7"
style="@style/btn_style"
android:text="7"
/>
<Button
android:id="@+id/bt_8"
style="@style/btn_style"
android:text="8"
/>
<Button
android:id="@+id/bt_9"
style="@style/btn_style"
android:text="9"
/>
<Button
android:id="@+id/bt_plus"
style="@style/btn_style"
android:text="+"
/>
<Button
android:id="@+id/bt_4"
style="@style/btn_style"
android:text="4"
/>
<Button
android:id="@+id/bt_5"
style="@style/btn_style"
android:text="5"
/>
<Button
android:id="@+id/bt_6"
style="@style/btn_style"
android:text="6"
/>
<Button
android:id="@+id/bt_subtract"
style="@style/btn_style"
android:text="-"
/>
<Button
android:id="@+id/bt_1"
style="@style/btn_style"
android:text="1"
/>
<Button
android:id="@+id/bt_2"
style="@style/btn_style"
android:text="2"
/>
<Button
android:id="@+id/bt_3"
style="@style/btn_style"
android:text="3"
/>
<Button
android:id="@+id/bt_radical"
style="@style/btn_style"
android:textAllCaps="false"
android:text="√ ̄"
/>
<Button
android:id="@+id/bt_0"
style="@style/btn_style"
android:layout_gravity="fill_horizontal"
android:layout_columnSpan="2"
android:text="0"
/>
<Button
android:id="@+id/bt_spot"
style="@style/btn_style"
android:text="·"
/>
<Button
android:id="@+id/bt_equal"
style="@style/btn_style"
android:text="="
/>
</GridLayout>
</LinearLayout>
其他xml文件
styles
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="btn_style">
<item name="android:layout_rowWeight">1</item>
<item name="android:layout_columnWeight">1</item>
<item name="android:textSize">20sp</item>
<item name="android:background">@drawable/selector_btn</item>
</style>
</resources>
selector
selector_btn.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<!--鼠标按压状态-->
<item android:drawable="@color/colorAccent" android:state_pressed="true" />
<!--正常状态 写在最后面-->
<item android:drawable="@drawable/border"></item>
</selector>
shape
border.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--背景颜色-->
<solid android:color="@color/color_White"/>
<!--角的弧度-->
<corners android:radius="10dp"/>
<!--边框颜色和粗细-->
<stroke android:width="1dp" android:color="#E8E7E6"/>
</shape>
colors
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#6200EE</color>
<color name="colorPrimaryDark">#3700B3</color>
<color name="colorAccent">#03DAC5</color>
<color name="colorGrey">#CCCCCC</color>
<color name="color_White">#FFFFFF</color>
</resources>
上一篇: sklearn实战:房价预测(线性回归)
下一篇: 面试必备,程序员从这两个开源项目开始准备