一直很好奇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 } }