28

基于Andriod的简易计算器

 4 years ago
source link: http://www.cnblogs.com/p1ng/p/12634770.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

这学期有安卓这门课,这里做了一个简易的计算器,实现了两位数加减乘除的基本功能,比较简单适合用来入门学习。

运行效果

FV7NNfE.png!web

预备知识

实现这个计算器之前要先了解实现计算器需要的基本组件

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个字符。

采用嵌套的线性布局

具体结构如下:

3uiu2yE.png!web

整体是一个垂直的线性布局,最上面放置一个TextView,下面是五个水平的线性布局用来放置按钮。

按钮的宽度是用weight权重设置而成,让观感更好。

最外层的线性布局添加了属性 android:layout_margin="8dp" 让布局与边框有了8dp的间隔,也是使观感更好。

二、实例化对象与监听事件

  1. 实例化组件对象
  • 创建init函数, 将TextView以及功能性组件通过 this.findViewById(R.id.具体id) 进行实例化。
  1. 给对象绑定监听事件
  • 内部类
    * 匿名内部类
    * 定义内部类
  • 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相似,但是它会随着用户对系统字体大小的设置进行比例缩放,即它能够跟随用户系统字体大小变化。所以它更适合作为字体大小的单位

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK