Android & Kotlin:打造本身的計算器

一直很好奇Android開發是個什麼樣的體驗,最近賦閒在家,時間寬裕,找了幾個教學視頻跟着體驗一下,順便練習一下學的Kotlin,因而乎就寫了一個計算器,感受還像那麼回事兒。html

先上效果圖:前端

在這裏插入圖片描述

1. kotlin

  • Kotlin (科特林)是一個用於現代多平臺應用的靜態編程語言 ,由 JetBrains(知名IDE開發公司,如idea,pycharm) 開發。
  • Kotlin能夠編譯成Java字節碼,也能夠編譯成JavaScript,方便在沒有JVM的設備上運行。除此以外Kotlin還能夠編譯成二進制代碼直接運行在機器上(例如嵌入式設備或 iOS)。
  • 2017年Kotlin正式成爲Android官方支持開發語言。
    kotlin對Android的支持很好,對許多地方進行了簡化,如直接經過id使用組建。
  • kotlin還對web框架也有支持,如spring,vert.x。
  • 與java相比彌補了java的一些不足。
  • 語言風格和typescript相近,有向前端靠攏的意思(一統江湖?)

2. Android

這個就不介紹了。。java

android項目主要分爲兩個部分:android

  • 邏輯部分
  • layout

在這裏插入圖片描述

其中佈局經過xml文件關聯組建,設置一些參數,邏輯部分對組建部分進行更改狀態等一些處理。git

2.1 layout部分

使用Android studio或idea建立的Android項目中layout部分的xml文件打開是有兩個功能:github

  • text:就是xml文件的代碼
  • design:可視化爲一個工做臺,經過拖拽等操做生成xml文件中代碼,更直觀一些

在這裏插入圖片描述

3. 樣式佈局

Android的佈局其實和html的仍是有不少類似之處的。作過前端的理解這個應該很簡單web

3.1 寬高

layout_width, layout_height

  • match_parent:儘量的覆蓋全
  • wrap_content:儘量的小,徹底貼合內容
  • 80sp:定長

3.2 分佈方向

orientationspring

  • vertical:垂直方向
  • horizontal: 水平方向

3.3 顏色

background, textColortypescript

  • 能夠經過values文件中的colors中進行設置,有點相似less中的設置方法
android:background="@android:color/background_dark"

3.4 id

跟前端同樣,若是須要進行邏輯處理就須要指定id關聯js編程

3.5 佈局

layout_weight

  • 經過比重設置組建在layout中站位的比重

3.5 操做

  • 經過關聯到邏輯部分的函數,出入函數一個view,前端可能是event
  • 邏輯部分進行操做更改layout內容
android:onClick="onDigit"

4. 邏輯部分

直接在java部分寫函數

  • 傳入view爲觸發操做組建
  • 經過傳入內容更改layout中組件的某些內容
fun onDigit(view: View) {
    if (!lastEqual)
        tvInput.append((view as Button).text)
        lastNum = true
}

5.計算器實現

5.1 佈局設計

  • button一行一個linearlayout
  • button經過權重進行分佈
  • 顯示部分分兩部分,上部分存儲以前的輸入狀況,下部分爲操做區
  • 操做符和數值經過顏色作以區分

在這裏插入圖片描述

5.2 輸入操做

經過輸入類型來區分使用函數,分爲:

  • 數值
  • 小數點
  • 操做符
  • clear鍵
  • backspace鍵
  • 等於鍵

數值

fun onDigit(view: View) {
    if (!lastEqual)
        tvInput.append((view as Button).text)
        lastNum = true
}

清除鍵:

  • 直接將字符串設爲空
  • 將各類狀態還原
fun onClear(view: View) {
    tvInput.text = ""
    lastNum = false
    lastOperator = false
    lastDot = false
    lastEqual = false
}

退回鍵:

  • 因爲TextView沒有remove功能,使用擴展函數寫一個
  • 返回過程當中若是遇到小數點或是操做符,也要復原其狀態
private fun TextView.backSpace () {
    if (text.isNotEmpty()) {
        when(text.last()){
            '.' -> lastDot = false
            '-', '+', '×', '÷', '%' -> lastOperator = false
        }
        text = text.subSequence(0, text.length - 1)
    }
}

fun onBackSpace(view: View) {
    tvInput.backSpace()
}

小數點

  • 一個數中只能有一個小數點要控制好
  • 小數點前要有數值
fun onDecimalPoint(view: View) {
    if (lastNum && !lastDot) {
        tvInput.append(".")
        lastNum = false
        lastDot = true
    }
}

操做符

  • 操做符前要有數值(其實-號能夠沒有,爲了簡化不處理這部分邏輯了)
  • 只能出現一次操做符,操做符以後小數點狀態還原
fun onOperator(view: View) {
    if (lastNum && !lastOperator) {
        operator = (view as Button).text.toString()[0]
        tvInput.append(view.text)
        lastOperator = true
        lastNum = false
        lastDot = false
        lastEqual = false
    }
}

等於號:

  • 經過操做符切分爲兩個字符串,表明兩個數值
  • 經過模式匹配進行計算處理
  • mun2爲0的時候須要報錯
  • 將以前的輸入內容添加到list中經過上面屏幕進行顯示
@SuppressLint("SetTextI18n")
fun onEqual() {
    if (lastNum && lastOperator) {
        val oldText = tvInput.text.toString()
        val (s1, s2) = oldText.split(operator)
        val num1 = s1.toDouble()
        val num2 = s2.toDouble()
        var ret: Double? = null
        when(operator) {
            '×' -> ret = num1 * num2
            '+' -> ret = num1 + num2
            '÷' -> if (num2 != 0.0) ret = num1 / num2
            '-' -> ret = num1 - num2
            '%' -> ret = num1 % num2
        }
        textList.removeAt(0)
        textList.add(oldText)
        showOut.text = textList.joinToString("\n")
        val nf: NumberFormat = NumberFormat.getNumberInstance()
        nf.maximumFractionDigits = 6
        if (ret==null) {
            tvInput.text = "Error"
        }else{
            tvInput.text = nf.format(ret)
        }
        lastDot = true
        lastEqual = true
        lastOperator = false
    }
}

6. 源碼

github

相關文章
相關標籤/搜索