Android实现秒表计时器的程序设计

[java] view plain copy
  1. package com.min;  

  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.util.Timer;  
  6. import java.util.TimerTask;  

  7. import android.app.Activity;  
  8. import android.app.AlertDialog;  
  9. import android.content.Context;  
  10. import android.content.DialogInterface;  
  11. import android.content.SharedPreferences;  
  12. import android.os.Bundle;  
  13. import android.os.Handler;  
  14. import android.os.Message;  
  15. import android.util.Log;  
  16. import android.view.KeyEvent;  
  17. import android.view.Menu;  
  18. import android.view.MenuItem;  
  19. import android.view.SubMenu;  
  20. import android.view.View;  
  21. import android.widget.ImageButton;  
  22. import android.widget.TextView;  

  23. publicclass MyTimer extends Activity {  
  24. privatelong mlCount = 0;  
  25. privatelong mlTimerUnit = 100;  
  26. private TextView tvTime;  
  27. private ImageButton btnStartPause;  
  28. private ImageButton btnStop;  
  29. private Timer timer = null;  
  30. private TimerTask task = null;  
  31. private Handler handler = null;  
  32. private Message msg = null;  
  33. privateboolean bIsRunningFlg = false;  
  34. privatestaticfinal String MYTIMER_TAG = "MYTIMER_LOG";   

  35. // menu item
  36. privatestaticfinalint SETTING_TIMER_UNIT_ID = Menu.FIRST;  
  37. privatestaticfinalint ABOUT_ID = Menu.FIRST + 1;  
  38. privatestaticfinalint EXIT_ID = Menu.FIRST + 2;  
  39. privatestaticfinalint SETTING_SECOND_ID = Menu.FIRST + 101;  
  40. privatestaticfinalint SETTING_100MILLISECOND_ID = Menu.FIRST + 102;  

  41. // Setting timer unit flag
  42. privateint settingTimerUnitFlg = SETTING_100MILLISECOND_ID;  


  43. /** Called when the activity is first created. */
  44. @Override
  45. publicvoid onCreate(Bundle savedInstanceState) {  
  46. super.onCreate(savedInstanceState);  
  47.         setContentView(R.layout.main);  

  48.         tvTime = (TextView)findViewById(R.id.tvTime);  
  49.         btnStartPause = (ImageButton)findViewById(R.id.btnStartPaunse);  
  50.         btnStop = (ImageButton)findViewById(R.id.btnStop);  

  51.         SharedPreferences sharedPreferences = getSharedPreferences("mytimer_unit", Context.MODE_PRIVATE);  
  52. //getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
  53.         mlTimerUnit = sharedPreferences.getLong("time_unit"100);  
  54.         Log.i(MYTIMER_TAG, "mlTimerUnit = " + mlTimerUnit);  

  55. if (1000 == mlTimerUnit) {  
  56. // second
  57.             settingTimerUnitFlg = SETTING_SECOND_ID;  
  58.             tvTime.setText(R.string.init_time_second);  
  59.         } elseif (100 == mlTimerUnit) {  
  60. // 100 millisecond
  61.             settingTimerUnitFlg = SETTING_100MILLISECOND_ID;  
  62.             tvTime.setText(R.string.init_time_100millisecond);  
  63.         }  

  64. // Handle timer message
  65.         handler = new Handler(){  
  66. @Override
  67. publicvoid handleMessage(Message msg) {  
  68. // TODO Auto-generated method stub
  69. switch(msg.what) {  
  70. case1:  
  71.                     mlCount++;  
  72. int totalSec = 0;  
  73. int yushu = 0;  

  74. if (SETTING_SECOND_ID == settingTimerUnitFlg) {  
  75. // second
  76.                         totalSec = (int)(mlCount);  
  77.                     } elseif (SETTING_100MILLISECOND_ID == settingTimerUnitFlg) {  
  78. // 100 millisecond
  79.                         totalSec = (int)(mlCount / 10);  
  80.                         yushu = (int)(mlCount % 10);  
  81.                     }  

  82. // Set time display
  83. int min = (totalSec / 60);  
  84. int sec = (totalSec % 60);  
  85. try{  
  86. if (SETTING_SECOND_ID == settingTimerUnitFlg) {  
  87. // second(1000ms)
  88.                             tvTime.setText(String.format("%1$02d:%2$02d", min, sec));  
  89.                         } elseif (SETTING_100MILLISECOND_ID == settingTimerUnitFlg) {  
  90. // 100 millisecond
  91.                             tvTime.setText(String.format("%1$02d:%2$02d:%3$d", min, sec, yushu));  
  92.                         }  
  93.                     } catch(Exception e) {  
  94.                         tvTime.setText("" + min + ":" + sec + ":" + yushu);  
  95.                         e.printStackTrace();  
  96.                         Log.e("MyTimer onCreate""Format string error.");  
  97.                     }  
  98. break;  

  99. default:  
  100. break;  
  101.                 }  

  102. super.handleMessage(msg);  
  103.             }  

  104.         };  

  105.         btnStartPause.setOnClickListener(startPauseListener);  
  106.         btnStop.setOnClickListener(stopListener);  
  107.     }  

  108. // Start and pause
  109.     View.OnClickListener startPauseListener = new View.OnClickListener() {  

  110. @Override
  111. publicvoid onClick(View v) {  
  112. // TODO Auto-generated method stub
  113.             Log.i(MYTIMER_TAG, "Start/Pause is clicked.");  

  114. if (null == timer) {  
  115. if (null == task) {  
  116.                     task = new TimerTask() {  

  117. @Override
  118. publicvoid run() {  
  119. // TODO Auto-generated method stub
  120. if (null == msg) {  
  121.                                 msg = new Message();  
  122.                             } else {  
  123.                                 msg = Message.obtain();  
  124.                             }  
  125.                             msg.what = 1;  
  126.                             handler.sendMessage(msg);  
  127.                         }  

  128.                     };  
  129.                 }  

  130.                 timer = new Timer(true);  
  131.                 timer.schedule(task, mlTimerUnit, mlTimerUnit); // set timer duration
  132.             }  

  133. // start
  134. if (!bIsRunningFlg) {  
  135.                 bIsRunningFlg = true;  
  136.                 btnStartPause.setImageResource(R.drawable.pause);  
  137.             } else { // pause
  138. try{  
  139.                     bIsRunningFlg = false;  
  140.                     task.cancel();  
  141.                     task = null;  
  142.                     timer.cancel(); // Cancel timer
  143.                     timer.purge();  
  144.                     timer = null;  
  145.                     handler.removeMessages(msg.what);  
  146.                     btnStartPause.setImageResource(R.drawable.start);  
  147.                 } catch(Exception e) {  
  148.                     e.printStackTrace();  
  149.                 }  
  150.             }  
  151.         }  

  152.     };  

  153. // Stop
  154.     View.OnClickListener stopListener = new View.OnClickListener() {  

  155. @Override
  156. publicvoid onClick(View v) {  
  157. // TODO Auto-generated method stub
  158.             Log.i(MYTIMER_TAG, "Stop is clicked.");  

  159. if (null != timer) {  
  160.                 task.cancel();  
  161.                 task = null;  
  162.                 timer.cancel(); // Cancel timer
  163.                 timer.purge();  
  164.                 timer = null;  
  165.                 handler.removeMessages(msg.what);  
  166.             }  

  167.             mlCount = 0;  
  168.             bIsRunningFlg = false;  
  169.             btnStartPause.setImageResource(R.drawable.start);  

  170. if (SETTING_SECOND_ID == settingTimerUnitFlg) {  
  171. // second
  172.                 tvTime.setText(R.string.init_time_second);  
  173.             } elseif (SETTING_100MILLISECOND_ID == settingTimerUnitFlg) {  
  174. // 100 millisecond
  175.                 tvTime.setText(R.string.init_time_100millisecond);  
  176.             }  
  177.         }  

  178.     };  


  179. // Menu
  180. @Override
  181. publicboolean onCreateOptionsMenu(android.view.Menu menu) {  
  182. // TODO Auto-generated method stub
  183. super.onCreateOptionsMenu(menu);  

  184.         Log.i(MYTIMER_TAG, "Menu is created.");  

  185. // Stop timer
  186. if (null != task) {  
  187.             task.cancel();  
  188.             task = null;  
  189.         }  
  190. if (null != timer) {  
  191.             timer.cancel(); // Cancel timer
  192.             timer.purge();  
  193.             timer = null;  
  194.             handler.removeMessages(msg.what);  
  195.         }  

  196.         bIsRunningFlg = false;  
  197.         mlCount = 0;  
  198.         btnStartPause.setImageResource(R.drawable.start);  

  199. // 设置子菜单的名称 
  200.         SubMenu settingMenu = menu.addSubMenu(0, SETTING_TIMER_UNIT_ID, 0, R.string.menu_setting_timer_unit).setIcon(R.drawable.setting);  

  201. // 按对应的名称增加子菜单
  202. // Sub menus do not support item icons, or nested sub menus.
  203.         settingMenu.add(1, SETTING_SECOND_ID, 0, R.string.menu_setting_second);    
  204.         settingMenu.add(1, SETTING_100MILLISECOND_ID, 1, R.string.menu_setting_100milisec);    

  205. // About
  206.         menu.add(0, ABOUT_ID, 1, R.string.menu_about).setIcon(R.drawable.about);  

  207. // 退出
  208.         menu.add(0, EXIT_ID, 2, R.string.menu_exit).setIcon(R.drawable.exit);  

  209. returntrue;  
  210.     }  

  211. // Menu item
  212. @Override
  213. publicboolean onOptionsItemSelected(MenuItem item) {  
  214. // TODO Auto-generated method stub
  215.         Log.i(MYTIMER_TAG, "Menu item is selected.");  

  216. switch(item.getItemId()) {  
  217. case SETTING_TIMER_UNIT_ID:  
  218. break;  

  219. case ABOUT_ID:  
  220. // Display about dialog
  221.                 AlertDialog.Builder builder = new AlertDialog.Builder(this);  
  222.                 builder.setTitle(R.string.app_name)  
  223.                        .setMessage("本程序由雨梦开发/n联系作者:minyugong@163.com")  
  224.                        .setCancelable(true)  
  225.                        .setPositiveButton("确定"new DialogInterface.OnClickListener() {  
  226. publicvoid onClick(DialogInterface dialog, int id) {  
  227.                                dialog.cancel();  
  228.                            }  
  229.                        });  
  230.                 AlertDialog alert = builder.create();  
  231.                 alert.show();  
  232. break;  

  233. case EXIT_ID:  
  234.                 finish(); // Exit application
  235. break;  

  236. case SETTING_SECOND_ID: // 秒(1000ms)
  237. if (SETTING_SECOND_ID != settingTimerUnitFlg) {  
  238.                     mlTimerUnit = 1000;  
  239.                     settingTimerUnitFlg = SETTING_SECOND_ID;  
  240.                 }  
  241.                 tvTime.setText(R.string.init_time_second);  
  242. break;  

  243. case SETTING_100MILLISECOND_ID: // 100毫秒
  244. if (SETTING_100MILLISECOND_ID != settingTimerUnitFlg) {  
  245.                     mlTimerUnit = 100;  
  246.                     settingTimerUnitFlg = SETTING_100MILLISECOND_ID;  
  247.                 }  
  248.                 tvTime.setText(R.string.init_time_100millisecond);  
  249. break;  

  250. default:  
  251.                 Log.i(MYTIMER_TAG, "Other menu item...");  
  252. break;  
  253.         }  

  254. // Save timer unit
  255. try{  
  256.             SharedPreferences sharedPreferences = getSharedPreferences("mytimer_unit", Context.MODE_PRIVATE);  
  257.             SharedPreferences.Editor editor = sharedPreferences.edit();//获取编辑器
  258.             editor.putLong("time_unit", mlTimerUnit);  
  259.             editor.commit();//提交修改
  260.         } catch(Exception e) {  
  261.             e.printStackTrace();  
  262.             Log.e(MYTIMER_TAG, "save timer unit error.");  
  263.         }  


  264. returnsuper.onOptionsItemSelected(item);  
  265.     }  


  266. @Override
  267. publicboolean onKeyDown(int keyCode, KeyEvent event) {  
  268. // TODO Auto-generated method stub
  269. if (KeyEvent.KEYCODE_MENU == keyCode) {  
  270. super.openOptionsMenu();  // 调用这个,就可以弹出菜单

  271.             Log.i(MYTIMER_TAG, "Menu key is clicked.");  

  272. // Stop timer
  273. if (null != task) {  
  274.                 task.cancel();  
  275.                 task = null;  
  276.             }  
  277. if (null != timer) {  
  278.                 timer.cancel(); // Cancel timer
  279.                 timer.purge();  
  280.                 timer = null;  
  281.                 handler.removeMessages(msg.what);  
  282.             }  

  283.             bIsRunningFlg = false;  
  284.             mlCount = 0;  
  285.             btnStartPause.setImageResource(R.drawable.start);  

  286. returntrue;  
  287.         }  

  288. returnsuper.onKeyDown(keyCode, event);  
  289.     }  

  290. }  
</p>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值