Android倒计时:计算两个时间将得到的时间差转化为倒计时(xx时xx分xx秒格式)
首先是一个自定义控件:
public class RushBuyCountDownTimerView extends LinearLayout { // 小时,十位
private TextView tv_hour_decade;
// 小时,个位
private TextView tv_hour_unit;
// 分钟,十位
private TextView tv_min_decade;
// 分钟,个位
private TextView tv_min_unit;
// 秒,十位
private TextView tv_sec_decade;
// 秒,个位
private TextView tv_sec_unit; private Context context; private int hour_decade;
private int hour_unit;
private int min_decade;
private int min_unit;
private int sec_decade;
private int sec_unit;
// 计时器
private Timer timer; private Handler handler = new Handler() { public void handleMessage(Message msg) {
countDown();
} ;
}; public RushBuyCountDownTimerView(Context context, AttributeSet attrs) {
super(context, attrs); this.context = context;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.view_countdowntimer, this); tv_hour_decade = (TextView) view.findViewById(R.id.tv_hour_decade);
tv_hour_unit = (TextView) view.findViewById(R.id.tv_hour_unit);
tv_min_decade = (TextView) view.findViewById(R.id.tv_min_decade);
tv_min_unit = (TextView) view.findViewById(R.id.tv_min_unit);
tv_sec_decade = (TextView) view.findViewById(R.id.tv_sec_decade);
tv_sec_unit = (TextView) view.findViewById(R.id.tv_sec_unit); } /**
* @param
* @return void
* @throws
* @Description: 开始计时
*/
public void start() { if (timer == null) {
timer = new Timer();
timer.schedule(new TimerTask() { @Override
public void run() {
handler.sendEmptyMessage(0);
}
}, 0, 1000);
}
} /**
* @param
* @return void
* @throws
* @Description: 停止计时
*/
public void stop() {
if (timer != null) {
timer.cancel();
timer = null;
tv_hour_decade.setText(0 + "");
tv_hour_unit.setText(0 + "");
tv_min_decade.setText(0 + "");
tv_min_unit.setText(0 + "");
tv_sec_decade.setText(0 + "");
tv_sec_unit.setText(0 + "");
}
} /**
* @param
* @return void
* @throws Exception
* @throws
* @Description: 设置倒计时的时长
*/
public void setTime(String hour, String min, String sec) { int Hour = Integer.parseInt(hour);
int Min = Integer.parseInt(min);
int Second = Integer.parseInt(sec); if (Hour >= 120 || Min >= 60 || Second >= 60 || Hour < 0 || Min < 0
|| Second < 0) {
throw new RuntimeException("error:check your time");
} hour_decade = Hour / 10;
hour_unit = Hour - hour_decade * 10; min_decade = Min / 10;
min_unit = Min - min_decade * 10; sec_decade = Second / 10;
sec_unit = Second - sec_decade * 10; tv_hour_decade.setText(hour_decade + "");
tv_hour_unit.setText(hour_unit + "");
tv_min_decade.setText(min_decade + "");
tv_min_unit.setText(min_unit + "");
tv_sec_decade.setText(sec_decade + "");
tv_sec_unit.setText(sec_unit + ""); } /**
* @param
* @return boolean
* @throws
* @Description: 倒计时
*/
private void countDown() { if (isCarry4Unit(tv_sec_unit)) {
if (isCarry4Decade(tv_sec_decade)) { if (isCarry4Unit(tv_min_unit)) {
if (isCarry4Decade(tv_min_decade)) { if (isCarry4Unit(tv_hour_unit)) {
if (isCarry4Decade(tv_hour_decade)) {
// ToastUtil.safeShowToast(TLApplication.mContext, "Time limited");
stop();
}
}
}
}
}
}
} /**
* @param
* @return boolean
* @throws
* @Description: 变化十位,并判断是否需要进位
*/
private boolean isCarry4Decade(TextView tv) { int time = Integer.valueOf(tv.getText().toString());
time = time - 1;
if (time < 0) {
time = 5;
tv.setText(time + "");
return true;
} else {
tv.setText(time + "");
return false;
} } /**
* @param
* @return boolean
* @throws
* @Description: 变化个位,并判断是否需要进位
*/
private boolean isCarry4Unit(TextView tv) { int time = Integer.valueOf(tv.getText().toString());
time = time - 1;
if (time < 0) {
time = 9;
tv.setText(time + "");
return true;
} else {
tv.setText(time + "");
return false;
} }
}
view_countdowntimer.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FF0000"
android:padding="5dp"> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="倒计时:"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/tv_hour_decade"
style="@style/RushBuyCountDownTimerViewStyle" /> <TextView
android:id="@+id/tv_hour_unit"
style="@style/RushBuyCountDownTimerViewStyle"
android:layout_marginLeft="1dp" /> <TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="时"
android:textColor="#FFFFFF"
android:textSize="16sp" /> <TextView
android:id="@+id/tv_min_decade"
style="@style/RushBuyCountDownTimerViewStyle" /> <TextView
android:id="@+id/tv_min_unit"
style="@style/RushBuyCountDownTimerViewStyle"
android:layout_marginLeft="1dp" /> <TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="分"
android:textColor="#FFFFFF"
android:textSize="16sp" /> <TextView
android:id="@+id/tv_sec_decade"
style="@style/RushBuyCountDownTimerViewStyle" /> <TextView
android:id="@+id/tv_sec_unit"
style="@style/RushBuyCountDownTimerViewStyle"
android:layout_marginLeft="1dp" /> <TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="秒"
android:textColor="#FFFFFF"
android:textSize="16sp" /> </LinearLayout> </FrameLayout>
RushBuyCountDownTimerViewStyle:
<style name="RushBuyCountDownTimerViewStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">center</item>
<item name="android:text">0</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:textSize">16sp</item>
可能用到的时间格式转换工具:
/** 将格林威治时间格式转为指定的时间格式 */
public static String GTMToLocal(String GTMDate) { int tIndex = GTMDate.indexOf("T");
String dateTemp = GTMDate.substring(0, tIndex);
String timeTemp = GTMDate.substring(tIndex + 1, GTMDate.length() - 6);
String convertString = dateTemp + " " + timeTemp; SimpleDateFormat format;
format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
Date result_date;
long result_time = 0; if (null == GTMDate) {
return GTMDate;
} else {
try {
format.setTimeZone(TimeZone.getTimeZone("GMT00:00"));
result_date = format.parse(convertString);
result_time = result_date.getTime();
format.setTimeZone(TimeZone.getDefault());
return format.format(result_time);
} catch (Exception e) {
e.printStackTrace();
}
}
return GTMDate; }
设置倒计时:
String startTime = StringUtil.GTMToLocal("2015-12-28T12:49:13.45425+08:00");
String endTime = StringUtil.GTMToLocal("2015-12-31T00:17:13.45425+08:00"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try {
Date d1 = df.parse(startTime);
Date d2 = df.parse(endTime);
long diff = d2.getTime() - d1.getTime(); // mslong days = diff / (1000 * 60 * 60 * 24);
long hours = (diff - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
long minutes = (diff - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60);
long second = (diff / 1000 - days * 24 * 60 * 60 - hours * 60 * 60 - minutes * 60); hours += days * 24; // RushBuyCountDownTimerView timerView; 需要初始化timerView
timerView.setTime(hours + "", minutes + "", second + "");
timerView.start(); } catch (Exception e) {
e.printStackTrace();
}
Android倒计时:计算两个时间将得到的时间差转化为倒计时(xx时xx分xx秒格式)的更多相关文章
- SQL语句更新时间字段的年份、月份、天数、时、分、秒
SQL语句更新时间字段的年份.月份.天数.时.分.秒 --修改d表日期字段的年份update dset birth=STUFF(convert(nvarchar(23),birth,120),1,4, ...
- Android之计算两个时间的相差
参数: sdate = 2013-07-16 16:14:47 /** * 以友好的方式显示时间 * @param sdate * @return */ public static String ...
- java获取两个时间的相隔时间,包括年、月、日、时、分、秒
public static final int YEAR_RETURN = 0; public static final int MONTH_RETURN = 1 ...
- javascript 以“年-月-日 时:分:秒”格式显示当前时间
运行代码 /** * Created by shgbit on 2015/1/9. *js代码 */ function showNow(){ var t=new Date(); var mont ...
- Java 获取各时区时间,获取当前时间到格林威治时间1970年01月01日00时00分00秒的秒数
格林威治时间即UTC/GMT时间,1970年01月01日00时00分00秒(即UTC+8的北京时间1970年01月01日08时00分00秒)计算代码如下: /** * 获取指定时间到格林威治时间的秒数 ...
- C#计算两个时间年份月份差
C#计算两个时间年份月份差 https://blog.csdn.net/u011127019/article/details/79142612
- oracle计算两个时间的差值(XX天XX时XX分XX秒)
在工作中需要计算两个时间的差值,结束时间 - 开始时间,又不想在js里写function,也不想在java里去计算,干脆就在数据库做了一个函数来计算两个时间的差值.格式为XX天XX时XX分XX秒: 上 ...
- 使用LocalDateTime计算两个时间的差
LocalDateTime now = LocalDateTime.now();System.out.println("计算两个时间的差:");LocalDateTime end ...
- Python datetime库计算两个时间点之间的分钟(秒、天)数
计算两个时间点之间的分钟数 import datetime def minNums(startTime, endTime): '''计算两个时间点之间的分钟数''' # 处理格式,加上秒位 start ...
随机推荐
- MySQL数据库的一些基本操作及注释
--Created by mac on 2017/1/4. -- MySQL数据库 -- ****************** 一. 连接数据库服务器的基础命令 ******************* ...
- 转别人的 STM32外部中断使用注意事项
前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...
- 转-httpd 2.4.4 + mysql-5.5.28 + php-5.4.13编译安装过程
一.编译安装apache 1.解决依赖关系 httpd-2.4.4需要较新版本的apr和apr-util,因此需要事先对其进行升级.升级方式有两种,一种是通过源代码编译安装,一种是直接升级rpm包.这 ...
- iOS两种方式加载图片的区别
加载图片的方式: imageNamed: imageWithContentsOfFile: 加载Assets.xcassets这里面的图片: 1> 打包后变成Assets.car 2> 拿 ...
- C++模拟C#事件委托机制(二)
原文 来自于http://www.cnblogs.com/netssfy/archive/2010/02/02/1662056.html 为了解决非法地址访问的冲突,首先需要知道发生该错误的原因是什么 ...
- TCP协议与UDP协议的区别
TCP协议与UDP协议的区别(转) 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- nim也玩一行流,nim版的list comprehension
nim 是一门风格类似python的静态编译型语言,官方网站:http://nim-lang.org 如果你想折腾nim的编辑环境,可以用sublime text3 +插件nimlime,notepa ...
- Android深度探索--HAL与驱动开发----第五章读书笔记
第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...
- JS截取字符串常用方法详细整理
使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str="jpg|bmp|gif|ico|png" ...
- xamarin.forms 版本自动更新(针对android)
1.首先同过url地址下载文件,这里必须要启用单独一个下载线程 new Thread(run).Start(); 通过url下载的方法 public void run() { ...