android Stopwatch实例

2023-11-17

Stopwatch 实例

package net.baisoft.stopwatch;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements Runnable {
	
	/**
	 * ��ǰ����ʱ��
	 */
	private long time = 0;
	
	/**
	 * ��ʼʱ��
	 */
	private long startTime;

	private Handler handler;
	
	/**
	 * ������ʾʱ��
	 */
	private TextView timeView;
	
	/**
	 * �����б���ʾ�ּ�ʱ��
	 */
	private ListView listView;
	
	/**
	 * ��ʼ��ť
	 */
	private Button startButton;
	
	/**
	 * ��ͣ��ť
	 */
	private Button pauseButton;
	
	/**
	 * �ּǰ�ť
	 */
	private Button markButton;
	
	/**
	 * ���ð�ť
	 */
	private Button resetButton;
	
	/**
	 * �ּ�ʱ�����
	 */
	private List<Long> marks;
	
	/**
	 * ���ĵ�ǰ״̬
	 * ��Ϊ�������С���ͣ��ֹͣ����״̬
	 */
	private int state = 0;
	
	private  static int STATE_RUNNING = 1;
	private  static int STATE_STOP = 0;
	private  static int STATE_PAUSE = 2;
	
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //��ȡ������Ϣ��ƫ�� ��
        readEnvironment();
        Toast.makeText(this, "�����Ѷ�ȡ", Toast.LENGTH_LONG).show();
        
        //��ʼ��ť
        startButton = (Button)findViewById(R.id.start);
        startButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				onStartClick(view);
			}
		});
        
        //��ͣ��ť
        pauseButton = (Button)findViewById(R.id.pause);
        pauseButton.setOnClickListener(new OnClickListener() {
        	@Override
        	public void onClick(View view) {
        		onPauseClick(view);
        	}
        });
        
        //�ּǰ�ť
        markButton = (Button) findViewById(R.id.mark);
        markButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				onMarkClick(view);
			}
		});
        
        //���ð�ť
        resetButton = (Button) findViewById(R.id.reset);
        resetButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				onResetClick(view);
			}
		});
        
        timeView = (TextView) findViewById(R.id.timeView);
        listView = (ListView) findViewById(R.id.ListView01);
        
        //���� handler
        handler = new Handler();
        
        // ���ø���ť
        setButtons();
        
        //����ʱ����ʾ
        if (state == STATE_STOP){
        	timeView.setText("Let's Run!");
        } else if(state == STATE_PAUSE){
        	timeView.setText(getFormatTime(time));
        }
		
        //��ʾ�б�
        refreshMarkList();
    }

    /**
     * ���״̬���ð�ť��ʾ�ڲ���ʾ
     */
	private void setButtons() {
		switch (state) {
		case 1://�����������
			startButton.setVisibility(View.GONE);
			pauseButton.setVisibility(View.VISIBLE);
			markButton.setVisibility(View.VISIBLE);
			resetButton.setVisibility(View.GONE);
			resetButton.setEnabled(false);
			break;
		case 2://�����ͣ��
			startButton.setVisibility(View.VISIBLE);
			pauseButton.setVisibility(View.GONE);
			markButton.setVisibility(View.GONE);
			resetButton.setVisibility(View.VISIBLE);
			resetButton.setEnabled(true);
			break;
		case 0://���ֹͣ��
			startButton.setVisibility(View.VISIBLE);
			pauseButton.setVisibility(View.GONE);
			markButton.setVisibility(View.GONE);
			resetButton.setVisibility(View.VISIBLE);
			resetButton.setEnabled(false);
			break;
		default:
			break;
		}
	}

    /**
     * ��ȡ����
     */
    @SuppressWarnings("unchecked")
	private void readEnvironment() {
    	SharedPreferences sharedPreferences = getSharedPreferences("environment", MODE_PRIVATE);
    	state = sharedPreferences.getInt("state", STATE_STOP);
    	startTime = sharedPreferences.getLong("startTime", 0);
    	time = sharedPreferences.getLong("time", 0);
    	
    	marks = new ArrayList<Long>();
    	SharedPreferences sharedPreferencesMarks = getSharedPreferences("marks", MODE_PRIVATE);
    	Map<String, Long> mapMarks = (Map<String, Long>) sharedPreferencesMarks.getAll();
    	for (int i = 0; i < mapMarks.size(); i++){
    		Long mark = mapMarks.get("" + i);
    		marks.add(mark);
    	}
    	
	}
    /**
     * ���滷��
     */
    private void saveEnvironment() {
    	SharedPreferences sharedPreferences = getSharedPreferences("environment", MODE_PRIVATE);
    	Editor editor = sharedPreferences.edit();
    	editor.putInt("state", state);
    	editor.putLong("time", time);
    	editor.putLong("startTime", startTime);
    	editor.commit();
    	
    	//����ּ����
    	SharedPreferences sharedPreferencesMarks = getSharedPreferences("marks", MODE_PRIVATE);
    	Editor editorMarks = sharedPreferencesMarks.edit();
    	editorMarks.clear();
    	for(Long mark : marks){
    		editorMarks.putLong(""  + marks.indexOf(mark), mark.longValue());
    	}
    	editorMarks.commit();
    }

	@Override
	protected void onPause() {
		super.onPause();
		if (state == STATE_RUNNING){//�����������
			handler.removeCallbacks(this);
		}
		
	}


	@Override
	protected void onDestroy() {
		super.onDestroy();
		//���滷��
		saveEnvironment();
		Toast.makeText(this, "��ǰ�����ѱ���", Toast.LENGTH_LONG).show();
	}

	@Override
	protected void onResume() {
		super.onResume();
		if (state == STATE_RUNNING){//�����������
			handler.post(this);
		}
	}

	/**
     * �������
     * @param view
     */
    protected void onResetClick(View view) {
    	//����״̬Ϊֹͣ
    	state = STATE_STOP;
    	
    	//����ˢ��
    	if (state == STATE_RUNNING){//�����������
			handler.removeCallbacks(this);
		}
    	
    	//��ʼ���ּ�����
		marks = new ArrayList<Long>();
		refreshMarkList();
		
		//����ʱ����ʾ
		time = 0;
		timeView.setText(getFormatTime(time));
		
		// ���ø���ť
        setButtons();
	}

    /**
     * �����ͣ
     * @param view
     */
	protected void onPauseClick(View view) {
		//����ˢ��
		if (state == STATE_RUNNING){//�����������
			handler.removeCallbacks(this);
		}
    	
		//����״̬Ϊ��ͣ
		state = STATE_PAUSE;
		
		// ���ø���ť
        setButtons();
	}

	/**
     * �����ʼ
     * @param view
     */
	protected void onStartClick(View view) {
		startTime = new Date().getTime() - time;
		
		handler.post(this);
		
		//��ʼ���ּ�����
		marks = new ArrayList<Long>();
		
		//����״̬Ϊ��������
		state = STATE_RUNNING;
		
		// ���ø���ť
        setButtons();
	}

	/**
	 * ����ּ�
	 * 
	 * @param view
	 */
	protected void onMarkClick(View view) {
		
		if(time == 0){
			return;
		}
		// ��ӷּ����, ���ļ�����ǰ��
		marks.add(0, time);
		
		//ˢ���б�
		refreshMarkList();
	}

	/**
	 * ˢ���б�
	 */
	private void refreshMarkList() {
		//��ʾ
		List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
		int no = marks.size();//���
		for(long mark : marks){
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("mark", getFormatTime(mark));
			map.put("no", this.getString(R.string.mark) + no);
			no--;
			data.add(map);
			
		}
		String[] from = new String[]{"no","mark"};
		int[] to = new int[]{R.id.no, R.id.time};
		SimpleAdapter simpleAdapter = new SimpleAdapter(this, data, R.layout.item, from, to);
		listView.setAdapter(simpleAdapter);
	}
	@Override
	public void run() {
		handler.postDelayed(this, 50);
		time = new Date().getTime() - startTime;
		timeView.setText(getFormatTime(time));
	}

	/**
	 * �õ�һ����ʽ����ʱ��
	 * 
	 * @param time
	 * 			ʱ�� ����
	 * @return �֣��룺����
	 */
	private String getFormatTime(long time) {
		long millisecond = time % 1000;
		long second = (time / 1000) % 60;
		long minute = time / 1000 / 60;
		
		//�����µ�ֻ��ʾһλ
		String strMillisecond = "" + (millisecond / 100);
		//����ʾ��λ
		String strSecond = ("00" + second).substring(("00" + second).length() - 2);
		//����ʾ��λ
		String strMinute = ("00" + minute).substring(("00" + minute).length() - 2);
		
		return strMinute + ":" + strSecond + ":" + strMillisecond;
	}
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android Stopwatch实例 的相关文章

  • 在java中将StreamWriter转换为OutputStream?

    我正在尝试使用 System setOut 将 System out 重定向到字符串 它需要一个 PrintStream 有什么方法可以将 StringWriter 转换为 Stream 以便我可以将其传递给 setOut 吗 你不能完全这
  • 尝试使用 Eclipse 启动 Glassfish 服务器时出现 org.apache.catalina.LifecycleException

    我一直忙于使用 angularjs 前端构建一个 REST 应用程序 使用 MAVEN jersey quickstart webapp 使用 GLASSFISH Web 服务器在 Eclipse 上开发 今天 当我开始对项目进行一些开发时
  • 在 Java Swing 中检测 JScrollPane 上的 mouseClick 事件

    如果我有这样的东西 我可以使用布尔标志 performAdjustment 控制自动滚动 static boolean performAdjustment true JTextArea textArea new JTextArea JScr
  • 如何使用 SLF4J 和 Log4j2 记录 FATAL(或任何自定义日志级别)

    我有那些具体的要求 需要能够登录FATAL level 需要使用SLF4J 需要使用Log4j2 现在 这是我的执行 final Logger logger LoggerFactory getLogger HelloWorld class
  • JavaEE 8 教程,在 hello1 项目上部署失败

    我正在尝试学习 Java EE 8 我遵循了官方指南https javaee github io tutorial https javaee github io tutorial 但我有这个问题 cargo maven2 plugin 1
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • JPanel透明背景和显示元素[重复]

    这个问题在这里已经有答案了 我插入一个背景图e 变成 aJPanel但一些界面元素消失了 以下 Java Swing 元素不会出现 标签标题 标签 usuario 标签 密码 按钮加速器 你能否使图像透明或元素不透明 setOpaque f
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • Maven + Cobertura:无法找到[您的班级]。你指定了源目录吗?

    我有 MyMath 类 有两个简单的方法 multi 和 add 和测试类只会测试多种方法 public class MainTest Test public void testMultiply MyMath tester new MyMa
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • 您能让 Tomcat 6 stdout.log 文件表现得像 log4j DailyRollingFileAppender 吗?

    我们使用的是 Tomcat 6 的 Windows 安装 默认情况下 我们应用程序的 log4j 输出将转到 catalina base logs stdout log 文件 该日志文件仅在我们重新启动 Tomcat 时滚动 并且文件名始终
  • java JFileChooser 文件大小过滤器

    我知道我可以按文件类型进行过滤 但是可以按文件大小进行过滤吗 例如 JFileChooser 仅显示 3 MB 以内的图片 简短的回答应该是 你尝试过什么 长答案是肯定的 JFileChooser fc new JFileChooser f
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • 当容器大小更改时,JTable 仅调整选定列的大小

    对于面板内的 JTable 如果面板变大 我如何将额外的空间仅分配给某些列 在我的例子中 分配给最后一列 尽管提供 第 3 4 列和8 将获得额外的空间 我想允许用户手动更改所有列的列大小 我尝试了 table setAutoResizeM
  • java中的比较器链

    正在阅读Oracle 关于接口的 Java 教程 https docs oracle com javase tutorial java IandI createinterface html其中给出了一个例子Card 打牌 我试图理解接口中的
  • 使用 Maven 3 时 Cobertura 代码覆盖率为 0%

    读完这篇文章后 将 Cobertura 与 Maven 3 0 2 一起使用的正确方法是什么 https stackoverflow com questions 6931360 what is the proper way to use c
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat

随机推荐

  • element的遮罩层v-loading,隐藏上面的文字和图标,添加自定义内容

    element的遮罩层v loading 隐藏上面的文字和图标 添加自定义内容 之前有个需求是想要一个遮罩层 项目组件用的是element 想用v loading 但是上面的图标和文字格式不是我想要的 效果图 思路如下 1 隐藏自带的文字和
  • go语言的iota是什么意思_Go语言学习——三分钟看透iota

    Go语言学习 三分钟看透iota 源起枚举 最近做需求时 有一个需要枚举的场景 大概有10 个枚举类型 不愿意像定义一个开关那样敷衍的写成 const SwitchOff 0 SwitchOn 1 显得不够精致 于是想到了iota 深入了解
  • 基于Keras的卷积神经网络手写数字识别

    coding utf 8 Created on Sun Aug 1 16 22 47 2021 author Yang Hongyun 构建卷积神经网络模型代码 import tensorflow as tf import keras ke
  • 使用Keras进行LSTM实战

    0 前言 在上文中进行ARIMA时序预测后 了解到强大的LSTM在处理时序预测有更为优秀的表现 因此对LSTM进行了学习 LSTM是一种时间递归神经网络 它出现的原因是为了解决RNN的一个致命的缺陷 原生的RNN会遇到一个很大的问题 叫做T
  • Redis主从集群

    Redis主从集群 1 集群结构 我们搭建的主从集群结构如图 共包含三个节点 一个主节点 两个从节点 这里我们会在同一台虚拟机中开启3个redis实例 模拟主从集群 信息如下 IP PORT 角色 192 168 150 101 7001
  • 文件上传 拿 shell

    启动docker开启镜像环境 成功在主机上访问到 根据弱密码tomcat tomcat登陆管理后台 在下面位置可以找到上传点 上传对应的war文件 先把一剑jsp马保存到zip压缩包中 再修改后缀名为war上传 可以看到上传成功 连接成功
  • 获取表单中某个元素,返回数组

    获取id为editForm的表中中所有input元素的对象 input editForm 获取每个input中name和val var ret input editForm each function var nm this attr na
  • OpenWrt后台管理启用https-OpenSSL

    OpenWrt 默认使用http 访问管理后台 这样不安全 推荐修改为 https 访问 加密数据传输 本文介绍配置步骤 1 卸载旧的ssl软件包 root OpenWrt opkg remove luci ssl px5g px5g mb
  • 深入《C++ Core Guidelines解析》:提升C++编程实践的关键指南

    目录 1 写在前面 2 推荐理由 3 内容介绍 4 作者介绍 5 赠书 or 购买 1 写在前面 C Core Guidelines是一个正在进行的开源项目 通过将广泛认可的现代C 上佳实践集中在一个地方来解决这些问题 Core Guide
  • Kylin--简介及图解架构

    Kylin简介 Kylin 麒麟 的诞生背景 Kylin的应用场景 为什么要使用Kylin Kylin的总体架构 Kylin 麒麟 的诞生背景 ebay 中国团队研发的 是第一个真正由中国人自己主导 从零开始 自主研发 并成为Apache顶
  • Linux中创建文件与文件夹

    一 创建文件夹 命令 mkdir 文件夹名 例 一开始home目录下没有test文件夹 命令创建后生成 二 创建文件 命令 touch 文件名 例 一开始test文件夹下没有boot properties 命令创建后生成 三 注意事项 创建
  • linux下挂载移动硬盘(ntfs格式),Linux下挂载移动硬盘(NTFS格式)

    工作中遇到linux系统 Red Hat Enterprise5 7 挂载希捷ntfs格式移动硬盘 会跳出一个ERROR提示框 The volume EAGET NQH user the ntfs file system which is
  • arcpy导入报错 “ImportRrror: No module named arcpy”

    在使用ArcGIS自带的Python IDLE处理数据的时候 导入arcpy报错 ImportError No module named arcpy 我遍历了各解决方法依然无法成功导入arcpy 后经过查询 探索 通过如下方法得以成功解决
  • aoj1303

    继续python系列 python能够自动推断类型这个太好用了 根本不用声明类型 自己根据运行情况推断出所用的类型 所以在定义函数的时候根本不用声明参数的类型 下面这个题目aoj1303 求2的指数 如下 def gethex a li w
  • 关于飞书的告警通知,这里有个更好的办法

    飞书 是字节跳动于2016年自研的新一代一站式协作平台 是保障字节跳动全球五万人高效协作的办公工具 飞书将即时沟通 日历 云文档 云盘和工作台深度整合 通过开放兼容的平台 让成员在一处即可实现高效的沟通和流畅的协作 全方位提升企业效率 20
  • Git 使用

    Git 一 Git基础 1 Git介绍 Git是目前世界上最先进的分布式版本控制系统 2 Git与Github 2 1 两者区别 Git是一个分布式版本控制系统 简单的说其就是一个软件 用于记录一个或若干文件内容变化 以便将来查阅特定版本修
  • 模板类、模板函数的模板类型显式实例化及其用途(转载)

    转载自 C 11模板隐式实例化 显式实例化声明 定义 简单易懂 云飞扬 Dylan的博客 CSDN博客 模板隐式实例化 1 隐式实例化 在代码中实际使用模板类构造对象或者调用模板函数时 编译器会根据调用者传给模板的实参进行模板类型推导然后对
  • 【LAMMPS系列】LAMMPS软件安装资料包

    大家好 我是粥粥 LAMMPS 是一种经典的分子动力学代码 专注于材料建模 它是大型原子 分子大规模并行模拟器的首字母缩略词 LAMMPS 具有固态材料 金属 半导体 和软物质 生物分子 聚合物 以及粗粒或中等系统的势函数 它可用于模拟原子
  • 自定义多数据源JDBC连接池

    背景 公司需要对各个客户的数据库进行统一管理 故涉及到对多个不同数据库进行连接 传统的数据库连接池无法满足需求 故结合网上的自定义数据库连接池 进行的改进 代码如下 注意 由于代码处于公司环境 有直接使用肯定是会有报错 相信这种简单的修补是
  • android Stopwatch实例

    Stopwatch 实例 package net baisoft stopwatch import java util ArrayList import java util Date import java util HashMap imp