效果如下:

剩余 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. iOS 应用程序目录结构

    iOS应用程序采用的是沙盒原理设计,普及一下知识:沙盒是在受限的安全环境中运行应用程序的一种做法,这种做法是要限制授予应用程序的代码访问权限. 具体的特点有三点:1.每个应用程序都有自己的存储空间:  ...

  2. mydqldump 备份数单库 然后还原数据的时候报:ERROR 1881 (HY000) at line 52: Operation not allowed when innodb_forced_recovery > 0.

    修改my.cnf innodb_force_recovery = 1 修改为: innodb_force_recovery = 0

  3. 菜鸟学SSH(九)——Hibernate——Session之save()方法

    Session的save()方法用来将一个临时对象转变为持久化对象,也就是将一个新的实体保存到数据库中.通过save()将持久化对象保存到数据库需要经过以下步骤: 1,系统根据指定的ID生成策略,为临 ...

  4. kernel dump Analysis

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c418482-7edd-4c91-b7f4-6005d550244a/got-the- ...

  5. 服务器重启后如何开启由docker部署的redmine

    1. 服务器重启后,需要重新开启docker服务 systemctl start docker 2. 查看全部container,包括exited的容器,找出redmine所对应的NAMES标签名称 ...

  6. slack机器人运维

    这里有一篇文章,够详细了:http://colobu.com/2015/11/04/create-a-slack-bot-with-golang/ 另外:这个py的库,test了一下,挺好使:http ...

  7. Asp.Net MVC TryUpdateModel使用说明

    修改功能每个网站里都有,也有很多写法 写法1:要修改的字段刚好等于表中的字段 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edi ...

  8. 转axios 的应用

    尤雨溪之前在微博发布消息,不再继续维护vue-resource,并推荐大家开始使用 axios . 一.axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP ...

  9. FFmpeg Basics学习笔记(1)ffmpeg基础

    1 FFmpeg的由来 FFmpeg缩写中,FF指的是Fast Forward,mpeg是 Moving Pictures Experts Group的缩写.官网:ffmpeg.org 编译好的可执行 ...

  10. spring boot guava cache 缓存学习

    http://blog.csdn.net/hy245120020/article/details/78065676 ****************************************** ...