您的位置:首页 > 移动开发 > Android开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计时器 秒表