这学期有安卓这门课,这里作了一个简易的计算器,实现了两位数加减乘除的基本功能,比较简单适合用来入门学习。android
实现这个计算器以前要先了解实现计算器须要的基本组件算法
1.TextViewapp
TextView是一个文本显示组件,提供了基本的显示文本功能,由于大多数UI系统组件都须要展现信息,全部它也是大多数UI系统组件的父类。ide
(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的经常使用属性和方法this
属性名 | 对应方法 | 说明 |
---|---|---|
android:clickable | setClickable(boolean) | 设置是否容许点击按钮(true/false) |
android:background | setBackgroudResource | 经过资源文件设置背景色 |
android:onClick | setOnClickListener(OnClickListener) | 设置点击事件 |
(2)监听事件设计
每个添加到UI上的Button通常都须要给它绑定监听事件,给Button绑定监听事件一般有两类方法:
了解完了组件以后还要了解一个布局,才能将组件更好的摆放在界面上。此计算器使用线性布局实现的。
3.LinerLayout
线性布局是Android应用程序开发时较为常见的一种布局类型,它能够将用户界面上的组件拜访水平(horizontal)或垂直(vertical)的形式。
LinerLayout的经常使用属性和对应方法
属性名 | 对应方法 | 说明 |
---|---|---|
android:orientation | setOrientation(int) | 设置线性布局的方向,有horizontal(水平)和vertical(垂直)两个值,必须设置 |
android:layout_gravity | 设置组件自己相对于父组件的显示位置 | |
android:divider | 设置分割线的图片 | |
android:layout_weight | 设置权重,即让一行或一列的组件按比例显示 |
根据运行效果能够看出,计算器主要实现了加、减、乘、除的计算功能。
采用嵌套的线性布局
具体结构以下:
总体是一个垂直的线性布局,最上面放置一个TextView,下面是五个水平的线性布局用来放置按钮。
按钮的宽度是用weight权重设置而成,让观感更好。
最外层的线性布局添加了属性 android:layout_margin="8dp"
让布局与边框有了8dp的间隔,也是使观感更好。
this.findViewById(R.id.具体id)
进行实例化。数字按键的功能只是显示到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类似,可是它会随着用户对系统字体大小的设置进行比例缩放,即它可以跟随用户系统字体大小变化。因此它更适合做为字体大小的单位 |