基於Andriod的簡易計算器

這學期有安卓這門課,這裏作了一個簡易的計算器,實現了兩位數加減乘除的基本功能,比較簡單適合用來入門學習。android

運行效果

預備知識

實現這個計算器以前要先了解實現計算器須要的基本組件算法

1.TextViewapp

TextView是一個文本顯示組件,提供了基本的顯示文本功能,由於大多數UI系統組件都須要展現信息,全部它也是大多數UI系統組件的父類。ide

(1)TextView的經常使用屬性和方法函數

屬性名 對應方法 說明
android:autoLink setAutoLinkMask(int) 設置是否當文本爲:URL連接、E-mail、電話號碼、Map時,文本顯示爲可單機的連接
android:gravity setGravity(int) 設置文本框的對應方式
android:layout_gravity 設置組件自己相對於父組件的顯示位置
android:lines setLines(int) 設置文本的行數,設置兩行就顯示兩行,即便第二行沒有數據
android:text setText(CharSequence) 設置文本框顯示的文本內容
android:textColor setTextColor(int) 設置文本顯示的顏色
android:textSize setTextSize(float) 設置文字大小,推薦度量單位"sp"
android:textStyle setTypeface(Typeface) 設置字形:粗體、斜體等
android:layout_width 設置文本框在屏幕上的寬度
android:layout_height 設置文本框在屏幕上的高度

(2)gravity和layout_gravity的屬性值及說明佈局

屬性值 說明
top 頂部對齊
bottom 底部對齊
left 左邊對齊
right 右邊對齊
center_horizontal 橫向中央位置對齊

2.Button學習

Button是TextView的子類,因此TextView上不少屬性也能夠直接應用到Button上。實際開發中對於Button操做主要是按下後執行何種操做。字體

(1)Button的經常使用屬性和方法this

屬性名 對應方法 說明
android:clickable setClickable(boolean) 設置是否容許點擊按鈕(true/false)
android:background setBackgroudResource 經過資源文件設置背景色
android:onClick setOnClickListener(OnClickListener) 設置點擊事件

(2)監聽事件設計

每個添加到UI上的Button通常都須要給它綁定監聽事件,給Button綁定監聽事件一般有兩類方法:

  • 內部類(匿名內部類、定義內部類)
  • 給Button設置onClick屬性(在代碼中定義onClick指明的對應方法)

瞭解完了組件以後還要了解一個佈局,才能將組件更好的擺放在界面上。此計算器使用線性佈局實現的。

3.LinerLayout

線性佈局是Android應用程序開發時較爲常見的一種佈局類型,它能夠將用戶界面上的組件拜訪水平(horizontal)或垂直(vertical)的形式。

LinerLayout的經常使用屬性和對應方法

屬性名 對應方法 說明
android:orientation setOrientation(int) 設置線性佈局的方向,有horizontal(水平)和vertical(垂直)兩個值,必須設置
android:layout_gravity 設置組件自己相對於父組件的顯示位置
android:divider 設置分割線的圖片
android:layout_weight 設置權重,即讓一行或一列的組件按比例顯示

計算器的具體設計與實現

1、主界面設計

根據運行效果能夠看出,計算器主要實現了加、減、乘、除的計算功能。

  • 主界面上用11個Button組件顯示數字09和".",用於輸入09數字和小數點;
  • 用4個Button組件顯示"+"、""、""、""運算符,用於實現加、減、乘、除運算;
  • 用3個Button組件顯示"="、"C" 和 "DEL", "=" 用於計算結果、 "C" 用於將顯示結果的TextView清零、 "DEL" 用於刪除輸入的1個字符。

採用嵌套的線性佈局

具體結構以下:

總體是一個垂直的線性佈局,最上面放置一個TextView,下面是五個水平的線性佈局用來放置按鈕。

按鈕的寬度是用weight權重設置而成,讓觀感更好。

最外層的線性佈局添加了屬性 android:layout_margin="8dp" 讓佈局與邊框有了8dp的間隔,也是使觀感更好。

2、實例化對象與監聽事件

  1. 實例化組件對象
  • 建立init函數, 將TextView以及功能性組件經過 this.findViewById(R.id.具體id)進行實例化。
  1. 給對象綁定監聽事件
  • 內部類
    * 匿名內部類
    * 定義內部類
  • onClick屬性
    * 定義public類型的方法

數字按鍵的功能只是顯示到TextView中因此使用的是添加onClick屬性並指定方法綁定監聽事件,功能按鍵使用的是匿名內部類定義其功能。

3、功能的實現

(1)定義變量和初始化組件

private Button btnAdd, btnDec, btnMul, btnDev, btnEqu, btnClear, btnDel;
private TextView txtResult; //顯示結果
private StringBuffer digtalA = new StringBuffer(),digtalB = new StringBuffer();
private boolean isChar = false; //是否爲運算符
private int operater = 0; // 判斷是哪一種運算符 0+ 1- 2* 3/
private boolean isDigtalA = true;

void initView(){
    txtResult = (TextView) this.findViewById(R.id.txtResults);
    btnAdd = (Button) this.findViewById(R.id.btnAdd);
    btnDec = (Button) this.findViewById(R.id.btnDec);
    btnMul = (Button) this.findViewById(R.id.btnMul);
    btnDev = (Button) this.findViewById(R.id.btnDev);
    btnEqu = (Button) this.findViewById(R.id.btnEqu);
    btnClear = (Button) this.findViewById(R.id.btnC);
    btnDel = (Button) this.findViewById(R.id.btnDel);
}

(2)數字0~9及小數點的監聽事件定義了myOnclick()方法來實現

public void myOnclick(View v){
    switch (v.getId()){
        case R.id.btn0:
            setVal("0");
            break;
        case R.id.btn1:
            setVal("1");
            break;
        //...中間代碼省略
        case R.id.btnDot:
            setVal(".");
            break;
    }
}

setVal()方法是對重複代碼的抽取。

public void setVal(String s){
    if (isChar){
        digtalB.append(s);
        txtResult.setText(digtalB.toString());
    }else{
        digtalA.append(s);
        txtResult.setText(digtalA.toString());
    }
}

此代碼做用是判斷當前輸入的數字是運算的第一個數仍是第二個數。對其進行賦值(digtalA爲StringBuffer存儲第一個運算數,B存儲第二個運算數)並顯示到TextView中。

(3)運算法"+"的監聽事件

btnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (digtalA.length() == 0){
                return;
            }
            operater = 0;
            isChar = true;
            isDigtalA = false;
            txtResult.setText("+");
        }
    });

減乘除與其相似。

(4)清空按鈕 "C" 的監聽事件

btnClear.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            digtalA = new StringBuffer();
            digtalB = new StringBuffer();
            isChar = false;
            isDigtalA = true;
            txtResult.setText("0");
        }
    });

(5)等於號 "=" 的監聽事件

btnEqu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (digtalA.length() == 0 || digtalB.length() == 0){
                return;
            }
            float a = Float.parseFloat(digtalA.toString());
            float b = Float.parseFloat(digtalB.toString());
            float c = 0;
            switch (operater){
                case 0:
                    c = a + b;
                    break;
                case 1:
                    c = a - b;
                    break;
                case 2:
                    c = a * b;
                    break;
                case 3:
                    c = a / b;
                    break;
            }
            txtResult.setText(c+"");
            digtalA = new StringBuffer();
            digtalB = new StringBuffer();
            isChar = false;
            isDigtalA = true;
        }
    });
}

先判斷兩個運算數是否爲空,爲空直接返回,再進行相應的加減乘除操做,將結果顯示到屏幕中,並清空A,B及其餘標識符。

(6)退格刪除 "DEL" 的監聽事件

btnDel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isDigtalA){
                if (digtalA.length() > 0){
                    String temp = digtalA.substring(0,digtalA.length()-1);
                    digtalA = new StringBuffer();
                    digtalA.append(temp);
                    txtResult.setText(digtalA.toString());
                }else{
                    digtalA = new StringBuffer();
                    digtalA.append("0");
                }
            }else{
                if (digtalB.length() > 0){
                    String temp = digtalB.substring(0,digtalB.length()-1);
                    digtalB = new StringBuffer();
                    digtalB.append(temp);
                    txtResult.setText(digtalB.toString());
                }else{
                    digtalB = new StringBuffer();
                    digtalB.append("0");
                }
            }
        }
    });

isDigtalA 是用來判斷當前輸入數字是第一個運算數仍是第二個,退格用StringBuffer的substring截斷最後一位數字。

(7)其餘說明

單位 說明
px(像素) 至關於實際屏幕的像素,因爲不一樣屏幕的像素數差別比較大,所以這個單位不推薦用於尺寸單位
dp/dip(密度無關像素) 一種與屏幕密度無關的尺寸單位,當屏幕密度是160dpi時,1dp=1px。當運行在高dpi的屏幕上時,dp就會按比例放大,當運行在低dpi的屏幕上時,dp就會按比例縮小。所以dp是一種簡單解決view在不一樣大小屏幕上顯示問題的解決方案
sp 與dp類似,可是它會隨着用戶對系統字體大小的設置進行比例縮放,即它可以跟隨用戶系統字體大小變化。因此它更適合做爲字體大小的單位
相關文章
相關標籤/搜索