android倒计时控件示例
作者:SRian215 发布时间:2022-12-01 05:34:53
标签:android,倒计时
本文为大家分享了android倒计时控件,供大家参考,具体代码如下
/*
* Copyright (C) 2012 The * Project
* All right reserved.
* Version 1.00 2012-2-11
* Author veally@foxmail.com
*/
package com.ly.sxh.view;
import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.SystemClock;
import android.provider.Settings;
import android.util.AttributeSet;
import android.widget.DigitalClock;
import java.util.Calendar;
/**
* Custom digital clock
* 倒计时控件
*
* @author
*/
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;
private ClockListener mClockListener;
private boolean mTickerStopped = false;
@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();
}
long distanceTime = endTime - currentTime;
distanceTime /= 1000;
if (distanceTime == 0) {
setText("00:00:00");
onDetachedFromWindow();
mClockListener.timeEnd();
} else if (distanceTime < 0) {
setText("00:00:00");
} 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 String dealTime(long time) {
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(hoursStr).append(":").append(minutesStr).append(":").append(secondStr);
return returnString.toString();
}
/**
* 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();
}
}
希望本文所述对大家学习Android软件编程有所帮助。


猜你喜欢
- 本文实例讲述了JAVA随机打乱数组顺序的方法。分享给大家供大家参考。具体实现方法如下:import java.util.Random;&nb
- 多线程解决for循环效率问题在for里面,如果执行一次for里面的内容所需时间比较长,可以使用线程池来提高for循环的效率public cl
- ArrayBlockingQueue有界的阻塞队列,内部是一个数组,有边界的意思是:容量是有限的,必须进行初始化,指定它的容量大小,以先进先
- 本文实例讲述了C#实现终止正在执行的线程的实现方法,并针对一些容易出错的地方进行了深入分析,具体方法如下:一般来说,很多人都会使用Abort
- 一.数组的三种声明方式总结public class WhatEver { public static void main(Str
- 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有
- 在action中存放数据,代码如下:@Controller // 加入到IOC容器//@RequestMapping(value="
- 本文实例为大家分享了java实现猜拳小游戏的具体代码,供大家参考,具体内容如下User.javaimport java.util.Scann
- 首先:我们要建一个web项目接着: 我们先来导入struts的xml文件第一步:右击你的项目名,鼠标到MyEclipse会看到一个add s
- Recyclerview现在基本已经替代Listview了,RecyclerView也越来越好用了 当我们有实现条目的拖拽排序和
- 一、迭代key&value第一种方式:迭代entrySet1.方法一/** * entrySet集合for-each循环(
- 本篇文章介绍SpringBoot的上传和下载功能。一、创建SpringBoot工程,添加依赖compile("org.spring
- 题目要求思路一:反向点+并查集根据题意不喜欢就不在一个组可以想到使用并查集,本题是两个集合所以对每一个节点引入一个反向点,使两者分属于不同集
- 导语本章根据百度地图API,实现仿钉钉打卡功能。用到了基础地图、覆盖物、定位图层、陀螺仪方法、悬浮信息弹框。百度地图API地址
- 因为项目需要,需要在一个之前没做过springBoot项目的eclipse上跑一个springBoot项目并完成打包,所以就在网上查完资料以
- Java jar打包成exe应用程序,可在无JDK/JRE环境下运行老师让做一个小项目,但是需要打包发布出来,因此在网上查了很多资料之后总结
- synchronized关键字synchronized,我们谓之锁,主要用来给方法、代码块加锁。当某个方法或者代码块使用synchroniz
- yml与properties其实yml和properties文件是一样的原理,且一个项目上要么yml或者properties,二选一的存在。
- kotlin基础教程之类和继承类声明使用class关键字声明类,查看其声明格式:: modifiers ("class"
- 大体思路如果发总金额为 m的 n 个红包,先用一个长度为 n的临时数组 a 存放 n个随机双精度小数 ,然后用 sum表示数组