zoukankan      html  css  js  c++  java
  • 暑假App

    简介

    实现了一个计时器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,对自己的要求太低了。但是从这个过程中还是学到了一些技巧,希望以后能继续加油,争取做处更好的。

  • 相关阅读:
    部署 AppGlobalResources 到 SharePoint 2010
    还原一个已删除的网站集
    使用仪表板设计器配置级联筛选器 (SharePoint Server 2010 SP1)
    File or arguments not valid for site template
    Pex and Moles Documentation
    Content Query Webpart匿名访问
    Running Moles using NUnit Console from Visual Studio
    Calling a WCF Service using jQuery in SharePoint the correct way
    Updating Content Types and Site Columns That Were Deployed as a Feature
    asp.net中判断传过来的字符串不为空的代码
  • 原文地址:https://www.cnblogs.com/YiYiYi/p/10048312.html
Copyright © 2011-2022 走看看