Android基础知识(简单实例计算器)

 Android基础知识(简单实例计算器)

在做这个计算器的时候,我认为主要分为两部分:界面设计,功能实现。


(效果图)



界面设计:

其实界面设计和功能实现是相互联系在一起的,我界面怎么去设计,功能就要去怎么实现。

1、控件:界面有19个按钮,数字1-9和小数点、加减乘除、清空回退、百分比、等号,还有一个显示内容的文本框。实现起来十分简单只要拖动到xml中即可。

2、布局设计:刚拖进来的控件都摆放得比较凌乱,需要对其调整,本案例中,我会使用LinearLayout对界面进行布局。

3、样式:有背景颜色、边框线颜色、圆角。

接下来先看样式文件:

简单说明一下:

  • gradient   -- 对应颜色渐变。 startcolor、endcolor就不多说了。android:angle 是指从哪个角度开始变。
  • solid      --  填充。
  • stroke  --  描边。
  • corners  --  圆角。
  • padding   -- 定义内容离边界的距离。 与android:padding_left、android:padding_right这些是一个道理。

先介绍white_bg.xml,也就是显示内容的文本框的样式文件:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!--圆角-->
    <corners android:radius="5dp" />
    <!--边框线-->
    <stroke
        android:width="1dp"
        android:color="#000" />
    <!--填充-->
    <solid android:color="#FFF" />
</shape>

接下来介绍白色键的样式文件white_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<pre name="code" class="html">  <item android:drawable="@drawable/white_bg" />
 <item android:drawable="@drawable/gray_bg" android:state_pressed="true" /> 
</selector>

第一个item是调用上一个样式white_bg.xm为默认情况下的样式第二个item是调用了gray_bg.xml样式文件,根据其android:state_pressed="true"属性,意为点击时的样式。

<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="5dp" />
    <solid android:color="#ccc" />
</shape>

接下来介绍白色键的样式文件orange_selector.xml

<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:drawable="@drawable/ashen" android:state_pressed="true" />
    <item android:drawable="@drawable/orange_bg" />
    
</selector>

第一个item是调用了ashen.xml样式文件,根据其android:state_pressed="true"属性,意为点击时的样式。

<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="5dp" />
    <solid android:color="#F5F5F5" />
</shape>

第二个item是调用样式orange_bg.xm为默认情况下的样式:

<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="5dp" />
    <solid android:color="#FF6100" />
</shape>


在activity_main.xml的空间中分别去调用 white_bgwhite_selectororange_selector

功能实现:

在实现功能前,先要分清楚他们之间的关系:

1、数字0-9和小数点

2、加减乘除

3、清除与回删键

4、等号

5、百分比

public class MainActivity extends Activity implements View.OnClickListener {
    Button btn_0, btn_1, btn_2, btn_3, btn_4, btn_5, btn_6, btn_7, btn_8, btn_9; //数字0-9
    Button btn_dian; //小数点

    Button btn_C, btn_del;  //清除和回删

    Button btn_yu; //求余
    Button btn_chu; //除法
    Button btn_cheng; //乘法
    Button btn_jia;  //加法
    Button btn_jian; //减法
    Button btn_deng;  //等于

    EditText input;//显示内容文本框

    boolean clear_ed; //是否情况文本框

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_C = (Button) findViewById(R.id.btn_C);
        btn_del = (Button) findViewById(R.id.btn_del);
        btn_yu = (Button) findViewById(R.id.btn_yu);
        btn_chu = (Button) findViewById(R.id.btn_chu);
        btn_cheng = (Button) findViewById(R.id.btn_cheng);
        btn_jia = (Button) findViewById(R.id.btn_jia);
        btn_jian = (Button) findViewById(R.id.btn_jian);
        btn_deng = (Button) findViewById(R.id.btn_deng);
        btn_dian = (Button) findViewById(R.id.btn_dian);
        btn_9 = (Button) findViewById(R.id.btn_9);
        btn_8 = (Button) findViewById(R.id.btn_8);
        btn_7 = (Button) findViewById(R.id.btn_7);
        btn_6 = (Button) findViewById(R.id.btn_6);
        btn_5 = (Button) findViewById(R.id.btn_5);
        btn_4 = (Button) findViewById(R.id.btn_4);
        btn_3 = (Button) findViewById(R.id.btn_3);
        btn_2 = (Button) findViewById(R.id.btn_2);
        btn_1 = (Button) findViewById(R.id.btn_1);
        btn_0 = (Button) findViewById(R.id.btn_0);
        input = (EditText) findViewById(R.id.input);

        btn_0.setOnClickListener(this);
        btn_1.setOnClickListener(this);
        btn_2.setOnClickListener(this);
        btn_3.setOnClickListener(this);
        btn_4.setOnClickListener(this);
        btn_5.setOnClickListener(this);
        btn_6.setOnClickListener(this);
        btn_7.setOnClickListener(this);
        btn_8.setOnClickListener(this);
        btn_9.setOnClickListener(this);

        btn_yu.setOnClickListener(this);
        btn_chu.setOnClickListener(this);
        btn_cheng.setOnClickListener(this);
        btn_jia.setOnClickListener(this);
        btn_jian.setOnClickListener(this);
        btn_deng.setOnClickListener(this);
        btn_dian.setOnClickListener(this);

        btn_C.setOnClickListener(this);
        btn_del.setOnClickListener(this);

    }


    @Override
    public void onClick(View v) {
        String str = input.getText().toString();
        if (str.equals("0")) {
            str = "";
        }

        switch (v.getId()) {
            case R.id.btn_0:
            case R.id.btn_1:
            case R.id.btn_2:
            case R.id.btn_3:
            case R.id.btn_4:
            case R.id.btn_5:
            case R.id.btn_6:
            case R.id.btn_7:
            case R.id.btn_8:
            case R.id.btn_9:
            case R.id.btn_dian:

                if (clear_ed) {
                    clear_ed = false;
                    str = "";
                    input.setText("0");  //重置为0
                }
                input.setText(str + ((Button) v).getText());  //根据按钮的setText来添加数字
                break;
            case R.id.btn_jia:
            case R.id.btn_jian:
            case R.id.btn_cheng:
            case R.id.btn_chu:
                input.setText(str + " " + ((Button) v).getText() + " ");  //为区分加减乘除和数字 特意留了空格为间隔,
                break;

            case R.id.btn_C:
                input.setText("0");  //重置为0
                break;

            case R.id.btn_del:

                if (input.length() <= 1 || input.getText().toString().equals("")) {
                    input.setText("0");
                } else {
                    input.setText(str.substring(0, str.length() - 1));  // 删除末尾一个数  由0开始 到str长度减1.
                }
                break;


            case R.id.btn_deng:
                getResult();
                break;

            case R.id.btn_yu:
                Double d3 = Double.parseDouble(str);
                Double d4 = d3 * 0.01;
                input.setText(d4 + "");
                break;
        }

    }

    private void getResult() {
        String exp = input.getText().toString();
        if (exp == null || exp.equals("")) {  //如果exp为空的话结束
            return;
        }
        if (!exp.contains(" ")) {//如果exp没有为预算法预留的“空格”的话结束
            return;
        }

        clear_ed = true;

        double result = 0;
        String s1 = exp.substring(0, exp.indexOf(" ")); //定义s1的内容是 运算符前的那串数字
        String op = exp.substring(exp.indexOf(" ") + 1, exp.indexOf(" ") + 2);//运算符
        String s2 = exp.substring(exp.indexOf(" ") + 3); //定义s2的内容是 运算符前的那串数字

        System.out.println(s1);
        System.out.println(op);
        System.out.println(s2);

        if (!s1.equals("") && !s2.equals("")) {    //分四种情况来写,s1 s2都不为null。s1 为null,s2不为。s1不为,s2为空。s12都为空的
            double d1 = Double.parseDouble(s1);  //转化为double型
            double d2 = Double.parseDouble(s2);

            if (op.equals("+")) {        //加法运算
                result = d1 + d2;
            } else if (op.equals("-")) { //减法运算
                result = d1 - d2;
            } else if (op.equals("×")) { //乘法运算
                result = d1 * d2;
            } else if (op.equals("÷")) { //除法运算
                if (d2 == 0) {  //如果分母为0,那么结果为0
                    result = 0;
                } else {
                    result = d1 / d2;
                }
            }
            //将算好了的结果,再根据是否包含小数点来 决定输出的结果类型:整型还是双精度型
            if (!s1.contains(".") && !s2.contains(".")) {  //如果s1、s2都不包含小数点,那么他们是整型
                int r = (int) result; //转化为int型
                input.setText(r + "");
            } else {
                input.setText(result + "");
            }
        } else if (!s1.equals("") && s2.equals("")) { //如果s1不为空,s2为空
            input.setText(exp); //结果不作处理,原样输出
        } else if (s1.equals("") && s2.equals("")) { //都为空
            input.setText(exp); //结果不作处理,原样输出
        } else if (s1.equals("") && !s2.equals("")) { //如果s1为空,s2不为空

            double d2 = Double.parseDouble(s2);

            if (op.equals("+")) {        //加法运算
                result = 0 + d2;
            } else if (op.equals("-")) { //减法运算
                result = 0 - d2;
            } else if (op.equals("×")) { //乘法运算
                result = 0;
            } else if (op.equals("÷")) { //除法运算
                result = 0;
            }

            //将算好了的结果,再根据是否包含小数点来 决定输出的结果类型:整型还是双精度型
            if (!s2.contains(".")) {  //如果s1、s2都不包含小数点,那么他们是整型
                int r = (int) result; //转化为int型
                input.setText(r + "");
            } else {
                input.setText(result + "");
            }
        }
    }
}


后期再添加些注释,先偷会懒。




本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

Android之广播与服务<一> - 2016-07-25 19:07:17

转发请注明出处: http://blog.csdn.net/qq_28055429/article/details/52014058 前言:作为四大组件成员--广播和服务,虽然在用户使用时它们通常是隐身的,但是好多地方都有它们的身影,如:发送短信,状态栏通知,夜间模式,后台音乐播放等等.... One  ----------- 广播: 一,基本知识: (1)名字: BroadcastReceiver (2)作用: 用于监听系统全局的广播消息,以便实现系统中不同组件之间的通信 (3)经常用途 :飞行模式,后
1、图像坐标系 如图2.1所示,以图像左上角为原点建立以像素为单位的直接坐标系u-v。像素的横坐标u与纵坐标v分别是在其图像数组中所在的列数与所在行数。(在OpenCV中u对应 x,v对应y) 由于(u,v)只代表像素的列数与行数,而像素在图像中的位置并没有用物理单位表示出来,所以,我们还要建立以物理单位(如毫米)表示的图像坐标系x-y。将相机光轴 与图像平面的交点(一般位于图像平面的中心处,也称为图像的主点(principal point)定义为该坐标系的原点O1,且x轴与u轴平行,y轴与v轴平行,假
ART世界探险(6) - 流程控制指令 分支结构 Java分支结构 我们先来个最简单的,比较大小吧。 public static long bigger ( long a, long b){ if (a=b){ return a; } else { return b; } } public static int less ( int a, int b){ if (a=b){ return a; } else { return b; } } 看看Java字节码是个什么样子: public static lo
Handler机制算是我入门源码的第一节。看得比较仔细。体会较多。mark一下。 顺序:先科普一下Handler基本功,然后再细讲下源码 一、Handler目的: 目的:Handler机制来处理了子线程去更新UI线程控件问题。 二、handler,messagequeue,looper,message关系图: 其实各种书籍上都有这么一张图。但是主要是学习源码,所以还是自己手画一张“流程图”。 三、handler知识点总结: ( 若以下总结都能理解,那么可以不再看本文后续源码分析; ) 1)handler、

ART世界探险(5) - 计算指令 - 2016-07-25 18:07:28

ART世界探险(5) - 计算指令 整数运算 Java的整型运算 我们先看看JVM是如何处理这些基本整数运算的吧。 public static long add ( long a, long b){ return a+b; } public static long sub ( long a, long b){ return a-b; } public static long mul ( long a, long b){ return a*b; } public static long div ( long
大部分的软件, 但凡包含登录注册的, 基本都会有选择头像功能, 而其中做的比较有逼格的, 一般会有一个选择框可以裁剪照片。 本文所需要实现的就是这样一种有 逼格 的效果: 右上角加了个图片框,按下确定可以裁剪正方形区域里的图片并显示在右上角。 实现思路: 1:首先需要自定义一个ZoomImageView来显示我们需要的图片,这个View需要让图片能够以合适的位置展现在当前布局的图片展示区域内(合适的位置值的是:如果图片长度大于屏幕,则压缩图片长度至屏幕宽度,高度等比压缩并居中显示,如果图片高度大于屏幕,则

注解使用入门(一) - 2016-07-25 18:07:18

注解使用入门(一) 本篇博客要讲解主要分为以下几个问题 注解的相关知识点 基于运行时的注解的例子解析说明 至于关于编译时的注解,待下篇博客的时候会结合例子讲解一下,目前我也正在学习当中 注解的相关知识点 提到注解,大多数人应该都不默认,在我们程序中见到的@Override,@Deprected,@SupressWarnings等等,这些都是注解,只不过是系统自己封装好的,而我们平时比较少去深入理解是怎样实现的? 1)什么是注解(Annotation): Annotation(注解)就是Java提供了一种元

android-----我眼中的Binder - 2016-07-25 18:07:17

        Binder作为进程间通信方式(IPC)的一种,算Android中比较难理解的部分了,今天计划以自己所认识的framework层的Binder原理来做个总结,好了,我们开始吧!         Android中利用Binder通信,首先肯定需要获得Binder对象了,但是系统服务和我们自定义服务Binder对象的获取方式是不一样的,原因就在于系统服务是在系统启动的时候被注册到ServiceManegr的,我们只需要通过ServiceManager.getService(String nam
使用xml作为数据交互的载体是Android中非常重要的功能,比如天气预报数据、短信备份数据、通讯录数据都可以以xml的格式通过网络传输。 为了演示Xml数据的操作,我模拟了一个短信备份的案例。 需求:界面如图1-10所示。上面是三个Button,前两个分别对应两种不同方式生成xml,第三个Button点击后解析备份的xml文件,然后将数据展现在下面的ScrollView中。短信数据是模拟的假数据。 生成的xml格式如文件1-10。 【文件1-10】 xml文件格式 1. ?xml version="1.
这篇博客我们来介绍一下责任链模式(Chain-of-responsibility Pattern),责任联模式又称为职责链模式,是 行为型设计模式 之一。顾名思义,责任链模式中存在一个链式结构,多个节点首尾相连,每个节点都可以被拆开再连接,因此,链式结构具有很好的灵活性。将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首段发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,这就是责任链或者职责链的通俗定义。 转载请注明出处: h