本人安卓菜鳥,因爲學校有一個比賽,所以正在做一個面向高中生的APP。
今天就是來記錄一下倒計時功能的實現。
一、我首先做了一個類似下拉框的效果,讓用戶自己選擇自己的年級(高一/高二/高三),然後根據相應的年級計算離高考的日期。
效果如下:
這裏有個問題就是其實這個裏面顯示的時間和現實中的時間是相差了八個小時的,但是因爲我是在模擬器上測試的,所以增加了一段時間。
後來在打包到手機上一時忘了改,所以纔會相差八個小時。
二、其次來分析一下這個功能的實現原理:
1.當下與高考時間(在這裏我寫的設計的是6月7日)之差,運用函數先獲得當今時間,在根據年級設計一下高考時間即可。
//獲得當前時間 八小時時間差
final Date startDate = new Date(System.currentTimeMillis()+8*60*60*1000);
/**
* 計算兩個日期之間的差
這個方法是使用了csdn上一位大佬的方法 我一下子沒找到這個大佬寫這個方法的鏈接 不好意思
* */
private int countTwoDate(Date startDate,Date endDate){
Calendar beginCalendar = Calendar.getInstance();
beginCalendar.setTime(startDate);
Calendar endCalendar = Calendar.getInstance();
endCalendar.setTime(endDate);
long beginTime = beginCalendar.getTime().getTime();
long endTime = endCalendar.getTime().getTime();
int betweenDays = (int)((endTime - beginTime) / (1000 * 60 * 60 *24));//先算出兩時間的毫秒數之差大於一天的天數
endCalendar.add(Calendar.DAY_OF_MONTH, -betweenDays);//使endCalendar減去這些天數,將問題轉換爲兩時間的毫秒數之差不足一天的情況
endCalendar.add(Calendar.DAY_OF_MONTH, -1);//再使endCalendar減去1天
if(beginCalendar.get(Calendar.DAY_OF_MONTH)==endCalendar.get(Calendar.DAY_OF_MONTH))//比較兩日期的DAY_OF_MONTH是否相等
return betweenDays + 1; //相等說明確實跨天了
else
return betweenDays + 0; //不相等說明確實未跨天
}
根據上述的方法就該知道了,現在我們有了一個startDate,還差一個endDate。
2.如何根據年級設計高考時間呢?必須是要先獲得當前的年份,再根據年級判斷相差的年份。
2.1 我本來是這麼做的,設置一個int型變量,如果是高三就是相差一年,如果是高二就是相差兩年,如果是高一就相差三年。但是後來想想這樣的想法是不準確的。
2.2 例如今天是2018-9-15日,高三生的高考時間是在2019-06-07日,確實是相差了一年。但這是因爲已經過了高考日期。
假如今天是2019-2-12,那高考時間時間肯定依然是2019-06-07日,那就是同一年。所以這裏應該增加一個比較判斷。
2.3 而且我在這裏將高考時間設定爲兩天,即06-07與06-08。
所以假如今天是06-07或者今天是06-08,對於高三生來說高考倒計時都應該是0天,絕對不可能出現-1天。
//...
//這裏的position是用來判斷選擇的是哪個年級,因爲只有三個年極段,所以範圍是從0-2
//subtract就是聲明時間差的那個int型變量
//subtract2很重要,因爲在線程裏面有一個很嚴重的bug就是它會通過subtract--操作改變subtract的值
switch (position){
case 0:
subtract=3;
break;
case 1:
subtract=2;
break;
case 2:
subtract=1;
break;
}
subtract2 = subtract;
//...
//...
//這是改進的方法的一個代碼片段
final Date startDate = new Date(System.currentTimeMillis()+8*60*60*1000);
if(calendar.get(Calendar.MONTH)<6){//這句代碼說明了高中生今年高考
subtract--;
}else if(calendar.get(Calendar.MONTH)==6){//特殊情況 7號與八號
if(calendar.get(Calendar.DATE)==7||calendar.get(Calendar.DATE)==8){
flag = true;
}
}
year = calendar.get(Calendar.YEAR)+subtract+"";//year我在這裏聲明爲string類型
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//...
//...
//代碼片段 flag首先定義爲boolean類型 並且賦初值false
runOnUiThread(new Runnable() {
@Override
public void run() {
interval = countTwoDate(startDate, endDate);
if(flag){
interval = 0;
}
tvDate.setText("高考倒計時:\n\n"+interval+"天");
tvNow.setText(format);
//這行爲subtract重新賦值的代碼很重要,因爲這樣可以避免線程的問題
subtract = subtract2;
}
});
//...
3.高考倒計時應當是隨着時間的變遷而變化的,不是一成不變的。
結合上述代碼,再參考某位大佬的實施自動更新時間方法
再次感謝網上的大佬們的無私奉獻!
我把所有的源代碼整理放在了我的個人公衆號【大胖貓的馬太效應】,回覆 高考倒計時 即可獲取啦~
最後如果你正好需要這方面的參考,希望這篇文章可以給予你一些些幫助~
有任何關於這個小功能想法或者問題歡迎在下文留言:D