计时/倒计时
Posted xhzxlqt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计时/倒计时相关的知识,希望对你有一定的参考价值。
倒计时线程
public class LeesCountDownThread extends AsyncTask<String, Integer, String> { //AsyncTask<String, Integer, String> //三个泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。 // 在特定场合下,并不是所有类型都被使用, // 如果没有被使用,可以用java.lang.Void类型代替 private static final String TAG = "LeesCountDownThread"; TimerView _timerView=null; int _start=1; int _interval=1; //TimerView 回调VIEW,nStart:起始计数,nInterval:时间间隔(ms) public LeesCountDownThread(TimerView tv, @IntRange(from = 1,to=65535)int nStart, @IntRange(from = 1,to=65535)int nInterval){ _timerView=tv; _start=nStart; _interval=nInterval; } //内部执行后台任务,不可在此方法内修改UI @Override protected String doInBackground(String... params){ try{ int nVal=_start; while(nVal>0){ publishProgress(nVal); sleep(_interval); nVal--; } }catch (Exception e){ Log.e(TAG,e.getMessage()); } return null; } @Override protected void onPreExecute(){ super.onPreExecute(); _timerView.setValue(_start); } //在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。 @Override protected void onProgressUpdate(Integer... progress){ super.onProgressUpdate(progress); _timerView.setValue(progress[0]); } //当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。 @Override protected void onPostExecute(String s){ super.onPostExecute(s); _timerView.setValue(0); } }
显示View 继承自TextView
/* * @author [email protected] * create at 2018/6/11 * description:计时/倒计时 显示视图 */ public class TimerView extends android.support.v7.widget.AppCompatTextView{ private Map<Integer,OnValueListener> valueMap=new HashMap<Integer,OnValueListener>(); private String strPre="",strEnd=" ms"; public TimerView(Context context) { super(context,null,0); } public TimerView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TimerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public TimerView setPreString(String s){ this.strPre=s; return this; } public TimerView setEndString(String s){ this.strEnd=s; return this; } //更新 public void setValue(int nVal){ setText(strPre+String.valueOf(nVal)+strEnd); for(Integer key:valueMap.keySet()){ if(nVal==key){ OnValueListener listener=valueMap.get(key); if(listener!=null){ listener.onValue(this); } break; } } } //添加达到某值时的回调 public TimerView addActiveListener(Integer nVal,OnValueListener listener){ valueMap.put(nVal,listener); return this; } }
示例:
TimerView tv=(TimerView)findViewById(R.id.textView_Skip); LeesCountDownThread lcdt=new LeesCountDownThread(tv,10,1000); lcdt.execute(""); tv.setPreString("Skip ") .setEndString("") .addActiveListener(4, new OnValueListener() { @Override public void onValue(View v) { TimerView tv = (TimerView) findViewById(R.id.textView_Skip); tv.setText("It‘s 4."); } }) .addActiveListener(0, new OnValueListener() { @Override public void onValue(View v) { TimerView tv = (TimerView) v; tv.setText("It‘s Over."); } });
以上是关于计时/倒计时的主要内容,如果未能解决你的问题,请参考以下文章