Android studio制作一个高仿计算器小demo

一、成品效果图

二、界面设计布局源代码:文件名activity_main.xml

XML 复制代码
<?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="com.itlaowang.jisuanqi.MainActivity" >

    <EditText
        android:id="@+id/EV_Result"
        android:layout_width="match_parent"
        android:layout_height="209dp"
        android:ems="10"
        android:gravity="right|bottom"
        android:inputType="textPersonName"
        android:paddingRight="30dp"
        android:paddingBottom="30dp"
        android:text="0"
        android:textSize="60sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"/>

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

        <Button
            android:id="@+id/Btn_C"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="C"
            android:textColor="#FF5722"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Back"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="D"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Division"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="/"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Multiplication"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="*"
            android:textSize="40sp" />

    </LinearLayout>

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

        <Button
            android:id="@+id/Btn_Num7"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="7"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Num8"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="8"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Num9"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="9"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Subtraction"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="-"
            android:textSize="40sp" />

    </LinearLayout>

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

        <Button
            android:id="@+id/Btn_Num4"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="4"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Num5"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="5"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Num6"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="6"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Addition"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="+"
            android:textSize="40sp" />
    </LinearLayout>

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

        <Button
            android:id="@+id/Btn_Num1"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="1"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Num2"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="2"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Num3"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="3"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Num0"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="0"
            android:textSize="40sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="111dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/Btn_ModuloDivision"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="%"
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_DecimalPoint"
            android:layout_width="98dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/border2"
            android:text="."
            android:textSize="40sp" />

        <Button
            android:id="@+id/Btn_Equal"
            android:layout_width="150dp"
            android:layout_height="match_parent"
            android:layout_weight="16"
            android:background="@drawable/border2"
            android:text="="
            android:textColor="#FDFDFD"
            android:textSize="40sp" />
    </LinearLayout>
</LinearLayout>

**三、按钮设置边框以及点击颜色切换效果(这里我在res/drawable中建立了两个文件:

分别为 border.xml 用来改变"="边框以及按钮效果,border.xml 用来改变普通按钮边框以及按钮效果)**

1、border.xml源代码("="按钮特效)

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#FF5722" />//设置按钮响应颜色
            <stroke
                android:width="3dp"
                android:color="#C3C3C3" />//设置按钮响应外边框颜色
            <corners
                android:radius="0dp" />
            <padding
                android:left="5dp"
                android:top="5dp"
                android:right="5dp"
                android:bottom="5dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#FF7421"
                android:endColor="#FF7421"
                android:centerColor="#FF7421"
                android:angle="270" />
            <stroke
                android:width="1dp"
                android:color="#A0A0A0" />//设置外边框颜色
            <corners
                android:radius="0dp" />
            <padding
                android:left="5dp"
                android:top="5dp"
                android:right="5dp"
                android:bottom="5dp" />
        </shape>
    </item>
</selector>

2、border2.xml源代码

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#C6CBC9" />//设置按钮响应颜色
            <stroke
                android:width="3dp"
                android:color="#C3C3C3" />//设置按钮响应外边框颜色
            <corners
                android:radius="0dp" />
            <padding
                android:left="5dp"
                android:top="5dp"
                android:right="5dp"
                android:bottom="5dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#FFFFFF"/>//设置按钮内部上半部分颜色(可以做渐变颜色)
            android:endColor="#FFFFFF"/>//设置按钮内部下半部分颜色(可以做渐变颜色)
            android:angle="270" />
            <stroke
                android:width="1dp"
                android:color="#A0A0A0" />//设置外边框颜色
            <corners
                android:radius="0dp" />
            <padding
                android:left="5dp"
                android:top="5dp"
                android:right="5dp"
                android:bottom="5dp" />
        </shape>
    </item>
</selector>

四、设置隐藏导航栏以及状态栏源代码

(在/res/values/style.xml中设置)

XML 复制代码
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!--隐藏标题栏-->
        <item name="windowNoTitle">true</item>
        <!--隐藏状态栏-->
        <item name="android:windowFullscreen">false</item>
    </style>

</resources>

五、设置导航栏以及状态栏中的颜色设置源代码(在/res/values/color.xml中设置)

XML 复制代码
<resources>
    <!--    <color name="colorPrimary">#6200EE</color>-->
    <!--    <color name="colorPrimaryDark">#3700B3</color>-->
    <color name="colorAccent">#03DAC5</color>

    <color name="colorPrimary">#EDEEEE</color>
    <color name="colorPrimaryDark">#EDEEEE</color>
</resources>

六、实现计算器主要功能文件MainActivity.java该文件:

java 复制代码
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText EV_Result; // 结果框
    private double currentResult = 0.0;  // 存储数字及结果
    private boolean firstDigit = true;  // 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
    private String operator = "=";  // 当前运算的运算符
    private boolean operateValidFlag = true;  // 操作是否合法

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 控件初始化及添加监听事件
        this.init();
    }

    /**
     * 点击事件重载方法
     * @param v 当前点击的控件
     */
    @Override
    public void onClick(View v) {
        String pre = ((Button) v).getText().toString();
        Log.i("TAG", pre);
        switch (v.getId()) {
            case R.id.Btn_Back:
                setBtn_Back();
                break;
            case R.id.Btn_C:
                setBtn_C();
                break;
            case R.id.Btn_Num0:
            case R.id.Btn_Num1:
            case R.id.Btn_Num2:
            case R.id.Btn_Num3:
            case R.id.Btn_Num4:
            case R.id.Btn_Num5:
            case R.id.Btn_Num6:
            case R.id.Btn_Num7:
            case R.id.Btn_Num8:
            case R.id.Btn_Num9:
            case R.id.Btn_DecimalPoint:
                setNum(pre);
                break;
            case R.id.Btn_Subtraction:
            case R.id.Btn_Addition:
            case R.id.Btn_ModuloDivision:
            case R.id.Btn_Multiplication:
            case R.id.Btn_Division:
            case R.id.Btn_Equal:
                setOperator(pre);
                break;
        }
    }

    /**
     * 点击运算符处理
     * @param label 接收当前点击的运算符
     */
    public void setOperator(String label) {
        switch (operator){
            case "/":
                // 除法运算
                // 如果当前结果文本框中的值等于0
                if (getNumFromEV_Result() == 0.0) {
                    // 操作不合法
                    operateValidFlag = false;
                    EV_Result.setText("除数不能为零!");
                } else {
                    currentResult /= getNumFromEV_Result();
                }
                break;
            case "+":
                // 加法运算
                currentResult += getNumFromEV_Result();
                break;
            case "-":
                // 减法运算
                currentResult -= getNumFromEV_Result();
                break;
            case "*":
                // 加法运算
                currentResult *= getNumFromEV_Result();
                break;
            case "%":
                // 加法运算
                currentResult %= getNumFromEV_Result();
                break;
            case "=":
                // 赋值运算
                currentResult = getNumFromEV_Result();
                break;
        }
        if (operateValidFlag) {
            // 双精度浮点数的运算
            long t1;
            double t2;
            t1 = (long) currentResult;
            t2 = currentResult - t1;
            if (t2 == 0) {
                EV_Result.setText(String.valueOf(t1));
            } else {
                EV_Result.setText(String.valueOf(currentResult));
            }
        }
        // 运算符等于用户按的按钮
        operator = label;
        firstDigit = true;
        operateValidFlag = true;
    }

    /**
     * 点击数字处理
     * @param n 接收当前点击的数字
     */
    public void setNum(String n) {
        if (firstDigit) {
            // 输入的第一个数字
            EV_Result.setText(n);
        } else if ((n.equals(".")) && (!EV_Result.getText().toString().contains("."))) {
            // 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面
            String str = EV_Result.getText().toString();
            str += ".";
            EV_Result.setText(str);
        } else if (!n.equals(".")) {
            // 如果输入的不是小数点,则将数字附在结果文本框的后面
            String str = EV_Result.getText().toString();
            str += n;
            EV_Result.setText(str);
        }
        // 以后输入的肯定不是第一个数字了
        firstDigit = false;
    }

    /**
     * 从文本框中获取数字
     *
     * @return result
     */
    public double getNumFromEV_Result() {
        double result = 0;
        try {
            result = Double.valueOf(EV_Result.getText().toString());
        } catch (NumberFormatException e) {
            Log.i("TAG","您输入的不是数字");
        }
        return result;
    }

    /**
     * 设置清空C键
     */
    public void setBtn_C() {
        EV_Result.setText("0");
        firstDigit = true;
        operator = "=";
    }

    /**
     * 设置返回Back键
     */
    public void setBtn_Back() {
        String currentResult = EV_Result.getText().toString();
        int i = currentResult.length();
        if (i > 0) {
            currentResult = currentResult.substring(0, i - 1);  // 将文本最后一个字符去掉
            if (currentResult.length() == 0) {  // 如果没有了内容,初始化计算器的各种值
                EV_Result.setText("0");
            } else {
                EV_Result.setText(currentResult);  // 显示新的文本
            }
        }
    }

    /**
     * 初始化控件
     */
    public void init() {
        EV_Result = findViewById(R.id.EV_Result);

        // 第一行
        Button Btn_C;  // 清空结果框
        Button Btn_Back;  // 返回
        Button Btn_ModuloDivision;  // 模除
        Button Btn_Division; // 除法
        // 第二行
        Button Btn_Num7;
        Button Btn_Num8;
        Button Btn_Num9;
        Button Btn_Multiplication;  // 乘发
        // 第三行
        Button Btn_Num4;
        Button Btn_Num5;
        Button Btn_Num6;
        Button Btn_Subtraction;  // 减法
        // 第四行
        Button Btn_Num1;
        Button Btn_Num2;
        Button Btn_Num3;
        Button Btn_Addition;  // 加法
        // 第五行
        Button Btn_Num0;
        Button Btn_DecimalPoint;  // 小数点
        Button Btn_Equal;  // 等于
        Btn_C = findViewById(R.id.Btn_C);
        Btn_Back = findViewById(R.id.Btn_Back);
        Btn_ModuloDivision = findViewById(R.id.Btn_ModuloDivision);
        Btn_Division = findViewById(R.id.Btn_Division);

        Btn_Num7 = findViewById(R.id.Btn_Num7);
        Btn_Num8 = findViewById(R.id.Btn_Num8);
        Btn_Num9 = findViewById(R.id.Btn_Num9);
        Btn_Multiplication = findViewById(R.id.Btn_Multiplication);

        Btn_Num4 = findViewById(R.id.Btn_Num4);
        Btn_Num5 = findViewById(R.id.Btn_Num5);
        Btn_Num6 = findViewById(R.id.Btn_Num6);
        Btn_Subtraction = findViewById(R.id.Btn_Subtraction);

        Btn_Num1 = findViewById(R.id.Btn_Num1);
        Btn_Num2 = findViewById(R.id.Btn_Num2);
        Btn_Num3 = findViewById(R.id.Btn_Num3);
        Btn_Addition = findViewById(R.id.Btn_Addition);

        Btn_Num0 = findViewById(R.id.Btn_Num0);
        Btn_DecimalPoint = findViewById(R.id.Btn_DecimalPoint);
        Btn_Equal = findViewById(R.id.Btn_Equal);

        Btn_C.setOnClickListener(this);
        Btn_Back.setOnClickListener(this);
        Btn_ModuloDivision.setOnClickListener(this);
        Btn_Division.setOnClickListener(this);
        Btn_Num7.setOnClickListener(this);
        Btn_Num8.setOnClickListener(this);
        Btn_Num9.setOnClickListener(this);
        Btn_Multiplication.setOnClickListener(this);
        Btn_Num4.setOnClickListener(this);
        Btn_Num5.setOnClickListener(this);
        Btn_Num6.setOnClickListener(this);
        Btn_Subtraction.setOnClickListener(this);
        Btn_Num1.setOnClickListener(this);
        Btn_Num2.setOnClickListener(this);
        Btn_Num3.setOnClickListener(this);
        Btn_Addition.setOnClickListener(this);
        Btn_Num0.setOnClickListener(this);
        Btn_DecimalPoint.setOnClickListener(this);
        Btn_Equal.setOnClickListener(this);
    }

}
相关推荐
阿巴斯甜10 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker10 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952711 小时前
Andorid Google 登录接入文档
android
黄林晴13 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android