大致的布局差不多,加了个背景
布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_stopwatch"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="41dp"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:textColor="@color/white"
android:textSize="23sp"
android:text="秒表"/>
<TextView
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/darkgrey"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="3">
<TextView
android:id="@+id/tv_timemain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_centerInParent="true"
android:textColor="@color/white"
android:textSize="72sp"
android:text="00:00.00"/>
<TextView
android:id="@+id/tv_times"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/tv_timemain"
android:layout_alignRight="@+id/tv_timemain"
android:textColor="@color/grey"
android:textSize="22sp"
android:text="00:00.00" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/darkgrey"/>
<RelativeLayout
android:layout_weight="3"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.example.stopwatch.RoundImageView
android:id="@+id/rimg_set"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/white"/>
<TextView
android:id="@+id/tv_set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="@color/green"
android:textSize="18sp"
android:text="启动"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_cal"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="50dp"
android:alpha="0.7"
android:background="@null">
<ImageView
android:id="@+id/img_cal"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/selector_cal"/>
<TextView
android:id="@+id/tv_cal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textColor="@color/yellow"
android:textSize="18sp"
android:text="计次"/>
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
<LinearLayout
android:layout_weight="2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/lst_cal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:overScrollMode="never"
android:divider="@null"></ListView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
启动时
计次功能
复位后便全部清零
功能实现代码
package com.example.stopwatch;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class StopWatchActivity extends Activity {
private TextView tv_timemain,tv_times;
private TextView tv_set,tv_cal;
private RoundImageView rimg_set;
private ImageView img_cal;
private ListView lst_cal;
private RelativeLayout rl_cal;
private TimeAdapter adapter;
private boolean isStart;
private int time = 0;
private int flag_time = 0;
private List<String> list = new ArrayList<String>();
private List<String> list2 = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stopwatch);
findView();
}
private void findView() {
tv_timemain = (TextView) findViewById(R.id.tv_timemain);
tv_times = (TextView) findViewById(R.id.tv_times);
tv_set = (TextView) findViewById(R.id.tv_set);
tv_cal = (TextView) findViewById(R.id.tv_cal);
rimg_set = (RoundImageView) findViewById(R.id.rimg_set);
img_cal = (ImageView) findViewById(R.id.img_cal);
lst_cal = (ListView) findViewById(R.id.lst_cal);
rl_cal = (RelativeLayout) findViewById(R.id.rl_cal);
rimg_set.setOnClickListener(new myOnclick());
img_cal.setOnClickListener(new myOnclick());
img_cal.setClickable(false);
adapter = new TimeAdapter(getApplicationContext(), list2);
lst_cal.setAdapter(adapter);
}
@SuppressLint("NewApi")
protected class myOnclick implements OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.rimg_set:
StartOrStopTime();
break;
case R.id.img_cal:
calAndStop();
break;
default:
break;
}
}
private void calAndStop() {
if (isStart) {
String number = new CalcDay().calTime(time - flag_time);
list.add(number);
list2 = new ArrayList<String>();
for (int i = list.size() - 1; i > -1; i--) {
list2.add(list.get(i));
}
flag_time = time;
} else {
rl_cal.setAlpha(0.7f);
time = 0;
flag_time = 0;
tv_timemain.setText(new CalcDay().calTime(time));
tv_times.setText(new CalcDay().calTime(time - flag_time));
img_cal.setClickable(false);
tv_cal.setText("计次");
list = new ArrayList<String>();
list2 = new ArrayList<String>();
}
adapter.updateListView(list2);
}
private void StartOrStopTime() {
if (!isStart) {
new Thread(new MyThread()).start();
isStart = true;
tv_set.setTextColor(getResources().getColor(R.color.red));
tv_set.setText("停止");
rl_cal.setAlpha(1);
tv_cal.setText("计次");
img_cal.setClickable(true);
} else {
isStart = false;
tv_set.setTextColor(getResources().getColor(R.color.green));
tv_set.setText("启动");
tv_cal.setText("复位");
}
}
}
private static final int T_start = 1;
public class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
if(!isStart){
break;
}
try {
Thread.sleep(10);
time += 1;
Message message = new Message();
message.what = T_start;
handler.sendMessage(message);//发送消息
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
@SuppressLint("HandlerLeak")
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case T_start:
tv_timemain.setText(new CalcDay().calTime(time));
tv_times.setText(new CalcDay().calTime(time - flag_time));
break;
default:
break;
}
super.handleMessage(msg);
}
};
}
其中秒表启动后,每10毫秒刷新一次。
毫秒与文字转换代码
package com.example.stopwatch;
public class CalcDay {
public String calTime(int time) {
int millisec = time % 100 ;
int sec = (time % 6000) / 100;
int min = time / 6000;
if(min >= 60){
min %= 60;
}
String runningtime = null;
String r_sec;
String r_min;
String r_milli;
if(sec < 10){
r_sec = "0" + sec;
}else{
r_sec = sec + "";
}
if(min < 10){
r_min = "0" + min;
}else{
r_min = min + "";
}
if(millisec < 10){
r_milli = "0" + millisec;
}else{
r_milli = millisec + "";
}
runningtime = r_min + ":" + r_sec + "." + r_milli;
return runningtime;
}
}
计次时,用到的适配器,因为iphone上计次是倒着显示的,所以我们这里也得做相应的调整
package com.example.stopwatch;
import java.util.List;
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 List<String> list = null;
private Context mContext;
public TimeAdapter(Context mContext, List<String> list) {
this.mContext = mContext;
this.list = list;
}
public void updateListView(List<String> list){
this.list = list;
notifyDataSetChanged();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return this.list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return this.list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.time_item, null);
viewHolder.tv_number = (TextView) convertView.findViewById(R.id.tv_number);
viewHolder.tv_time = (TextView) convertView.findViewById(R.id.tv_time);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tv_number.setText("计次" + (list.size() - position));
viewHolder.tv_time.setText(list.get(position));
return convertView;
}
final static class ViewHolder {
TextView tv_number;
TextView tv_time;
}
}
示例