基於Andriod的簡易計算器
阿新 • • 發佈:2020-04-05
這學期有安卓這門課,這裡做了一個簡易的計算器,實現了兩位數加減乘除的基本功能,比較簡單適合用來入門學習。
##執行效果
![](https://img2020.cnblogs.com/blog/1898410/202004/1898410-20200404222638046-667468546.png)
##預備知識
實現這個計算器之前要先了解實現計算器需要的基本元件
1.TextView
TextView是一個文字顯示元件,提供了基本的顯示文字功能,因為大多數UI系統元件都需要展示資訊,所有它也是大多數UI系統元件的父類。
(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的常用屬性和方法
屬性名 | 對應方法 | 說明
-|-|-
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 | | 設定權重,即讓一行或一列的元件按比例顯示
## 計算器的具體設計與實現
### 一、主介面設計
根據執行效果可以看出,計算器主要實現了加、減、乘、除的計算功能。
* 主介面上用11個Button元件顯示數字0~9和".",用於輸入0~9數字和小數點;
* 用4個Button元件顯示"+"、""、""、""運算子,用於實現加、減、乘、除運算;
* 用3個Button元件顯示"="、"C" 和 "DEL", "=" 用於計算結果、 "C" 用於將顯示結果的TextView清零、 "DEL" 用於刪除輸入的1個字元。
採用巢狀的線性佈局
具體結構如下:
![](https://img2020.cnblogs.com/blog/1898410/202004/1898410-20200404222650225-710912232.png)
整體是一個垂直的線性佈局,最上面放置一個TextView,下面是五個水平的線性佈局用來放置按鈕。
按鈕的寬度是用weight權重設定而成,讓觀感更好。
最外層的線性佈局添加了屬性 `android:layout_margin="8dp"` 讓佈局與邊框有了8dp的間隔,也是使觀感更好。
### 二、例項化物件與監聽事件
1. 例項化元件物件
* 建立init函式, 將TextView以及功能性元件通過 `this.findViewById(R.id.具體id)`進行例項化。
2. 給物件繫結監聽事件
* 內部類
* 匿名內部類
* 定義內部類
* onClick屬性
* 定義public型別的方法
數字按鍵的功能只是顯示到TextView中所以使用的是新增onClick屬性並指定方法繫結監聽事件,功能按鍵使用的是匿名內部類定義其功能。
### 三、功能的實現
(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相似,但是它會隨著使用者對系統字型大小的設定進行比例縮放,即它能夠跟隨使用者系統字型大小變化。所以它更適合作為字型大小