首先是一个自定义控件:

  1. public class RushBuyCountDownTimerView extends LinearLayout {
  2. // 小时,十位
  3. private TextView tv_hour_decade;
  4. // 小时,个位
  5. private TextView tv_hour_unit;
  6. // 分钟,十位
  7. private TextView tv_min_decade;
  8. // 分钟,个位
  9. private TextView tv_min_unit;
  10. // 秒,十位
  11. private TextView tv_sec_decade;
  12. // 秒,个位
  13. private TextView tv_sec_unit;
  14. private Context context;
  15. private int hour_decade;
  16. private int hour_unit;
  17. private int min_decade;
  18. private int min_unit;
  19. private int sec_decade;
  20. private int sec_unit;
  21. // 计时器
  22. private Timer timer;
  23. private Handler handler = new Handler() {
  24. public void handleMessage(Message msg) {
  25. countDown();
  26. }
  27. ;
  28. };
  29. public RushBuyCountDownTimerView(Context context, AttributeSet attrs) {
  30. super(context, attrs);
  31. this.context = context;
  32. LayoutInflater inflater = (LayoutInflater) context
  33. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  34. View view = inflater.inflate(R.layout.view_countdowntimer, this);
  35. tv_hour_decade = (TextView) view.findViewById(R.id.tv_hour_decade);
  36. tv_hour_unit = (TextView) view.findViewById(R.id.tv_hour_unit);
  37. tv_min_decade = (TextView) view.findViewById(R.id.tv_min_decade);
  38. tv_min_unit = (TextView) view.findViewById(R.id.tv_min_unit);
  39. tv_sec_decade = (TextView) view.findViewById(R.id.tv_sec_decade);
  40. tv_sec_unit = (TextView) view.findViewById(R.id.tv_sec_unit);
  41. }
  42. /**
  43. * @param
  44. * @return void
  45. * @throws
  46. * @Description: 开始计时
  47. */
  48. public void start() {
  49. if (timer == null) {
  50. timer = new Timer();
  51. timer.schedule(new TimerTask() {
  52. @Override
  53. public void run() {
  54. handler.sendEmptyMessage(0);
  55. }
  56. }, 0, 1000);
  57. }
  58. }
  59. /**
  60. * @param
  61. * @return void
  62. * @throws
  63. * @Description: 停止计时
  64. */
  65. public void stop() {
  66. if (timer != null) {
  67. timer.cancel();
  68. timer = null;
  69. tv_hour_decade.setText(0 + "");
  70. tv_hour_unit.setText(0 + "");
  71. tv_min_decade.setText(0 + "");
  72. tv_min_unit.setText(0 + "");
  73. tv_sec_decade.setText(0 + "");
  74. tv_sec_unit.setText(0 + "");
  75. }
  76. }
  77. /**
  78. * @param
  79. * @return void
  80. * @throws Exception
  81. * @throws
  82. * @Description: 设置倒计时的时长
  83. */
  84. public void setTime(String hour, String min, String sec) {
  85. int Hour = Integer.parseInt(hour);
  86. int Min = Integer.parseInt(min);
  87. int Second = Integer.parseInt(sec);
  88. if (Hour >= 120 || Min >= 60 || Second >= 60 || Hour < 0 || Min < 0
  89. || Second < 0) {
  90. throw new RuntimeException("error:check your time");
  91. }
  92. hour_decade = Hour / 10;
  93. hour_unit = Hour - hour_decade * 10;
  94. min_decade = Min / 10;
  95. min_unit = Min - min_decade * 10;
  96. sec_decade = Second / 10;
  97. sec_unit = Second - sec_decade * 10;
  98. tv_hour_decade.setText(hour_decade + "");
  99. tv_hour_unit.setText(hour_unit + "");
  100. tv_min_decade.setText(min_decade + "");
  101. tv_min_unit.setText(min_unit + "");
  102. tv_sec_decade.setText(sec_decade + "");
  103. tv_sec_unit.setText(sec_unit + "");
  104. }
  105. /**
  106. * @param
  107. * @return boolean
  108. * @throws
  109. * @Description: 倒计时
  110. */
  111. private void countDown() {
  112. if (isCarry4Unit(tv_sec_unit)) {
  113. if (isCarry4Decade(tv_sec_decade)) {
  114. if (isCarry4Unit(tv_min_unit)) {
  115. if (isCarry4Decade(tv_min_decade)) {
  116. if (isCarry4Unit(tv_hour_unit)) {
  117. if (isCarry4Decade(tv_hour_decade)) {
  118. // ToastUtil.safeShowToast(TLApplication.mContext, "Time limited");
  119. stop();
  120. }
  121. }
  122. }
  123. }
  124. }
  125. }
  126. }
  127. /**
  128. * @param
  129. * @return boolean
  130. * @throws
  131. * @Description: 变化十位,并判断是否需要进位
  132. */
  133. private boolean isCarry4Decade(TextView tv) {
  134. int time = Integer.valueOf(tv.getText().toString());
  135. time = time - 1;
  136. if (time < 0) {
  137. time = 5;
  138. tv.setText(time + "");
  139. return true;
  140. } else {
  141. tv.setText(time + "");
  142. return false;
  143. }
  144. }
  145. /**
  146. * @param
  147. * @return boolean
  148. * @throws
  149. * @Description: 变化个位,并判断是否需要进位
  150. */
  151. private boolean isCarry4Unit(TextView tv) {
  152. int time = Integer.valueOf(tv.getText().toString());
  153. time = time - 1;
  154. if (time < 0) {
  155. time = 9;
  156. tv.setText(time + "");
  157. return true;
  158. } else {
  159. tv.setText(time + "");
  160. return false;
  161. }
  162. }
  163. }
  1. view_countdowntimer.xml:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:background="#FF0000"
  6. android:padding="5dp">
  7.  
  8. <LinearLayout
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content">
  11.  
  12.  
  13. <TextView
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:gravity="center"
  17. android:text="倒计时:"
  18. android:textColor="#FFFFFF" />
  19.  
  20. <TextView
  21. android:id="@+id/tv_hour_decade"
  22. style="@style/RushBuyCountDownTimerViewStyle" />
  23.  
  24. <TextView
  25. android:id="@+id/tv_hour_unit"
  26. style="@style/RushBuyCountDownTimerViewStyle"
  27. android:layout_marginLeft="1dp" />
  28.  
  29. <TextView
  30. android:layout_width="wrap_content"
  31. android:layout_height="match_parent"
  32. android:gravity="center"
  33. android:text="时"
  34. android:textColor="#FFFFFF"
  35. android:textSize="16sp" />
  36.  
  37. <TextView
  38. android:id="@+id/tv_min_decade"
  39. style="@style/RushBuyCountDownTimerViewStyle" />
  40.  
  41. <TextView
  42. android:id="@+id/tv_min_unit"
  43. style="@style/RushBuyCountDownTimerViewStyle"
  44. android:layout_marginLeft="1dp" />
  45.  
  46. <TextView
  47. android:layout_width="wrap_content"
  48. android:layout_height="match_parent"
  49. android:gravity="center"
  50. android:text="分"
  51. android:textColor="#FFFFFF"
  52. android:textSize="16sp" />
  53.  
  54. <TextView
  55. android:id="@+id/tv_sec_decade"
  56. style="@style/RushBuyCountDownTimerViewStyle" />
  57.  
  58. <TextView
  59. android:id="@+id/tv_sec_unit"
  60. style="@style/RushBuyCountDownTimerViewStyle"
  61. android:layout_marginLeft="1dp" />
  62.  
  63. <TextView
  64. android:layout_width="wrap_content"
  65. android:layout_height="match_parent"
  66. android:gravity="center"
  67. android:text="秒"
  68. android:textColor="#FFFFFF"
  69. android:textSize="16sp" />
  70.  
  71. </LinearLayout>
  72.  
  73. </FrameLayout>
  1. RushBuyCountDownTimerViewStyle:
  1. <style name="RushBuyCountDownTimerViewStyle">
  2. <item name="android:layout_width">wrap_content</item>
  3. <item name="android:layout_height">wrap_content</item>
  4. <item name="android:gravity">center</item>
  5. <item name="android:text">0</item>
  6. <item name="android:textColor">#FFFFFF</item>
  7. <item name="android:textSize">16sp</item>

可能用到的时间格式转换工具:

  1. /** 将格林威治时间格式转为指定的时间格式 */
  2. public static String GTMToLocal(String GTMDate) {
  3. int tIndex = GTMDate.indexOf("T");
  4. String dateTemp = GTMDate.substring(0, tIndex);
  5. String timeTemp = GTMDate.substring(tIndex + 1, GTMDate.length() - 6);
  6. String convertString = dateTemp + " " + timeTemp;
  7. SimpleDateFormat format;
  8. format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
  9. Date result_date;
  10. long result_time = 0;
  11. if (null == GTMDate) {
  12. return GTMDate;
  13. } else {
  14. try {
  15. format.setTimeZone(TimeZone.getTimeZone("GMT00:00"));
  16. result_date = format.parse(convertString);
  17. result_time = result_date.getTime();
  18. format.setTimeZone(TimeZone.getDefault());
  19. return format.format(result_time);
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. return GTMDate;
  25. }

设置倒计时:

  1. String startTime = StringUtil.GTMToLocal("2015-12-28T12:49:13.45425+08:00");
  2. String endTime = StringUtil.GTMToLocal("2015-12-31T00:17:13.45425+08:00");
  3. DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  4. try {
  5. Date d1 = df.parse(startTime);
  6. Date d2 = df.parse(endTime);
  7. long diff = d2.getTime() - d1.getTime(); // mslong days = diff / (1000 * 60 * 60 * 24);
  8. long hours = (diff - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
  9. long minutes = (diff - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60);
  10. long second = (diff / 1000 - days * 24 * 60 * 60 - hours * 60 * 60 - minutes * 60);
  11. hours += days * 24;

    // RushBuyCountDownTimerView
    timerView; 需要初始化timerView
  1.  
  1. timerView.setTime(hours + "", minutes + "", second + "");
  2. timerView.start();
  3. } catch (Exception e) {
  4. e.printStackTrace();
  5. }

 

版权声明:本文为rh1910362960原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/rh1910362960/p/5082273.html