计时/倒计时

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.");
                    }
                });

 

以上是关于计时/倒计时的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用片段和计时器的选项卡式活动上更新 UI

如何实现React原生倒计时圈

如果用户没有使用浏览器,则jQuery计时器停止

颤振计时器仅更新秒小部件

#yyds干货盘点#愚公系列2023年02月 .NET/C#知识点-程序运行计时的总结

Code Golf:倒计时数字游戏