简介

实现了一个计时器APP,程序界面简洁,只有一个时间显示区域和两个图片按钮,一个按钮是开始/暂停,另一个按钮是停止。

功能介绍

  • 一个显示界面,当最小计时单位为0.1秒时,显示为:分钟:秒:0.1秒。例如:03:18:9;当最小计时单位为1秒时,显示为:分钟:秒。例如:04:23

  • 两个按钮,左边的是开始计时,计时过程中点击为暂停计时功能右边的按钮为停止计时功能。



  • 菜单功能有两个,

    设置计时器单位有两种可选,1秒和0.1秒



代码实现

  • 时间展示

            if (1000 == mlTimerUnit) {
    // 秒
    settingTimerUnitFlg = SETTING_SECOND_ID;
    tvTime.setText(R.string.init_time_second);
    } else if (100 == mlTimerUnit) {
    // 0.1秒
    settingTimerUnitFlg = SETTING_100MILLISECOND_ID;
    tvTime.setText(R.string.init_time_100millisecond);
    }
                            // 设置时间展示
    int min = (totalSec / 60);
    int sec = (totalSec % 60);
    try{
    if (SETTING_SECOND_ID == settingTimerUnitFlg) {
    // 秒
    tvTime.setText(String.format("%1$02d:%2$02d", min, sec));
    } else if (SETTING_100MILLISECOND_ID == settingTimerUnitFlg) {
    // 0.1秒
    tvTime.setText(String.format("%1$02d:%2$02d:%3$d", min, sec, yushu));
    }
    } catch(Exception e) {
    tvTime.setText("" + min + ":" + sec + ":" + yushu);
    e.printStackTrace(); }
    break;

    其中变量具体含义为

    图变量定义

  • 开始暂停按钮

        View.OnClickListener startPauseListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    if (null == timer) {
    if (null == task) {
    task = new TimerTask() {
    @Override
    public void run() {
    if (null == msg) {
    msg = new Message();
    } else {
    msg = Message.obtain();
    }
    msg.what = 1;
    handler.sendMessage(msg);
    }
    };
    }
    timer = new Timer(true);
    timer.schedule(task, mlTimerUnit, mlTimerUnit);
    }
    // 开始
    if (!bIsRunningFlg) {
    bIsRunningFlg = true;
    } else { // 暂停
    try{
    bIsRunningFlg = false;
    task.cancel();
    task = null;
    timer.cancel(); // 取消计时
    timer.purge();
    timer = null;
    handler.removeMessages(msg.what);
    } catch(Exception e) {
    e.printStackTrace();
    }
    }
    }
    };
  • 停止计时按钮

        // 停止
    View.OnClickListener stopListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    if (null != timer) {
    task.cancel();
    task = null;
    timer.cancel(); // 取消计时
    timer.purge();
    timer = null;
    handler.removeMessages(msg.what);
    }
    mlCount = 0;
    bIsRunningFlg = false;
    if (SETTING_SECOND_ID == settingTimerUnitFlg) {
    // 秒
    tvTime.setText(R.string.init_time_second);
    } else if (SETTING_100MILLISECOND_ID == settingTimerUnitFlg) {
    // 100 毫秒
    tvTime.setText(R.string.init_time_100millisecond);
    }
    }
    };
  • 设置菜单

    public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    设置子菜单

    // 设置子菜单的名称
    SubMenu settingMenu = menu.addSubMenu(0, SETTING_TIMER_UNIT_ID, 0, R.string.menu_setting_timer_unit).setIcon(R.drawable.setting);
    // 按对应的名称增加子菜单
    settingMenu.add(1, SETTING_SECOND_ID, 0, R.string.menu_setting_second);
    settingMenu.add(1, SETTING_100MILLISECOND_ID, 1, R.string.menu_setting_100milisec);
    // 退出
    menu.add(0, EXIT_ID, 2, R.string.menu_exit).setIcon(R.drawable.exit);

    选择菜单

        public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
    case SETTING_TIMER_UNIT_ID:
    break;
    case EXIT_ID:
    finish(); // 退出应用
    break;
    case SETTING_SECOND_ID: // 秒
    if (SETTING_SECOND_ID != settingTimerUnitFlg) {
    mlTimerUnit = 1000;
    settingTimerUnitFlg = SETTING_SECOND_ID;
    }
    tvTime.setText(R.string.init_time_second);
    break;
    case SETTING_100MILLISECOND_ID: // 100毫秒
    if (SETTING_100MILLISECOND_ID != settingTimerUnitFlg) {
    mlTimerUnit = 100;
    settingTimerUnitFlg = SETTING_100MILLISECOND_ID;
    }
    tvTime.setText(R.string.init_time_100millisecond);
    break;
    default:
    break;
    }
  • 遇到的问题

    菜单项现在显示不出来,原本最初还是右上角有三个点的菜单项,但是奇妙的是过了一段时间后运行发现那个菜单项不显示了,开始以为是代码出错了,检查之后发现没有问题,觉得可能是系统不显示了,网上有很多解决这个问题的办法,但尝试多次后都没有用,然后又尝试了使用不同的方法创建菜单,结果都不显示,后来看到这篇文章安卓模拟器的菜单键找不到在什么位置,觉得我可能跟这个一样吧,后来又查找到在虚拟机上运行时,按快捷键Ctrl+M可以显示菜单,尝试之后我的菜单项终于出来了!虽然还是不能直接显示。

反思与总结

这个APP的功能很少,待改进的地方很多,应该说从一开始就没想着做一个很复杂的APP,对自己的要求太低了。但是从这个过程中还是学到了一些技巧,希望以后能继续加油,争取做处更好的。

暑假App的更多相关文章

  1. 20172321 20172333 2017-2018 暑假作业APP

    20172321 20172333 2017-2018 暑假作业APP 项目介绍 项目成员 吴恒佚 20172321 严域俊 20172333 项目简介 从理论上来说,这是一个贪吃蛇游戏. <贪 ...

  2. 暑假作业app博客

    一.光照传感器 界面 简介 运用了传感器类,通过手机的感应区根据当时的光照强度显示出数据. 核心代码 protected void onCreate(Bundle savedInstanceState ...

  3. 二维码跳转不同的 app store

    说道二维码 之前是用来跳转app store  然后在就是出来的 扫码付款什么的 用的很平常,其实里面也很简单   自己刚开始接触的时候     同事说要做一个二维码下载 应用 => 我=懵逼 ...

  4. 兜转数年,老跳成了卖过软件开过店写过APP的电脑老师

    老跳(因为性格太跳,被大家公认的外号),87年生,湖南人,上篇中老赵的大学下铺兄弟. 2008年大学毕业两人一同去的广州,住在求职公寓里找工作. 老赵找工作找了半个月,老跳却在到广州的第二天就开始上班 ...

  5. 20172328 暑假作业 之 实现安卓小程序Enjoy-all

    20172328 暑假作业 之 实现安卓小程序Enjoy-all 项目介绍 项目名称: Enjoy - all 项目简介: 本项目基于Java语言和Anroid Studio软件,实现了简单的冒泡.屏 ...

  6. APP分析之海豚睡眠

    APP分析之海豚睡眠 产品:海豚睡眠 引文 由于笔者暑假经常晚睡,导致在习惯性失眠.长时间睡眠不足,导致头脑反应迟钝,还整日无精打采,不知所措.一个偶然的机会,在一个燥热的夜晚,眼看又是一个不眠之夜, ...

  7. 2017-2018-20172311 暑期编程作业:APP

    2017-2018-20172311 暑期编程作业:实现一个简单倒计时APP 写在前面:暑假的时候就单纯的想要设计一个倒计时软件,然后就通过查阅资料等学了一些,包括实现倒计时功能及显示:背景音乐的添加 ...

  8. 雪球、牛股王这种股票类App 到底能否帮你赚到钱?

    核心观点 股民这个大群体,是需要区分对待的:其中包含一小部分有自己独立判断能力的投资者和一大群没有自己判断能力(尽管他们经常觉得自己有)的普通散户. 当前的互联网证券类App,确实很难保证帮股民赚到钱 ...

  9. 20172305 暑假作业 之 TimeCalculate & Save Iron Man

    20172305 暑假作业 之 TimeCalculate & Save Iron Man TimeCalculate 项目介绍 项目名称: TimeCalculate 项目简介: 本项目基于 ...

随机推荐

  1. Codeforces Round #483 (Div. 2) B题

    B. Minesweeper time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  2. jQuery实现全选、全不选以及反选操作

    在写购物车案例时实现全选操作使用的是js的getAttribute()setAttribute()方法获取checked属性的值是undefined实现完成之后全选操作,如果在全选中的情况下改变其中一 ...

  3. java 关于String

    1.两种创建方式 String str1 = "abc"; //字面量创建 String str2 = new String("abc"); //构造方法创建 ...

  4. java 一个数字的位数不够怎么在前面加0

    import java.text.DecimalFormat; //(1).如果数字1是字符串,如下处理: String str1="1"; DecimalFormat df=ne ...

  5. 完美解决 Cydia 不能上网

    国行手机比美版.港版.韩版手机新增了网络授权的功能,iOS 10 及以上系统版本,任何应用首次打开,如果有请求网络的行为,都会提示网络请求授权的对话框. 首次打开 Cydia 并没有提示网络请求授权的 ...

  6. 写 5 个你知道的 HTML5 标签,说明他们的意义

    1:<canvas>标签   定义图形.图像,是基于javascript的绘图API 2:<video>标签   定义视频 3:<audio>标签  定义音频内容 ...

  7. pyhton3解决"tuple parameter unpacking is not supported"问题

    准备将键值对中的键与值对调,结果第10行出了bug,显示"tuple parameter unpacking is not supported" 解决方法:将map(lambda( ...

  8. www.pantom.top

    新建小站 https://www.pantom.top

  9. 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(2)

    主要解决 vs2017中,printf无法打印数据的问题. 在keil环境下正常使用printf功能,但是以下的重定向代码在vs2017下使用不了: #ifdef __GNUC__ /* With G ...

  10. 20155202 20155222 信息安全技术概论实验一 PGP的使用

    20155202 信息安全技术概论实验一 PGP的使用 实验原理 一.PGP简介 在现代社会里,电子邮件和网络上的文件传输已经成为生活的一部分.邮件的安全问题也就突出了,大家都知道在互联网上传输的数据 ...