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