<?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:gravity="center_horizontal" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_horizontal" android:paddingLeft="3dp" > <NumberPicker android:id="@+id/np1" android:layout_width="50dp" android:layout_height="wrap_content"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:textSize="20sp" android:text=":"/> <NumberPicker android:id="@+id/np2" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_marginLeft="5dip"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:textSize="20sp" android:text=":"/> <NumberPicker android:id="@+id/np3" android:layout_width="50dp" android:layout_height="wrap_content"/> </LinearLayout> <TextView android:id="@+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/showtiqian" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始倒计时" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止" /> <TextView android:id="@+id/showcount" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
package com.example.activity; import java.util.Calendar; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.NumberPicker; import android.widget.NumberPicker.OnValueChangeListener; import android.widget.TextView; import com.example.test.R; public class TimeCountActivity extends Activity { private boolean STOP = true; private NumberPicker mSecondSpinner; private NumberPicker mHourSpinner; private NumberPicker mMinuteSpinner; private TextView timeCount; private Button btn_start ,btn1; private Calendar mDate; private int mHour, mMinute,mSecond; private Handler mHandler = new Handler();// 全局handler int time = 0;// 时间差 @SuppressLint("NewApi") protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.timecount); super.onCreate(savedInstanceState); mDate = Calendar.getInstance(); mHour = mDate.get(Calendar.HOUR_OF_DAY); mMinute = mDate.get(Calendar.MINUTE); mSecond = mDate.get(Calendar.SECOND); mHourSpinner = (NumberPicker) this.findViewById(R.id.np1); mHourSpinner.setMaxValue(23); mHourSpinner.setMinValue(0); mHourSpinner.setValue(mHour); mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); mMinuteSpinner = (NumberPicker) this.findViewById(R.id.np2); mMinuteSpinner.setMaxValue(59); mMinuteSpinner.setMinValue(0); mMinuteSpinner.setValue(mMinute); mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); mSecondSpinner = (NumberPicker) this.findViewById(R.id.np3); mSecondSpinner.setMaxValue(59); mSecondSpinner.setMinValue(0); mSecondSpinner.setValue(mSecond); mSecondSpinner.setOnValueChangedListener(mOnDateChangedListener); timeCount = (TextView) this.findViewById(R.id.showcount); btn_start = (Button) this.findViewById(R.id.btn_start); btn_start.setOnClickListener(new mClick()); btn1 = (Button) this.findViewById(R.id.button1); btn1.setOnClickListener(new mClick()); } class mClick implements OnClickListener { public void onClick(View v) { if(v == btn_start) { STOP = false; time = mSecond + mMinute*60 + mHour*3600; new Thread(new TimeCount()).start();// 开启线程 } else if(v == btn1) { STOP = true; } } } @SuppressLint("NewApi") private NumberPicker.OnValueChangeListener mOnDateChangedListener = new OnValueChangeListener() { @SuppressLint("NewApi") public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mSecond = mHourSpinner.getValue(); } }; @SuppressLint("NewApi") private NumberPicker.OnValueChangeListener mOnHourChangedListener = new OnValueChangeListener() { @SuppressLint("NewApi") public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mHour = mHourSpinner.getValue(); } }; @SuppressLint("NewApi") private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new OnValueChangeListener() { @SuppressLint("NewApi") public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mMinute = mMinuteSpinner.getValue(); } }; class TimeCount implements Runnable { @Override public void run() { while ( !STOP && time > 0)// 整个倒计时执行的循环 { time--; mHandler.post(new Runnable() // 通过它在UI主线程中修改显示的剩余时间 { public void run() { timeCount.setText(getInterval(time));// 显示剩余时间 } }); try { Thread.sleep(1000);// 线程休眠一秒钟 这个就是倒计时的间隔时间 } catch (InterruptedException e) { e.printStackTrace(); } } // 下面是倒计时结束逻辑 mHandler.post(new Runnable() { @Override public void run() { timeCount.setText("设定的时间到。"); } }); } } /** * 设定显示文字 */ public static String getInterval(int time) { String txt = null; if (time >= 0) { long hour = time % (24 * 3600) / 3600;// 小时 long minute = time % 3600 / 60;// 分钟 long second = time % 60;// 秒 txt =" 距离现在还有:" + hour + "小时" + minute + "分" + second + "秒"; } else { txt="已过期"; } return txt; } }
原文:http://www.cnblogs.com/jun-qiangf/p/3885787.html