Android倒計時的使用

MikOsorio 8年前發布 | 12K 次閱讀 移動開發

來自: http://my.oschina.net/reborn87/blog/609983


關于倒計時的實現,通常有如下幾個方法:http://blog.csdn.net/t12x3456/article/details/7816500

不過由于項目中展示效果為卡片,通過滑動的實行進行切換卡片,上文鏈接中所描述的幾種都不適用,或者說使用效果不佳,需要每一秒都需要刷新所有卡片,導致卡片根本無法滑動,體驗不佳,于是使用了自定義控件的方案,自定義一個TimerTextView,同時繼承Runnable接口,覆寫run方法,用于更新展現的時間,該方法的好處就是沒必要每秒都刷新整個列表,而是使用TimerTextView自己更新自己的展現內容,滑動效果更流暢。

/**
 * 自定義倒計時文本控件
 */
public class TimeTextView extends TextView implements Runnable {
    private String[] times;
    private long mhour, mmin, msecond;//天,小時,分鐘,秒
    private boolean run = false; //是否啟動了

    public TimeTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TimeTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public TimeTextView(Context context) {
        super(context);
    }

    public String[] getTimes() {
        return times;
    }

    public void setTimes(String[] times) {
        this.times = times;
        mhour = Long.parseLong(times[0].trim());
        mmin = Long.parseLong(times[1].trim());
        msecond = Long.parseLong(times[2].trim());
    }

    /**
     * 倒計時計算
     */
    private void ComputeTime() {
        msecond--;
        if (msecond < 0) {
            mmin--;
            msecond = 59;
            if (mmin < 0) {
                mmin = 59;
                mhour--;
                if (mhour < 0) {
                    // 倒計時結束
                    mhour = 59;
                }
            }
        }
    }

    public boolean isRun() {
        return run;
    }

    public void setRun(boolean run) {
        this.run = run;
    }

    private String get2Num(long l) {
        if (l < 10) {
            return "0" + l;
        } else return String.valueOf(l);
    }

    @Override
    public void run() {
        //標示已經啟動
        removeCallbacks(this);
        if (!run) {
            return;
        }
        ComputeTime();
        Log.i("wj", "TextTimer正在運行");
        String strTime = get2Num(mhour) + ":" + get2Num(mmin) + ":" + get2Num(msecond);
        this.setText(Html.fromHtml(strTime));
        postDelayed(this, 1000);
    }
}

在此有幾點需要說明:

1、該方法會針對每一個Item開啟一個線程,于是初始化的時候需要默認不啟動,設置run為false;

2、當多個都在計時的時候,需要計時停止未展現的項,否則線程越來越多,內存會一直上漲;

3、每次都調用removeCallbacks(this),將當前現場從隊列中清楚,目的還是避免內存上漲;

 本文由用戶 MikOsorio 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!