自定义倒计时TextView控件
2015-06-12 11:04
405 查看
一、首先要创建一个自定义的TextView
创建一个继承TextView的控件
资源布局中引用该控件
创建自定义的TextView控件
在布局中引用该控件
二、完善这个TimerTextView加入倒计时功能。
要另启用一个线程,来实现倒计时的功能。首先要实现Runnable接口。为了控制这个倒计时,需要有个isRun变量,查看程序是否正在运行。提供一个start和stop方法来控制计时器。
第二部主要实现倒计时功能。需要一个setTimes和countdown方法。如下:
之后我们可以用变量来实现倒计时功能。
由各时间的变量可以得出他们值的范围:
秒:0~59
分钟:0~59
小时:0~24
天:0~
每次调用countdown方法时,秒就会减1.这里边界判断,当秒为0的时候,需要向分钟借1位,如果分钟也为0,则需要向小时借1位。依次类推,所有变量均为0时,停止倒计时。
接下来实现run方法,调用countdown
isRun判断计时器是否运行
完整的类实现如下:
最后效果:
![](https://img-blog.csdn.net/20150612114032689?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmx5eG1hbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
程序源码如下:
http://download.csdn.net/detail/flyxman/8799413
创建一个继承TextView的控件
资源布局中引用该控件
创建自定义的TextView控件
import android.content.Context; import android.util.AttributeSet; import android.widget.TextView; public class TimerTextView extends TextView { public TimerTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public TimerTextView(Context context, AttributeSet attrs) { super(context, attrs); } public TimerTextView(Context context) { super(context); } }
在布局中引用该控件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <com.example.timertextviewdemo.TimerTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
二、完善这个TimerTextView加入倒计时功能。
要另启用一个线程,来实现倒计时的功能。首先要实现Runnable接口。为了控制这个倒计时,需要有个isRun变量,查看程序是否正在运行。提供一个start和stop方法来控制计时器。
第二部主要实现倒计时功能。需要一个setTimes和countdown方法。如下:
import android.content.Context; import android.util.AttributeSet; import android.widget.TextView; public class TimerTextView extends TextView implements Runnable { // 时间变量 private int day, hour, minute, second; // 当前计时器是否运行 private boolean isRun = false; public TimerTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public TimerTextView(Context context, AttributeSet attrs) { super(context, attrs); } public TimerTextView(Context context) { super(context); } /** * 将倒计时时间毫秒数转换为自身变量 * * @param time * 时间间隔毫秒数 */ public void setTimes(long time) { } /** * 显示当前时间 * * @return */ public String showTime() { return null; } /** * 实现倒计时 */ private void countdown() { } public boolean isRun() { return isRun; } /** * 开始计时 */ public void start() { } /** * 结束计时 */ public void stop() { } /** * 实现计时循环 */ @Override public void run() { } }我们来一点一点实现他的功能。首页我们要将时间传递给计时器。这个time代表两个date时间差的毫秒数。最后我们将毫秒数转换成时间,存到变量中。
/** * 将倒计时时间毫秒数转换为自身变量 * * @param time * 时间间隔毫秒数 */ public void setTimes(long time) { //将毫秒数转化为时间 this.second = (int) (time / 1000) % 60; this.minute = (int) (time / (60 * 1000) % 60); this.hour = (int) (time / (60 * 60 * 1000) % 24); this.day = (int) (time / (24 * 60 * 60 * 1000)); }
之后我们可以用变量来实现倒计时功能。
由各时间的变量可以得出他们值的范围:
秒:0~59
分钟:0~59
小时:0~24
天:0~
每次调用countdown方法时,秒就会减1.这里边界判断,当秒为0的时候,需要向分钟借1位,如果分钟也为0,则需要向小时借1位。依次类推,所有变量均为0时,停止倒计时。
/** * 实现倒计时 */ private void countdown() { if (second == 0) { if (minute == 0) { if (hour == 0) { if (day == 0) { //当时间归零时停止倒计时 isRun = false; return; } else { day--; } hour = 23; } else { hour--; } minute = 59; } else { minute--; } second = 60; } second--; }
接下来实现run方法,调用countdown
/** * 实现计时循环 */ @Override public void run() { if (isRun) { countdown(); this.setText(showTime()); postDelayed(this, 1000); } else { removeCallbacks(this); } }
isRun判断计时器是否运行
完整的类实现如下:
在activity中调用这个控件
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
public class TimerTextView extends TextView implements Runnable {
// 时间变量
private int day, hour, minute, second;
// 当前计时器是否运行
private boolean isRun = false;
public TimerTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public TimerTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TimerTextView(Context context) {
super(context);
}
/** * 将倒计时时间毫秒数转换为自身变量 * * @param time * 时间间隔毫秒数 */ public void setTimes(long time) { //将毫秒数转化为时间 this.second = (int) (time / 1000) % 60; this.minute = (int) (time / (60 * 1000) % 60); this.hour = (int) (time / (60 * 60 * 1000) % 24); this.day = (int) (time / (24 * 60 * 60 * 1000)); }
/**
* 显示当前时间
*
* @return
*/
public String showTime() {
StringBuilder time = new StringBuilder();
time.append(day);
time.append("天");
time.append(hour);
time.append("小时");
time.append(minute);
time.append("分钟");
time.append(second);
time.append("秒");
return time.toString();
}
/** * 实现倒计时 */ private void countdown() { if (second == 0) { if (minute == 0) { if (hour == 0) { if (day == 0) { //当时间归零时停止倒计时 isRun = false; return; } else { day--; } hour = 23; } else { hour--; } minute = 59; } else { minute--; } second = 60; } second--; }
public boolean isRun() {
return isRun;
}
/**
* 开始计时
*/
public void start() {
isRun = true;
run();
}
/**
* 结束计时
*/
public void stop() {
isRun = false;
}
/**
* 实现计时循环
*/
@Override
public void run() {
if (isRun) {
// Log.d(TAG, "Run");
countdown();
this.setText(showTime());
postDelayed(this, 1000);
} else {
removeCallbacks(this);
}
}
}
package com.example.timertextviewdemo; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { private TimerTextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss"); //获得当前时间 Date now = new Date(); //目标时间 Date target = null; try { target = dateFormat.parse("2015/6/22 11:37:00"); } catch (ParseException e) { e.printStackTrace(); } //获得时间差 long diff = target.getTime() - now.getTime(); mTextView = (TimerTextView) findViewById(R.id.timerTextView); //设置时间 mTextView.setTimes(diff); /** * 开始倒计时 */ if(!mTextView.isRun()){ mTextView.start(); } } }简单的修改一下Textview的样式
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" an 8c6e droid:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <com.example.timertextviewdemo.TimerTextView android:id="@+id/timerTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/green_detail_btn" android:textSize="25sp" android:textColor="@android:color/white" android:gravity="center"/> </RelativeLayout>
最后效果:
程序源码如下:
http://download.csdn.net/detail/flyxman/8799413
相关文章推荐
- Delphi实现毫秒级别的倒计时实例代码
- javascript 宝宝出生倒计时实现代码
- C#基于TimeSpan实现倒计时效果的方法
- js实现发送验证码后的倒计时功能
- 设置下载不需要倒计时cookie(倒计时代码)
- 一个不错的js html页面倒计时可精确到秒
- jQuery团购倒计时特效实现方法
- jQuery实现倒计时按钮功能代码分享
- 整理8个很棒的 jQuery 倒计时插件和教程
- JSP中的倒数计时和自动跳转页面
- 简单易用的倒计时js代码
- JS 倒计时实现代码(时、分,秒)
- javascript倒计时效果代码,可以方便参数调用
- Javascript倒计时(定时)执行跳转事件的代码
- JavaScript 实现简单的倒计时弹窗DEMO附图
- JS简单实用的倒计时效果实现代码
- js setTimeout()函数介绍及应用以倒计时为例
- android自定义倒计时控件示例
- jquery实现手机发送验证码的倒计时代码
- 2014过年倒计时示例