效果如下:

剩余 00:59:21

package com.bihu.advertiserapp.widgets;

import android.annotation.TargetApi;
import android.content.Context;
import android.icu.text.SimpleDateFormat;
import android.os.Handler;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView; import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask; /** 倒计时控件
* Created by huqiang2 on 2016/12/7.
*/ public class CountdownTextView extends TextView { long mSeconds;
String mStrFormat;
Map<Integer,Timer> mTimerMap;
TimerTask mTimerTask;
final int what_count_down_tick = 1;
String TAG = "CountdownTextView";
public CountdownTextView(Context context) {
super(context);
} public CountdownTextView(Context context, AttributeSet attrs) {
super(context, attrs);
} public CountdownTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(21)
public CountdownTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
} /**
*
* @param format 例如:剩余%s
* @param seconds
*/
public void init(String format,long seconds){
mTimerMap = new HashMap<>();
if(!TextUtils.isEmpty(format)){
mStrFormat = format;
}
mSeconds = seconds; //设置总共的秒数
mTimerTask = new TimerTask() {
@Override
public void run() {
if(mSeconds > 0){
mSeconds --;
mHandler.sendEmptyMessage(what_count_down_tick);
}
}
};
}
public void start(int position){
if(mTimerMap.get(position) == null){
Timer timer = new Timer();
mTimerMap.put(position,timer);
mTimerMap.get(position).schedule(mTimerTask,0,1000);
}
}
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what){
case what_count_down_tick:
if(mSeconds <= 0){
setText(String.format(mStrFormat,"00:00:00"));
}else {
Log.e(TAG,"mSeconds="+mSeconds+"#what_count_down_tick:"+second2TimeSecond(mSeconds)+"#"+String.format(mStrFormat,second2TimeSecond(mSeconds)));
setText(mStrFormat== null ?second2TimeSecond(mSeconds):String.format(mStrFormat,second2TimeSecond(mSeconds)));
}
break;
}
}
}; @Override
public void removeOnLayoutChangeListener(OnLayoutChangeListener listener) {
Log.e(TAG,"removeOnLayoutChangeListener");
super.removeOnLayoutChangeListener(listener);
} @Override
public void removeOnAttachStateChangeListener(OnAttachStateChangeListener listener) {
Log.e(TAG,"removeOnAttachStateChangeListener");
super.removeOnAttachStateChangeListener(listener);
} /**
* 转化为 hh:mm:ss 格式
* @param second
* @return
*/
private String second2TimeSecond(long second) {
long hours = second / 3600;
long minutes = (second%3600)/ 60;
long seconds = second % 60; String hourString = "";
String minuteString = "";
String secondString = "";
if(hours < 10){
hourString = "0";
if(hours == 0){
hourString += "0";
}else{
hourString += String.valueOf(hours);
}
}else{
hourString = String.valueOf(hours);
}
if (minutes < 10) {
minuteString = "0";
if (minutes == 0) {
minuteString += "0";
}else {
minuteString += String.valueOf(minutes);
}
}else{
minuteString = String.valueOf(minutes);
}
if(seconds < 10){
secondString = "0";
if (seconds == 0) {
secondString += "0";
}else {
secondString += String.valueOf(seconds);
}
}else {
secondString = String.valueOf(seconds);
}
return hourString + ":" + minuteString+":"+secondString;
}
}

Android 自定义倒计时控件CountdownTextView的更多相关文章

  1. android自定义倒计时控件示例

    这篇文章主要介绍了Android秒杀倒计时自定义TextView示例,大家参考使用吧 自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.co ...

  2. android中倒计时控件CountDownTimer分析

    android中倒计时控件CountDownTimer分析 1 示例代码 new CountDownTimer(10000, 1000) { public void onTick(long milli ...

  3. Android自定义日历控件(继承系统控件实现)

    Android自定义日历控件(继承系统控件实现) 主要步骤 编写布局 继承LinearLayout设置子控件 设置数据 继承TextView实现有圆圈背景的TextView 添加Attribute 添 ...

  4. Android自定义组合控件详细示例 (附完整源码)

    在我们平时的Android开发中,有时候原生的控件无法满足我们的需求,或者经常用到几个控件组合在一起来使用.这个时候,我们就可以根据自己的需求创建自定义的控件了,一般通过继承View或其子类来实现. ...

  5. 014 Android 自定义组合控件

    1.需求介绍 将已经编写好的布局文件,抽取到一个类中去做管理,下次还需要使用类似布局时,直接使用该组合控件的对象. 优点:可复用. 例如要重复利用以下布局: <RelativeLayout an ...

  6. Android自定义用户控件简单范例(二)

    对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应 ...

  7. (转)android自定义组合控件

    原文地址:http://mypyg.iteye.com/blog/968646 目标:实现textview和ImageButton组合,可以通过Xml设置自定义控件的属性. 1.控件布局:以Linea ...

  8. android 自定义组合控件 顶部导航栏

    在软件开发过程中,经常见到,就是APP 的标题栏样式几乎都是一样的,只是文字不同而已,两边图标不同.为了减少重复代码,提高效率, 方便大家使用,我们把标题栏通过组合的方式定义成一个控件. 例下图: 点 ...

  9. Android自定义评分控件:RatingStarView

    RatingStarView Android自定义的评分控件,类似ProgressBar那样的,使用星星图标(full.half.empty)作为progress标识的评分/打分控件. 效果图 图1: ...

随机推荐

  1. 菜鸟学Java(十六)——Jboss简介

    简介 JBoss是全世界开发者共同努力的成果,一个基于J2EE的开放源代码的应用服务器. 因为JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用它,而不用支付费用.2006年,Jboss公司 ...

  2. 菜鸟学SSH(二)——Struts2国际化手动切换版

    国际化(internationalization,i18n)和本地化(localization,l10n)指让产品(出版物,软件,硬件等)能够适应非本地环境,特别是其他的语言和文化.程序在不修改内部代 ...

  3. 10-free-must-read-books-machine-learning-data-science

    Spring. Rejuvenation. Rebirth. Everything’s blooming. And, of course, people want free ebooks. With ...

  4. .NET MVC EF框架数据库连接配置

    1:数据库的配置和连接 Web.config <connectionStrings> <add name="SQLConnectionString" connec ...

  5. [Windows Azure] Load Testing in Windows Azure

    The primary goal of a load test is to simulate many users accessing a web application at the same ti ...

  6. 每天一个linux命令(4) df命令

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...

  7. 对于iOS开发人工智能意味着什么

    对于iOS开发人工智能意味着什么? 前言 近几年来人工智能的话题那是炙手可热.在国内很多大佬言必谈机器学习和大数据:在美国刚毕业的人工智能 PHD 也是众人追捧,工资直逼 NFL 四分卫.人工智能甚至 ...

  8. Git详解之Git分支

    Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的 ...

  9. SAP NetWeaver BW 7.3介绍

    (摘自SAP 官方 EIM300 SAP NetWeaver BW 7.3 特色功能.前景展望与路线图)

  10. 分析jvm线程堆栈

    目录 一.java线程状态 二.使用jstack生成进程dump文件 三.统计dump文件中处于不同状态的线程数量 四.举例分析不同状态的线程 1.分析BLOCKED (on object monit ...