简介

实现了一个计时器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. python的requests模块爬取网页内容

    注意:处理需要用户名密码认证的网站,需要auth字段. # -*- coding:utf-8 -*- import requests headers = { "User-Agent" ...

  2. Linux(CentOS7)设置自动备份数据库到阿里云OSS

    环境:阿里云服务器CentOS7.4 + MySQL5.6 基本思路: 1.编写shell脚本,备份数据库到指定目录下 2.编写Python脚本,把文件上传到OSS 3.把shell脚本和Python ...

  3. js 修改字符串中某些字符的样式

    var str = 'abcdefghijklmnobqrstuvwxyz'; function HightLight(e){ var reg = new RegExp(e, 'g') str = s ...

  4. Mac os安装golang开发环境

    为了能够愉快地进行golang编程,我们需要安装以下几样东西: 包管理Homebrew 语言环境golang 版本管理git 虚拟器docker 编译器Goland 我将按照这个顺序叙述整个安装过程 ...

  5. 梯度下降、随机梯度下降、方差减小的梯度下降(matlab实现)

    梯度下降代码: function [ theta, J_history ] = GradinentDecent( X, y, theta, alpha, num_iter ) m = length(y ...

  6. EntityFramework6.1自动生成复数名称数据表的问题

    遇到一个很奇怪的问题,两个程序部署在两个不同的机器上,一个是.net 4.6.1另外一个是.net 4.0的运行时,两个项目都引用了EntityFramework6.1.3.程序分别执行后,4.0环境 ...

  7. 第八周课上额外项目:pwd的实现

    项目要求: 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 并且上交博客链接. 实验步骤 我首先不懂pwd到底是个 ...

  8. java开发划分级别的标准

    一.史诗序: java开发也有一段时间了,整天茫茫碌碌,除了偶尔的小有成就感,剩下的大部分好像都在重复,你是否也遇到了这样的情况? 遇到一个小细节问题,之前不久解决过,现在却是什么都记不起来了 面对每 ...

  9. python 多线程笔记(3)-- 线程的私有命名空间

    线程的私有命名空间实现: threading_namespace = threading.local() import threading import time import random thre ...

  10. Dlib简介及在windows7 vs2013编译过程

    Dlib是一个C++库,包含了许多机器学习算法.它是跨平台的,可以应用在Windows.Linux.Mac.embedded devices.mobile phones等.它的License是Boos ...