基于Andriod的简易计算器
这学期有安卓这门课,这里做了一个简易的计算器,实现了两位数加减乘除的基本功能,比较简单适合用来入门学习。
运行效果
预备知识
实现这个计算器之前要先了解实现计算器需要的基本组件
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组件显示数字09和".",用于输入09数字和小数点;
- 用4个Button组件显示"+"、""、""、""运算符,用于实现加、减、乘、除运算;
- 用3个Button组件显示"="、"C" 和 "DEL", "=" 用于计算结果、 "C" 用于将显示结果的TextView清零、 "DEL" 用于删除输入的1个字符。
采用嵌套的线性布局
具体结构如下:
整体是一个垂直的线性布局,最上面放置一个TextView,下面是五个水平的线性布局用来放置按钮。
按钮的宽度是用weight权重设置而成,让观感更好。
最外层的线性布局添加了属性 android:layout_margin="8dp"
让布局与边框有了8dp的间隔,也是使观感更好。
二、实例化对象与监听事件
- 实例化组件对象
- 创建init函数, 将TextView以及功能性组件通过
this.findViewById(R.id.具体id)
进行实例化。
- 给对象绑定监听事件
- 内部类
* 匿名内部类
* 定义内部类 - 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相似,但是它会随着用户对系统字体大小的设置进行比例缩放,即它能够跟随用户系统字体大小变化。所以它更适合作为字体大小的单位 |
基于Andriod的简易计算器的更多相关文章
- 基于c的简易计算器二
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> ...
- 基于c的简易计算器一
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h&g ...
- 基于java的简易计算器实现
方法: 1.将string类型的表达式输入转换成后缀表达式 2.计算后缀表达式 步骤一:将string类型的表达式输入转换成后缀表达式 输入字符串表达式,并将表达式转换成char型数组 String ...
- 制作一个简易计算器——基于Android Studio实现
一个计算器Android程序的源码部分分为主干和细节两部分. 一.主干 1. 主干的构成 计算器的布局 事件(即计算器上的按钮.文本框)监听 实现计算 2. 详细解释 假设我们的项目名为Calcula ...
- 基于Android 平台简易即时通讯的研究与设计[转]
摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...
- JavaScript简易计算器
JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...
- 如何使用Java AWT 创建一个简易计算器
摘要:手把手教你使用 Java AWT 创建一个简易计算器. 本文分享自华为云社区<手把手教你使用 Java AWT 创建一个简易计算器>,作者:海拥 . 关于AWT AWT (抽象窗口工 ...
- 自制c#简易计算器
这是一个课堂作业,我觉得作为一个简易的计算器不需要态度复杂的东西,可能还有一些bug,有空再慢慢加强. using System;using System.Collections.Generic;us ...
- 剖析简易计算器带你入门微信小程序开发
写在前面,但是重点在后面 这是教程,也不是教程. 可以先看Demo的操作动图,看看是个什么玩意儿,GitHub地址(https://github.com/dunizb/wxapp-sCalc) 自从微 ...
随机推荐
- JMeter-完成批量的接口测试
前言 当我们在工作中进行接口测试时,项目的接口肯定不止一个,而是很多很多,而且每个接口都需要进行正确参数,错误参数,参数为空,特殊字符等方式来测试接口是否能够正确返回所需的响应值. 今天,我们来一起学 ...
- SpringBoot入门系列(二)如何返回统一的数据格式
前面介绍了Spring Boot的优点,然后介绍了如何快速创建Spring Boot 项目.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/ ...
- JVM性能优化
java应用程序是应用在JVM上的,你们对JVM又有多少了解呢?JVM将内存分为三部分:NEW(年轻代).Tenured(年老代).Perm(永久代). (1)年轻代:用来存放java分配的新对象. ...
- linux构建DHCP服务器
1.DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作,主要用途:给内部网络或网络服务供应商自动分配IP地址 ...
- 解决layui表单ajax提交回调函数不起作用问题的两种方式
最近想用layui开发一个论坛模板用的是fly-ui,才接触layui对其还不太熟悉.一个简单的登录就困扰了我很久.登录的form通过ajax提交回调函数老是不起作用.经过浪费了N多时间的调试,发现l ...
- 记录:更新VS2019后单元测试运行卡住无法运行测试的问题。
先说一下是如何遇到这个问题的 今天更新了Visual Studio到最新的版本,然后在运行之前建立的单元测试项目的时候一直卡住,过了一会儿以后提示 未能协商协议,等待响应在 90 秒后超时.出现此问题 ...
- 第一篇博客 C+++知识点总结一
1.成员 1.比较特殊的成员类型:protected. 保护成员在本类中和private类型的成员作用一模一样.区别在于保护成员可以由本类的派生类的成员函数访问,但是私有成员在其派生类中无法访问. 2 ...
- 22 Specifications动态查询
Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationE ...
- 使用StreamHttpResponse和FileResponse下载文件的注意事项及文件私有化
为什么需要编写下载视图方法? 你或许知道,我们上传的文件默认放在media文件夹中的,且Django会为每个上传的静态文件分配一个静态url.在模板中,你可以使用{{ mymodel.file.url ...
- spring多数据源分布式事务的分析与解决方案
一.概述 1.业务背景 对老系统进行重构合并,导致新系统需要同时对3个数据库进行管理.由于出现跨库业务,需要实现分布式事务. 2.开发环境 spring框架版本 4.3.10.RELEASE 持久层 ...