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

相关文章
相关标签/搜索