工具类
package com.sctek; import java.lang.reflect.Field; import android.os.CountDownTimer;
import android.util.Log; /**
* 自定义倒计时类
* 当时间剩下2分钟时,开始红白交替闪动,当时间只剩下1分钟时加快闪动频率
*
* @author YeXiubiao 2012-01-02
*/
public abstract class CustomCountDownTimer extends CountDownTimer {
private static final long TIME_CHANGE_SPEED = 3 * 60 * 1000L; // 1分钟
private static final long TIME_FLASH = 3 * 60 * 1000L; // 2分钟
private static final long CALLBACK_SPEED = 500L; // 回调速度(0.5秒回调一次)
private boolean changeColor = false; // 颜色交替闪动变换标记
private boolean hasChangedColor = false; // 改变回调颜色的flag,控制只执行一次
private boolean hasChangedSpeed = false; // 改变回调速度的flag,控制只执行一次 public CustomCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
} public void onTick(final long millisUntilFinished) { // 重点是 此方法必须执行 可以是自己调用或者是系统调用 如同线程中的Run方法
Log.e("onTick", "........" + millisUntilFinished);
final long m = millisUntilFinished / 60000L; // 分;
// 格式化分钟的格式
final String minute;
if (m < 10) {
minute = "0" + m;
} else {
minute = String.valueOf(m);
}
// 格式化秒钟的格式
final long ss = (millisUntilFinished / 1000L) % 60L; // 秒
final String second;
if (ss < 10) {
second = "0" + ss;
} else {
second = String.valueOf(ss);
}
// 最终格式: 01:05
final String time = minute + ":" + second; // 如果剩余时间小于TIME_FLASH则开始闪动(红白颜色交替变化)
if (millisUntilFinished <= TIME_FLASH && !hasChangedColor) {
changeColor = true;
//hasChangedColor = true; // 控制只执行一次
} // 如果剩余时间小于2分钟则闪动频率加快(每0.5秒回调一次)
if (!hasChangedSpeed && millisUntilFinished <= TIME_CHANGE_SPEED) {
changeCountdownInterval(false);
//hasChangedSpeed = true; // 控制只执行一次
} onTickCallBackTo(time, minute, second, changeColor);
}    //该方法是暴露给 业务层的方法 在 activity 及其相关的业务层调用 在该示例中发动该函数的是onTick方法
public abstract void onTickCallBackTo(final String value, final String min,
final String sec, boolean changeColor); int count = 1;
long tims = 1000;
long result = 1000; @SuppressWarnings("rawtypes")
/**改变回调频率*/
private void changeCountdownInterval(boolean flag) {
if (flag) {
count = 1;
}
if (count <= 5) {
result = tims * (2 * count - 1);
} else {
result = tims * 10;
}
count++;
try {
// 反射父类CountDownTimer的mCountdownInterval字段,动态改变回调频率
Class clazz = Class.forName("android.os.CountDownTimer");
Field field = clazz.getDeclaredField("mCountdownInterval");
field.setAccessible(true);
field.set(this, result);
Log.e("timer", "........" + result + "........." + count);
} catch (Exception e) {
Log.e("Ye", "反射类android.os.CountDownTimer失败: " + e);
}
} public void controlTime(boolean flag) {
changeCountdownInterval(true);
} } activity 实现层
package com.sctek;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView; //import cn.swiftpass.spay.R; /**
* 自定义倒计时测试
*
* @author YeXiubiao 2012-01-02
*/
public class MainActivity extends Activity { private TextView tv_timer;
private TextView tv_content; private static final long MILLIS_IN_FUTURE = 4 * 60 * 1000; // 2分钟
private static final long COUNT_DOWN_INTERVAL = 1000; // 1秒
private boolean colorFlag = false; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tv_timer = (TextView) findViewById(R.id.tv_timer);
tv_content = (TextView) findViewById(R.id.tv_content); startTimer();
} private void startTimer() {
CustomCountDownTimer timer = new CustomCountDownTimer(MILLIS_IN_FUTURE, COUNT_DOWN_INTERVAL) {
@Override
public void onTickCallBackTo(String value, String min, String sec, boolean changeColor) {
if (changeColor) {
//控制颜色红白交替变化
if (colorFlag = !colorFlag) {
tv_timer.setTextColor(Color.RED);
} else {
tv_timer.setTextColor(Color.WHITE);
}
}
tv_timer.setText(value);
} @Override
public void onFinish() {
tv_timer.setText("00:00");
tv_timer.setTextColor(Color.RED); tv_content.setText("时间到了!");
tv_content.setTextColor(Color.RED);
controlTime(true);
} };
timer.start();
}
}

Java高阶回调,回调函数的另一种玩法的更多相关文章

  1. Java高阶语法---transient

    背景:听说transient Java高阶语法是挺进BAT必经之路. transient: Java中transient 关键字的作用,简单的说就是让某些被修饰的成员属性变量不被序列化. 这又扯到了序 ...

  2. Java高阶语法---static

    背景:听说static Java高阶语法是挺进BAT必经之路. static: 静态static,很多时候会令我望文生义,但是get到了static最重要的一点,其他的理解都还ok. static最重 ...

  3. Java高阶语法---Volatile

    背景:听说Volatile Java高阶语法亦是挺进BAT的必经之路. Volatile: volatile同步机制又涉及Java内存模型中的可见性.原子性和有序性,恶补基础一波. 可见性: 可见性简 ...

  4. Java高阶语法---final

    背景:听说final Java高阶语法是挺进BAT必经之路. final: final关键字顾名思义就是最终不可改变的. 1.含义:final可以声明成员变量.方法.类和本地变量:一旦将引用声明为fi ...

  5. Java高阶面试问题合集

    下面总结一下在Java面试中常用的一些问题,不具体解答,我只附上一些精彩的博文链接. Spring IOC AOP 底层原理 JAVA的反射机制和动态代理 Java反射机制和动态代理 多线程 Spri ...

  6. python 高阶内置函数

    1.lambda 匿名函数 lambda 参数: 返回值 函数名统一都叫lambda. 2.sorted() 排序函数 排序函数 sorted(iterable,key,reverse) key:排序 ...

  7. Java 高阶 —— try/catch

    // try catch 在 for 循环外 try { for(int i = 0; i < max; i++) { String myString = ...; float myNum = ...

  8. Java 高阶 —— native 关键字与 JNI

    1. JNI Java中JNI的使用详解第一篇:HelloWorld JNI:Java Native Interface,Java 本地接口(或本机接口,更具体地讲叫本地编程接口),其提供了若干 AP ...

  9. Java 高阶 —— 相等性比较

    1. 包装类 所有的相同类型的包装类对象之间的值的比较,全部使用 equals 方法: 对于 Integer a = ?,在 -128 到 127 范围内的赋值,Integer 对象是在 Intege ...

随机推荐

  1. 由odoo源不稳定想到的,一个非常简单但是有效的方式解决yum源不稳定的问题,实现无限重试

    如题,最近在安装odoo 10, 但是官方源的速度是在是不敢恭维,断断续续的. yum 有没有能够无限重试的参数,于是用python写了个死循环,让它无限重试下去 脚本如下: #! /usr/bin/ ...

  2. JavaSE 初学系统托盘图标SystemTray类

    文章目录 1.预备知识 2.使系统托盘显示图标 3.添加提示 4.添加弹出菜单 设置Java程序的系统托盘图标,用到SystemTray类和TrayIcon类. 1.预备知识 JavaAPI对于Sys ...

  3. ArrayAdapter构造方法中的textViewResourseId

    simple_list_item_1:每个列表项都是一个普通的textView simple_list_item_2:每个列表项都是一个普通的textView(字体略大) simple_list_it ...

  4. "tsc.exe"已退出,代码1

    公司开发新项目要用到ABP,于是到处在网上找些资料学习,在官网下好了模板(http://aspnetboilerplate.com/Templates),拿下来后用vs(博主用的是vs2013)编译后 ...

  5. [html]CSS中的margin、border、padding区别

    图解CSS padding.margin.border属性W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层. ...

  6. 微信小程序 - 曲线图

    最近要做微信小程序,项目中需要曲线图显示数据,所以在网上看了一下找了很久都没有找到一个,不知道是我查找的姿势不对,还是什么的.所以就自己做了一个曲线图,现在分享给大家. wxml代码: <can ...

  7. #2019-2020-4 《Java 程序设计》第七周总结

    2019-2020-4 <Java 程序设计>第七周知识总结 第八章:常用实用类 一.String类 String类的构造方法 public String(byte[] bytes); p ...

  8. 第四周助教工作总结——NWNU李泓毅

    1.    助教博客链接: https://www.cnblogs.com/NWNU-LHY/ 2.    作业要求链接: www.cnblogs.com/nwnu-daizh/p/10487329. ...

  9. 【翻译】Flume 1.8.0 User Guide(用户指南) Processors

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

  10. python中使用XPath

    XPath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线. XPath介绍: ...