android自定义秒表(精确到0.1秒,带计次功能)
2015-11-23 18:25
387 查看
1,首先看下Activity,秒表的实现主要通过Handler延迟发送消息来实现的,因为我们这里是精确到0.1秒,所以延迟100ms进行发送。具体实现看下面代码:
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private TextView minuteTv, secondTv, longmillTv;
private Button resetBtn, startBtn;
private ListView listView;
private TimeAdapter adapter;
private ArrayList<String> list = new ArrayList<String>();
private boolean isPaused = false;
private String timeUsed;// 传入adapter的数据
private long longmillTime;
private boolean leftBtnFlag = false;// 判断是复位还是计次,ture为计次
private boolean rightBtnFlag = true;// 判断是开始还是暂停,true为开始
private static final int TICK_WHAT = 2;
private static final int TIME_TO_SEND = 100;
private Handler uiHandle = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case TICK_WHAT:
if (!isPaused) {
addTimeUsed();
updateClockUI();
}
uiHandle.sendEmptyMessageDelayed(TICK_WHAT, TIME_TO_SEND);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private void initView() {
minuteTv = (TextView) findViewById(R.id.minute);
secondTv = (TextView) findViewById(R.id.second);
longmillTv = (TextView) findViewById(R.id.longmill);
listView = (ListView) findViewById(R.id.listview);
resetBtn = (Button) findViewById(R.id.reset);
startBtn = (Button) findViewById(R.id.start_and_stop);
if (leftBtnFlag) {
resetBtn.setText("计次");
} else {
resetBtn.setText("复位");
}
if (rightBtnFlag) {
startBtn.setText("启动");
} else {
startBtn.setText("暂停");
}
adapter = new TimeAdapter(this, list);
listView.setAdapter(adapter);
}
private void setListener() {
resetBtn.setOnClickListener(this);
startBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.reset:
if (rightBtnFlag) {
uiHandle.removeMessages(TICK_WHAT);
longmillTime = 0;
minuteTv.setText("00");
secondTv.setText("00");
longmillTv.setText("0");
list.removeAll(list);
adapter.notifyDataSetChanged();
} else {
list.add(timeUsed);
adapter.notifyDataSetChanged();
}
break;
case R.id.start_and_stop:
rightBtnFlag = !rightBtnFlag;
if (rightBtnFlag) {
startBtn.setText("启动");
resetBtn.setText("复位");
leftBtnFlag = false;
isPaused = true;
uiHandle.removeMessages(TICK_WHAT);
} else {
startBtn.setText("暂停");
resetBtn.setClickable(true);
startTime();
resetBtn.setText("计次");
leftBtnFlag = true;
isPaused = false;
}
break;
default:
break;
}
}
private void startTime() {
uiHandle.sendEmptyMessageDelayed(TICK_WHAT, TIME_TO_SEND);
}
/**
* 更新时间的显示
*/
private void updateClockUI() {
minuteTv.setText(getMin());
secondTv.setText(getSec());
longmillTv.setText(getLongMill());
}
public void addTimeUsed() {
longmillTime += 100;
timeUsed = this.getMin() + ":" + this.getSec() + ":" + this.getLongMill();
}
/**得到分*/
public String getMin() {
long min = (longmillTime) / 60000;
return min < 10 ? "0" + min : min + "";
}
/**得到秒*/
public String getSec() {
long sec = (longmillTime / 1000) % 60;
return sec < 10 ? "0" + sec : sec + "";
}
/**得到0.1秒*/
public String getLongMill() {
long longmill = (longmillTime / 100) % 10;
return longmill + "";
}
@Override
protected void onPause() {
super.onPause();
isPaused = true;
}
@Override
protected void onResume() {
super.onResume();
isPaused = false;
}
}
-------------------------------------------------------------------------------------
下面看adapter的代码,通过重写构造传入数据再显示到界面。
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class TimeAdapter extends BaseAdapter{
private ArrayList<String> datas;
private LayoutInflater inflater;
public TimeAdapter(Context context,ArrayList<String> list) {
this.datas = list;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return datas==null?0:datas.size();
}
@Override
public Object getItem(int position) {
return datas == null?null:datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_time, null);
holder.countTv = (TextView) convertView.findViewById(R.id.time_count);
holder.recordTv = (TextView) convertView.findViewById(R.id.time_record);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.countTv.setText("计次"+(position+1));
holder.recordTv.setText(datas.get(position));
return convertView;
}
class ViewHolder{
TextView countTv,recordTv;
}
}
布局文件很
4000
简单就不帖了,下面会给源码。
http://download.csdn.net/detail/sucrelee/9293681
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener {
private TextView minuteTv, secondTv, longmillTv;
private Button resetBtn, startBtn;
private ListView listView;
private TimeAdapter adapter;
private ArrayList<String> list = new ArrayList<String>();
private boolean isPaused = false;
private String timeUsed;// 传入adapter的数据
private long longmillTime;
private boolean leftBtnFlag = false;// 判断是复位还是计次,ture为计次
private boolean rightBtnFlag = true;// 判断是开始还是暂停,true为开始
private static final int TICK_WHAT = 2;
private static final int TIME_TO_SEND = 100;
private Handler uiHandle = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case TICK_WHAT:
if (!isPaused) {
addTimeUsed();
updateClockUI();
}
uiHandle.sendEmptyMessageDelayed(TICK_WHAT, TIME_TO_SEND);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private void initView() {
minuteTv = (TextView) findViewById(R.id.minute);
secondTv = (TextView) findViewById(R.id.second);
longmillTv = (TextView) findViewById(R.id.longmill);
listView = (ListView) findViewById(R.id.listview);
resetBtn = (Button) findViewById(R.id.reset);
startBtn = (Button) findViewById(R.id.start_and_stop);
if (leftBtnFlag) {
resetBtn.setText("计次");
} else {
resetBtn.setText("复位");
}
if (rightBtnFlag) {
startBtn.setText("启动");
} else {
startBtn.setText("暂停");
}
adapter = new TimeAdapter(this, list);
listView.setAdapter(adapter);
}
private void setListener() {
resetBtn.setOnClickListener(this);
startBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.reset:
if (rightBtnFlag) {
uiHandle.removeMessages(TICK_WHAT);
longmillTime = 0;
minuteTv.setText("00");
secondTv.setText("00");
longmillTv.setText("0");
list.removeAll(list);
adapter.notifyDataSetChanged();
} else {
list.add(timeUsed);
adapter.notifyDataSetChanged();
}
break;
case R.id.start_and_stop:
rightBtnFlag = !rightBtnFlag;
if (rightBtnFlag) {
startBtn.setText("启动");
resetBtn.setText("复位");
leftBtnFlag = false;
isPaused = true;
uiHandle.removeMessages(TICK_WHAT);
} else {
startBtn.setText("暂停");
resetBtn.setClickable(true);
startTime();
resetBtn.setText("计次");
leftBtnFlag = true;
isPaused = false;
}
break;
default:
break;
}
}
private void startTime() {
uiHandle.sendEmptyMessageDelayed(TICK_WHAT, TIME_TO_SEND);
}
/**
* 更新时间的显示
*/
private void updateClockUI() {
minuteTv.setText(getMin());
secondTv.setText(getSec());
longmillTv.setText(getLongMill());
}
public void addTimeUsed() {
longmillTime += 100;
timeUsed = this.getMin() + ":" + this.getSec() + ":" + this.getLongMill();
}
/**得到分*/
public String getMin() {
long min = (longmillTime) / 60000;
return min < 10 ? "0" + min : min + "";
}
/**得到秒*/
public String getSec() {
long sec = (longmillTime / 1000) % 60;
return sec < 10 ? "0" + sec : sec + "";
}
/**得到0.1秒*/
public String getLongMill() {
long longmill = (longmillTime / 100) % 10;
return longmill + "";
}
@Override
protected void onPause() {
super.onPause();
isPaused = true;
}
@Override
protected void onResume() {
super.onResume();
isPaused = false;
}
}
-------------------------------------------------------------------------------------
下面看adapter的代码,通过重写构造传入数据再显示到界面。
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class TimeAdapter extends BaseAdapter{
private ArrayList<String> datas;
private LayoutInflater inflater;
public TimeAdapter(Context context,ArrayList<String> list) {
this.datas = list;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return datas==null?0:datas.size();
}
@Override
public Object getItem(int position) {
return datas == null?null:datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.list_time, null);
holder.countTv = (TextView) convertView.findViewById(R.id.time_count);
holder.recordTv = (TextView) convertView.findViewById(R.id.time_record);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.countTv.setText("计次"+(position+1));
holder.recordTv.setText(datas.get(position));
return convertView;
}
class ViewHolder{
TextView countTv,recordTv;
}
}
布局文件很
4000
简单就不帖了,下面会给源码。
http://download.csdn.net/detail/sucrelee/9293681
相关文章推荐
- AS3脚本编写的计时器效果代码
- Node.js中使用计时器定时执行函数详解
- sliderToggle在写jquery的计时器setTimeouter中不生效
- JS 页面计时器示例代码
- Android Wear计时器开发
- javascript实现的简单计时器
- js仿苹果iwatch外观的计时器代码分享
- JavaScript计时器示例分析
- javascript计时器详解
- android开发教程之间隔执行程序(android计时器)
- python实现简单的计时器功能函数
- Android中CountDownTimer倒计时器用法实例
- 一个iOS上的秒表小应用的实现方法分享
- android之计时器(Chronometer)的使用以及常用的方法
- JavaScript计时器示例分析
- CCIE SP-RIPv1 小结
- Objective-C: Using NSTimer
- JavaScript 计时
- 计时器 进度条