比上期多了一个跑马灯效果
效果图
简单计算器
1 功能需求及技术可行性分析
在开始编码之前,我们需要先对程序进行需求分析,想一想简单计算器中应该具备哪些功能。将这些功能全部整理出来之后,我们才好动手去一一实现。这里我认为简单计算器中至少应该具备以下功能。
1. 页面布局。
2. 事件监听及实现计算。
虽然看上去只有二个主要的功能点,但如果想要全部实现这些功能却需要用到UI、数据存储、服务等技术,因此还是非常考验你的综合应用能力的。不过好在这些技术在前面的章节中我们全部都学习过了,只要你学得用心,相信完成这些功能对你来说并不难。
分析完了需求之后,接下来就要进行技术可行性分析了。首先需要考虑的一个问题就是,我们如何才能计算简单的计算题呢,这就靠我们的以前学习的算法啦,这里面主要运用算法,
我们可以翻阅以前的书本或者上网搜索我们需要的算法,这里我就不一一细解释了,后面写代码的时候再详细说明。
2Git时间,将代码托管到GitHub上
经过前面几章的学习,相信你已经可以非常熟练地使用Git了。本节依然是Git时间,这次我们将会把简单计算器的代码托管到GitHub上面。
GitHub是全球最大的代码托管网站,主要是借助Git来进行版本控制的。任何开源软件都可以免费地将代码提交到GitHub上,以零成本的代价进行代码托管。
上一节我们已经详细介绍了使用GitHub,本节不做详细说明。
3 创建好包
从本节开始,我们就要真正地动手编码了,为了要让项目能够有更好的结构,这里需要在ymq.demo03包下建一个包,如图15所示。
图 15
3. 主页面UI设计:
我这个样式主要分为三部分:上 中 下 。
上是一个跑马灯,中是一个显示屏,下是一个按钮布局
在layout.main.xml中建立,让它出来我们满意设计模式:
3.1 上跑马灯演示
首先我们先建一个textview用来做跑马灯效果:欢迎使用简单计算器,祝您生活愉快
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:text="欢迎使用简单计算器,祝您生活愉快。欢迎使用简单计算器,祝您生活愉快" />
详见博客
3.2 中 显示屏
我们要建立一个EditText,使它能输入:
<EditText
android:text="TextView"
android:id="@+id/textView1"
android:textSize="25sp"
android:textColor="#000000"
android:layout_gravity="center"
android:gravity="left"
android:cursorVisible="false"
android:editable = "false"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_marginLeft="4dip"
android:layout_marginRight="4dip"
android:layout_marginTop="4dip" android:layout_weight="1.5">
</EditText>
3.3 下 按钮布局 一共6排 21个按钮
代码如下
<LinearLayout
android:id="@+id/linearlayout02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
<Button
android:layout_width="50dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:id="@+id/buttonc" android:text="@string/shan">
</Button>
<Button
android:layout_width="50dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:id="@+id/buttonce" android:text="@string/shanchu">
</Button>
</LinearLayout>
<TableRow
android:id="@+id/row0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/one" android:id="@+id/button1">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/two" android:id="@+id/button2">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/three" android:id="@+id/button3">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/jia" android:id="@+id/button01">
</Button>
</TableRow>
<TableRow
android:id="@+id/row1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/fore" android:id="@+id/button4">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/five" android:id="@+id/button5">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/six" android:id="@+id/button6">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/jian" android:id="@+id/button02">
</Button>
</TableRow>
<TableRow
android:id="@+id/row2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/seven" android:id="@+id/button7">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/eight" android:id="@+id/button8">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/nine" android:id="@+id/button9">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/cheng" android:id="@+id/button03">
</Button>
</TableRow>
<TableRow
android:id="@+id/row3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/zero" android:id="@+id/button0">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:id="@+id/button06" android:text="@string/dihao">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/dengyu" android:id="@+id/button05">
</Button>
<Button
android:layout_width="40dip"
android:layout_height="fill_parent"
android:layout_weight="1"
android:textSize="25sp" android:text="@string/chu" android:id="@+id/button04">
</Button>
</TableRow>
<LinearLayout
android:id="@+id/tableRow1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="1">
<Button
android:textSize="25sp"
android:layout_height="fill_parent"
android:layout_width="50dp" android:layout_weight="1" android:text="@string/zhengfu" android:id="@+id/zheng">
</Button>
<Button
android:id="@+id/pingfang"
android:textSize="25sp"
android:layout_height="fill_parent"
android:layout_width="50dp" android:layout_weight="1" android:text="@string/ping">
</Button>
<Button
android:id="@+id/kaifang"
android:textSize="25sp"
android:layout_height="fill_parent"
android:layout_width="50dp" android:layout_weight="1" android:text="@string/kai">
</Button>
4实例化控件(按钮及显示屏)
final Button number[]=new Button[10];
final Button fuhao[]=new Button[11];
//*按钮
fuhao[0]=(Button)findViewById(R.id.button01);
fuhao[1]=(Button)findViewById(R.id.button02);
fuhao[2]=(Button)findViewById(R.id.button03);
fuhao[3]=(Button)findViewById(R.id.button04);
fuhao[4]=(Button)findViewById(R.id.button05);
fuhao[5]=(Button)findViewById(R.id.button06);
fuhao[6]=(Button)findViewById(R.id.buttonce);
fuhao[7]=(Button)findViewById(R.id.buttonc);
fuhao[8]=(Button)findViewById(R.id.zheng);
fuhao[9]=(Button)findViewById(R.id.kaifang);
fuhao[10]=(Button)findViewById(R.id.pingfang);
number[0]=(Button)findViewById(R.id.button0);
number[1]=(Button)findViewById(R.id.button1);
number[2]=(Button)findViewById(R.id.button2);
number[3]=(Button)findViewById(R.id.button3);
number[4]=(Button)findViewById(R.id.button4);
number[5]=(Button)findViewById(R.id.button5);
number[6]=(Button)findViewById(R.id.button6);
number[7]=(Button)findViewById(R.id.button7);
number[8]=(Button)findViewById(R.id.button8);
number[9]=(Button)findViewById(R.id.button9);
et=(EditText) findViewById(R.id.textView1);//*显示屏
et.setText(str);
fuhao[6].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
str="";
et.setText(str);
vi=v;
}
});
fuhao[7].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
b=0.0;c=0;g=0.0;
str="";
et.setText(str);
}
});
fuhao[8].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(vi!=fuhao[5]&&str!=""){
char ch=str.charAt(0);
if(ch=='-')
str=str.replace("-","");
else
str="-"+str;
et.setText(str);
}
}
});
fuhao[9].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(str!=""){
double a=Double.parseDouble(str);
str=Math.sqrt(a)+"";
et.setText(str);
}}
});
fuhao[10].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(str!=""){
double a=Double.parseDouble(str);
str=""+a*a;
et.setText(str);
}}
});
5.实现业务逻辑:
5.1 添加计算方法,在demo03.java中写入代码:
//计算方法
public double calculater(){
switch(c){
case 0:f=g;break;
case 1:f=b+g;break;
case 2:f=b-g;break;
case 3:f=b*g;break;
case 4:f=b/g;break;
}
b=f;
c=0;
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
5.2 设定数字按键,在demo03.java中写入代码:
//设定数字按键
number[0].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=0;
et.setText(str);
flag=0;
}
else{
char ch1[];
ch1=str.toCharArray();
if(!(ch1.length==1&&ch1[0]=='0'))
{str+=0;
et.setText(str);}
}
vi=v;
}
});
number[1].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=1;
et.setText(str);
flag=0;
}
else{
str+=1;
et.setText(str);
}
vi=v;
}
});
number[2].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=2;
et.setText(str);
flag=0;
}
else{
str+=2;
et.setText(str);
}
vi=v;
}
});
number[3].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=3;
et.setText(str);
flag=0;
}
else{
str+=3;
et.setText(str);
}
vi=v;
}
});
number[4].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=4;
et.setText(str);
flag=0;
}
else{
str+=4;
et.setText(str);
}
vi=v;
}
});
number[5].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=5;
et.setText(str);
flag=0;
}
else{
str+=5;
et.setText(str);
}
vi=v;
}
});
number[6].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=6;
et.setText(str);
flag=0;
}
else{
str+=6;
et.setText(str);
}
vi=v;
}
});
number[7].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=7;
et.setText(str);
flag=0;
}
else{
str+=7;
et.setText(str);
}
vi=v;
}
});
number[8].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=8;
et.setText(str);
flag=0;
}
else{
str+=8;
et.setText(str);
}
vi=v;
}
});
number[9].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(flag==1){
str="";
str+=9;
et.setText(str);
flag=0;
}
else{
str+=9;
et.setText(str);
}
vi=v;
}
});
5.3 设定符号键, 在demo03.java中写入代码:
5.3.1 设定符号键 加 +
fuhao[0].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(str!=""){
if(vi==fuhao[0]||vi==fuhao[1]||vi==fuhao[2]||vi==fuhao[3]){
c=1;
}
else{
g=Double.parseDouble(str);
calculater();
str=""+f;
et.setText(str);
c=1;
flag=1;
vi=v;
}}
}
});
5.3.2 设定符号键 减 ‘ — ’
fuhao[1].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(str!=""){
if(vi==fuhao[0]||vi==fuhao[1]||vi==fuhao[2]||vi==fuhao[3]){
c=2;
}
else{
g=Double.parseDouble(str);
calculater();
str=""+f;
et.setText(str);
c=2;
flag=1;
vi=v;
}}
}
});
5.3.3 设定符号键 乘 ‘ * ’
fuhao[2].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(str!=""){
if(vi==fuhao[0]||vi==fuhao[1]||vi==fuhao[2]||vi==fuhao[3]){
c=3;
}
else{
g=Double.parseDouble(str);
calculater();
str=""+f;
et.setText(str);
c=3;
flag=1;
vi=v;
}}
}
});
5.3.4 设定符号键 除 /
fuhao[3].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(str!=""){
if(vi==fuhao[0]||vi==fuhao[1]||vi==fuhao[2]||vi==fuhao[3]){
c=4;
}
else{
g=Double.parseDouble(str);
calculater();
str=""+f;
et.setText(str);
c=4;
flag=1;
vi=v;
}}
}
});
5.3.5 设定符号键 等号 =
fuhao[4].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(str!=""&&vi!=fuhao[0]&&vi!=fuhao[1]&&vi!=fuhao[2]&&vi!=fuhao[3]){
g=Double.parseDouble(str);
calculater();
str=""+f;
et.setText(str);
flag=1;
vi=v;
}
}
});
5.3.6 审定符号键 小数点 .
fuhao[5].setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(str==""){
str+=".";
et.setText(str);
}
else{
char ch1[];int x=0;
ch1=str.toCharArray();
for(int i=0;i<ch1.length;i++)
if(ch1[i]=='.')
x++;
if(x==0){
str+=".";
et.setText(str);
}
}
6.程序中调用的name,在string.xml 中写入以下程序:
<string name="hello">Hello World, deom03!</string>
<string name="app_name">简单计算器</string>
<string name="one">1</string>
<string name="two">2</string>
<string name="three">3</string>
<string name="fore">4</string>
<string name="five">5</string>
<string name="six">6</string>
<string name="seven">7</string>
<string name="eight">8</string>
<string name="nine">9</string>
<string name="zero">0</string>
<string name="jia">+</string>
<string name="jian">-</string>
<string name="cheng">*</string>
<string name="chu">/</string>
<string name="dengyu">=</string>
<string name="zhengfu">+/-</string>
<string name="dihao">.</string>
<string name="ping">x²</string>
<string name="kai">√x</string>
<string name="shanchu">ce</string>
<string name="shan">c</string>
</resources>
7 修改图标和名称
目前的简单计算器看起来还不太像是一个正式的软件,为什么呢?因为都还没有一个像样的图标呢。一直使用ADT自动生成的图标确实不太合适,是时候需要换一下了。
这里我事先准备好了一张图片来作为软件图标,由于我也不是搞美术的,因此图标设计得非常简单,如图21所示。
图 21
将这张图片命名成icon.png,放入res/ drawable-hdpi目录,然后修改main.xml中的代码,如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo03.app"
android:versionCode="1"
android:versionName="1.0" >
……
<application
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
……
</application>
</manifest>
这里将<application>标签的android:icon属性指定成icon .png就可以修改程序图标了。接下来我们还需要修改一下程序的名称,打开res/values/string.xml文件,其中app_name对应的就是程序名称,将它修改成简单计算器即可,如下所示:
<resources>
<string name="app_name">简单计算器</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
</resources>
由于更改了程序图标和名称,我们需要先将简单计算器卸载掉,然后重新运行一遍程序,这时观察简单计算器的桌面图标,如图所示。
养成良好的习惯,仍然不要忘记提交代码。
git add .
git commit -m "修改程序图标和名称。"
git push origin master
这样我们就终于大功告成了!