<?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