Android 自定义倒计时控件CountdownTextView
效果如下:
剩余 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的更多相关文章
- android自定义倒计时控件示例
这篇文章主要介绍了Android秒杀倒计时自定义TextView示例,大家参考使用吧 自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.co ...
- android中倒计时控件CountDownTimer分析
android中倒计时控件CountDownTimer分析 1 示例代码 new CountDownTimer(10000, 1000) { public void onTick(long milli ...
- Android自定义日历控件(继承系统控件实现)
Android自定义日历控件(继承系统控件实现) 主要步骤 编写布局 继承LinearLayout设置子控件 设置数据 继承TextView实现有圆圈背景的TextView 添加Attribute 添 ...
- Android自定义组合控件详细示例 (附完整源码)
在我们平时的Android开发中,有时候原生的控件无法满足我们的需求,或者经常用到几个控件组合在一起来使用.这个时候,我们就可以根据自己的需求创建自定义的控件了,一般通过继承View或其子类来实现. ...
- 014 Android 自定义组合控件
1.需求介绍 将已经编写好的布局文件,抽取到一个类中去做管理,下次还需要使用类似布局时,直接使用该组合控件的对象. 优点:可复用. 例如要重复利用以下布局: <RelativeLayout an ...
- Android自定义用户控件简单范例(二)
对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应 ...
- (转)android自定义组合控件
原文地址:http://mypyg.iteye.com/blog/968646 目标:实现textview和ImageButton组合,可以通过Xml设置自定义控件的属性. 1.控件布局:以Linea ...
- android 自定义组合控件 顶部导航栏
在软件开发过程中,经常见到,就是APP 的标题栏样式几乎都是一样的,只是文字不同而已,两边图标不同.为了减少重复代码,提高效率, 方便大家使用,我们把标题栏通过组合的方式定义成一个控件. 例下图: 点 ...
- Android自定义评分控件:RatingStarView
RatingStarView Android自定义的评分控件,类似ProgressBar那样的,使用星星图标(full.half.empty)作为progress标识的评分/打分控件. 效果图 图1: ...
随机推荐
- 【Java】日志知识总结和经常使用组合配置(commons-logging,log4j,slf4j,logback)
Log4j Apache的一个开放源码项目,通过使用Log4j,我们能够控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等.用 ...
- 【小白的CFD之旅】23 串行与并行
夏日的早晨,被酷热和蚊子骚扰了一夜的小白刚进入梦乡就被老蓝的电话给惊醒了. “8点开会!”老蓝说话永远那么简短有力,根本不给人请假的时间就挂了电话. 小白一看时间,都7点半了,得,这懒觉睡不成了.小白 ...
- CCImage
#ifndef __CC_IMAGE_H__ #define __CC_IMAGE_H__ //派生于CCObject #include "cocoa/CCObject.h" // ...
- RequestDispatcher.forward和HttpServletResponse.sendRedirect
(1)RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件:而HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程 ...
- 理解Netty中的零拷贝(Zero-Copy)机制【转】
理解零拷贝 零拷贝是Netty的重要特性之一,而究竟什么是零拷贝呢? WIKI中对其有如下定义: “Zero-copy” describes computer operations in which ...
- signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
转:http://blog.sina.com.cn/s/blog_4850a7880100hnam.html void (*signal(int signo, void (*fun(int))))(i ...
- 【转】MySQL中information_schema是什么
大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个information_schema数据库. information_schema数据库是做什么用的呢,使用WordPress博客 ...
- BaseRecyclerViewAdapterHelper使用
Reference: https://www.jianshu.com/p/1e20f301272e 一.框架引入 先在项目的 build.gradle(Project:XXXX) 的 reposito ...
- DLL封装Interface(接口)(D2007+win764位)
相关资料: http://blog.csdn.net/liangpei2008/article/details/5394911 结果注意: 1.函数的传参方向必须一至. DLL实例代码: ZJQInt ...
- Swift 编程思想 阅读笔记
Swift 编程思想,第一部分:拯救小马html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeM ...