简介

实现了一个计时器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. Excel工作表保护的密码破解与清除...假装自己破解密码系列?

    有一次我女朋友让我帮忙解一个excel表格的保护密码,然后~用了宏 网上下载来的Excel经常会有工作表保护,也就是无法修改,妄图做任何修改的时候你就会看见这句话: 您试图更改的单元格或图表位于受保护 ...

  2. 推荐一个网址:在线检查Yam文件语法格式的错误

    最近在学习Docker和K8S内容时候,经常会遇到要自己写一些容器部署或者组件部署的yaml文件. 但是苦于没有彻底熟悉yaml,有时候要到kubectl creat -f path 部署命令执行后, ...

  3. (1-1)入门—最简单的树(使用json数据)

    1.<!DOCTYPE html>是必须的. 2.zTree 的容器 className 别忘了设置为 "ztree". 使用ztree创建树,首先要引用ztree相关 ...

  4. ajax与jsonp定义及使用方法

    ajax 定义 ajax技术的目的是让javascript发送http请求,与后台通信,获取数据和信息. ajax通信的过程不会影响后续javascript的执行,从而实现异步. 同步和异步 现实生活 ...

  5. 二·、spring成长之路——委派设计模式和单例设计模式

    3.委派设计模式 设计思想:就是多个类去完成一项的工作,其中一个类去分发任务,其他类做具体的任务,而具体表现是这个委派类的工作,具体过程是被委派类来操作的 [ITask.java]定义工作的统一标准 ...

  6. JSP声明和JSP指令

    JSP声明 JSP 声明用来定义程序中使用的实体,如变量.方法和类. 语法格式:<%!  变量/方法/类的声明  %> 例如: <%! String str="欢迎&quo ...

  7. 从零开始的Python学习Episode 15——正则表达式

    正则表达式 正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现,所以使用时要导入re模块.正则表达式模式被编译成一系列的字节码 ...

  8. python财经数据接口包Tushare pro的入门及简单使用方式(大数据,股票数据接口)

    最近在做一个项目,需要用到股票的数据,我在网上查了很久,最终发现在股票数据上面还是tushare比较专业,而且对于将来做金融行业的大数据这一块的,tushare绝对是你的一个好帮手,所以下面我就简单介 ...

  9. ruby 记一次查看方法定义位置

    今天在回头看JSON类的时候,发现有一个语法特别诡异 JSON(str),一开始以为是一种类的特殊语法,结果问了群里大神才知道,就是定义了一个JSON(str)方法,但是我没有找到定义该方法的地方,问 ...

  10. 20155211 2016-2017-2 《Java程序设计》第十周学习总结

    20155211 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输 在实际传输数据以前需要将域 ...