效果图,每隔1秒,变换一下时间

android 实现倒计时_第1张图片

xml:

<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"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".MainActivity"

android:background="#000000"

>


<com.gettime.CustomDigitalClock

android:id="@+id/time"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_gravity="center"

android:gravity="center"

android:textColor="#FF0000"

android:textSize="45sp" />


</RelativeLayout>


//上面 < com.gettime.CustomDigitalClock 为类的完整位置

MainActivity.java

package com.gettime;


import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
private CustomDigitalClock timeClock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
timeClock=(CustomDigitalClock) findViewById(R.id.time);
timeClock.setEndTime(System.currentTimeMillis()+30*1000*24*24);
}
}


CustomDigitalClock.java

/*
* Copyright (C) 2012 The * Project
* All right reserved.
* Version 1.00 2012-2-11
* Author veally@foxmail.com
*/
package com.gettime;


import java.util.Calendar;




import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.SystemClock;
import android.provider.Settings;
import android.text.Html;
import android.text.Spannable;
import android.text.Spanned;
import android.text.style.AbsoluteSizeSpan;
import android.util.AttributeSet;
import android.widget.DigitalClock;


/**
* Custom digital clock
*
* @author veally@foxmail.com
*/
public class CustomDigitalClock extends DigitalClock {


Calendar mCalendar;
private final static String m12 = "h:mm aa";
private final static String m24 = "k:mm";
private FormatChangeObserver mFormatChangeObserver;
private Runnable mTicker;
private Handler mHandler;
private long endTime;
public static long distanceTime;
private ClockListener mClockListener;
private static boolean isFirst;
private boolean mTickerStopped;


@SuppressWarnings("unused")
private String mFormat;


public CustomDigitalClock(Context context) {
super(context);
initClock(context);
}


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


private void initClock(Context context) {


if (mCalendar == null) {
mCalendar = Calendar.getInstance();
}


mFormatChangeObserver = new FormatChangeObserver();
getContext().getContentResolver().registerContentObserver(
Settings.System.CONTENT_URI, true, mFormatChangeObserver);


setFormat();
}


@Override
protected void onAttachedToWindow() {
mTickerStopped = false;
super.onAttachedToWindow();
mHandler = new Handler();
/**
* requests a tick on the next hard-second boundary
*/
mTicker = new Runnable() {
public void run() {


if (mTickerStopped)
return;
long currentTime = System.currentTimeMillis();
if (currentTime / 1000 == endTime / 1000 - 5 * 60) {
mClockListener.remainFiveMinutes();
}
distanceTime = endTime - currentTime;
distanceTime /= 1000;
if (distanceTime == 0) {
setText("00:00:00");
onDetachedFromWindow();


} else if (distanceTime < 0) {
setText("00:00:00");
onDetachedFromWindow();
} else {
setText(dealTime(distanceTime));
}
invalidate();
long now = SystemClock.uptimeMillis();
long next = now + (1000 - now % 1000);
mHandler.postAtTime(mTicker, next);
}
};
mTicker.run();
}


/**
* deal time string
*
* @param time
* @return
*/
public static Spanned dealTime(long time) {
Spanned str;
StringBuffer returnString = new StringBuffer();
long day = time / (24 * 60 * 60);
long hours = (time % (24 * 60 * 60)) / (60 * 60);
long minutes = ((time % (24 * 60 * 60)) % (60 * 60)) / 60;
long second = ((time % (24 * 60 * 60)) % (60 * 60)) % 60;
String dayStr = String.valueOf(day);
String hoursStr = timeStrFormat(String.valueOf(hours));
String minutesStr = timeStrFormat(String.valueOf(minutes));
String secondStr = timeStrFormat(String.valueOf(second));


returnString.append(dayStr).append("天").append(hoursStr).append("小时")
.append(minutesStr).append("分钟").append(secondStr).append("秒");
str = Html.fromHtml(returnString.toString());
if (day >= 10) {
((Spannable) str).setSpan(new AbsoluteSizeSpan(16), 2, 3,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
((Spannable) str).setSpan(new AbsoluteSizeSpan(16), 5, 7,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
((Spannable) str).setSpan(new AbsoluteSizeSpan(16), 9, 11,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
((Spannable) str).setSpan(new AbsoluteSizeSpan(16), 13, 14,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
((Spannable) str).setSpan(new AbsoluteSizeSpan(16), 1, 2,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
((Spannable) str).setSpan(new AbsoluteSizeSpan(16), 4, 6,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
((Spannable) str).setSpan(new AbsoluteSizeSpan(16), 8, 10,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
((Spannable) str).setSpan(new AbsoluteSizeSpan(16), 12, 13,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}


// return returnString.toString();
return str;
}


/**
* format time
*
* @param timeStr
* @return
*/
private static String timeStrFormat(String timeStr) {
switch (timeStr.length()) {
case 1:
timeStr = "0" + timeStr;
break;
}
return timeStr;
}


@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mTickerStopped = true;
}


/**
* Clock end time from now on.
*
* @param endTime
*/
public void setEndTime(long endTime) {
this.endTime = endTime;

}


/**
* Pulls 12/24 mode from system settings
*/
private boolean get24HourMode() {
return android.text.format.DateFormat.is24HourFormat(getContext());
}


private void setFormat() {
if (get24HourMode()) {
mFormat = m24;
} else {
mFormat = m12;
}
}


private class FormatChangeObserver extends ContentObserver {
public FormatChangeObserver() {
super(new Handler());
}


@Override
public void onChange(boolean selfChange) {
setFormat();
}
}


public void setClockListener(ClockListener clockListener) {
this.mClockListener = clockListener;
}


public interface ClockListener {
void timeEnd();


void remainFiveMinutes();
}


}


更多相关文章

  1. Android ProgressBar 自定义样式(六),仿真QQ pad版加载(位置居中)
  2. 利用浏览器默认方法获取浏览器当前位置
  3. Android之ScrollView滚动到指定位置
  4. Android Studio中添加Permission权限的步骤与位置
  5. Android 代码当中动态改变某个控件的位置
  6. Android EditText插入字符串到光标所在位置和删除
  7. 【原创】Android 设置Dialog的长宽和位置
  8. 代码设置RelativeLayout相对位置设置
  9. Android 点击editview以外位置实现隐藏输入法

随机推荐

  1. Android NFS 文件系统
  2. Android接口定义语言---AIDL(一)
  3. Bugly Android 快速接入使用文档
  4. Android(安卓)Dialog的四种情况
  5. android webview js交互 第一节 (java和js
  6. Handler 使用方法详解
  7. android数据升级方案
  8. Android--shape-指定图形的corners、grad
  9. Android 调试技术
  10. Android与H5交互