简介

实现了一个计时器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. 『ACM C++』 PTA 天梯赛练习集L1 | 025-026

    满课一天,做25的时候还疯狂WA,进度可以说是很慢了 哭泣 ------------------------------------------------L1-025---------------- ...

  2. 在CentOS7上安装MySQL5.7-源码包方式

    缺点:后期升级不方便,生产中建议RPM包方式安装 CentOS7默认安装了和MySQL有兼容性的MariaDB数据库,在我们安装MySQL5.7之前为了避免发生冲突首先删除MariaDB. # rpm ...

  3. python2与python3的input函数的区别

    Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型. Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获 ...

  4. 有关MySQL数据库命令

    phpstudy使用最终端打开数据库 : 第一次打开默认的密码是:root. 进入后对数据可以进行增删查改. show databases;  是查看数据库的指令 注意:分号是数据库的结束符,没有加分 ...

  5. MongoDB 简单上手

    MongoDB 是什么 MongoDB 是一种非关系型数据库(NoSQL). MongoDB中的术语解释 文档(document):形如 { name: "sue", <-- ...

  6. Redis 之武林大会 - 哨兵(Sentinel)

    前言 Redis在出从复制的模式下,一旦主节点由于故障不能提供服务,需要人工降从节点晋升为主节点,同时还要通知应用方更新主节点的地址,在很多应用场景下,这样的故障处理方式是无法被接受的.不过幸运的是R ...

  7. maven添加本地jar

    maven有时需要添加了一些本地jar,记录下流程 1.在项目名下创建一个文件夹,起名为lib吧,放要的jar放进去 2.然后打开jar在的路径,打开命令窗口,执行 mvn install:insta ...

  8. Redis对象类型

    Redis对象类型 Redis基于基础的数据结构创建的对象: 字符串对象. 列表对象. 哈希对象. 集合对象 有序集合对象. 对象回收:Redis对象系统实现了基于引用计数技术的内存回收机制,当程序不 ...

  9. MySQL优化#参数配置优化

    ( 1).查看mysql里的线程,观察是否有长期运行或阻塞的sql: show full processlist 经查看,没有发现相关线程,可排除该原因 (2).疑似mysql连接使用完成后没有真正释 ...

  10. (译)我为什么用Go语言来做区块链——Syed Jafar Naqvi——Co-Founder/CEO at Karachain

    原文地址:https://medium.com/karachain/why-i-am-building-a-blockchain-in-go-6395a60b24dd Go语言现在常常被用来做去中心化 ...