你还在使用Handler做计时器么?来一个自定义TextView解决这些困扰吧!

转载请注明出处:王亟亟的大牛之路

最近的上海简直热热热,我短袖短裤了还是热。。。

因为明天又有事不上班所以今天早上赶紧赶一篇内容出来(还好有想好些什么不然又要 Go Die了)

这边继续安利下 我的收纳库:https://github.com/ddwhan0123/Useful-Open-Source-Android 方便大家找资料,安全无毒



传统的 登陆界面总有那些 点击发送验证码然后等待接受的一个计时操作,今天就上一个类似的实现(不用传统方法咯)

先看下效果:

貌不惊人,我们先来看看传统的Handler或者TimerTask是怎么操作的

一、采用Handle与线程的sleep(long)方法

Handler主要用来处理接受到的消息。这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释。

1. 定义一个Handler类,用于处理接受到的Message。

Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        // 要做的事情
        super.handleMessage(msg);
    }
};
  1. 新建一个实现Runnable接口的线程类,如下:
public class MyThread implements Runnable {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (true) {
            try {
                Thread.sleep(1000);// 线程暂停1秒,单位毫秒
                Message message = new Message();
                message.what = 1;
                handler.sendMessage(message);// 发送消息
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
  1. 在需要启动线程的地方加入下面语句:
new Thread(new MyThread()).start();

二、采用Handler与timer及TimerTask结合的方法

定义定时器、定时器任务及Handler句柄

private final Timer timer = new Timer();
private TimerTask task;
Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        // 要做的事情
        super.handleMessage(msg);
    }
};

初始化计时器任务

task = new TimerTask() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        Message message = new Message();
        message.what = 1;
        handler.sendMessage(message);
    }
}; 

启动定时器


timer.schedule(task, 2000, 2000); 

这样的代码一样能做到如此,但是很麻烦 Why?因为handler要处理许多我们的异步行为,能往里面少丢东西就少丢吧,所以就自定义一个TextView来解决这个问题吧!!

包结构:

就一个自定义View和自定义标签的XML,要你放入自己的项目也很方便。

我们来看下如何使用

 <wjj.com.countingtextview.countingTextView
        android:id="@+id/countingText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp" />

首先在XML里做一些初始化的行为,当然因为是继承于TextView所以你要用java代码初始化也行。

然后获取对象

 countingText1 = (countingTextView) findViewById(R.id.countingText1);

接下来,设置下时间逻辑就OK啦 SO EASY 总比 handler还要开线程简单吧?

 countingText1.setInterpolator(new LinearInterpolator());
 countingText1.animateFromZero(60, 60000);


具体的一行行代码就不一一解释了,源码中对于重要的方法都有了注解,这边再把其他一些设置的方法来给大家解释下

//从startValue到endValue的动画过程
animateText(Integer startValue, Integer endValue)

//从0到endValue的动画过程
animateFromZero(Integer endValue) 

//设置结束值
setEndValue(int endValue)

//设置开始值
setStartValue(int startValue) 

//设置插值器
setInterpolator(TimeInterpolator interpolator)

不一句句读源码了,这里贴一段作为原理解释

  public void animateText(Integer startValue, Integer endValue) {
        setStartValue(startValue);
        setEndValue(endValue);

        ValueAnimator animator = ValueAnimator.ofInt(startValue, endValue);
        animator.setInterpolator(getInterpolator());
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            public void onAnimationUpdate(ValueAnimator animation) {
                setText(String.format(getFormat(), animation.getAnimatedValue()));
            }
        });

        animator.setEvaluator(new TypeEvaluator<Integer>() {
            public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
                return Math.round(startValue + (endValue - startValue) * fraction);
            }
        });

        animator.setDuration(getDuration());
        animator.start();
    }

默认调用设置开始,结束值然后使用ValueAnimator动画进行持续的刷新UI直到到最大值为止,时间区间由getDuration()方法来控制。

项目地址:https://github.com/ddwhan0123/BlogSample/tree/master/Countingtextview

下载地址:https://github.com/ddwhan0123/BlogSample/blob/master/Countingtextview/Countingtextview.zip

时间: 2024-11-09 02:07:38

你还在使用Handler做计时器么?来一个自定义TextView解决这些困扰吧!的相关文章

VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误

今天在用 VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误,如下所示 混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集 网上搜索得到解决办法: 在app.config中添加一个配置节:startup <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime

Nodejs做web服务器的一个简单逻辑和实现

本文写了自己对"Nodejs做web服务器的一个简单逻辑和实现",如果不太合理,或者了解这部分的大神,欢迎拍死.哈哈,新手. 昨天开始学习Nodejs,w3cschool看了一遍.感觉其上的内容,一上来就开始介绍Nodejs的模块.看来后来,连如何"从零创建一个nodejs版的web服务器"都没能明白.可能是自己太过肤浅,或者,陷到了WAMP的思维里,不能自拔吧.后来在nodejs中文社区发了个帖子.感觉自己算是明白了点儿.写出来,希望和大家一起学习,同时也希望得到

还在找事情做

深夜了写东西安静一些.脑袋却不怎么配合,好像要休息的样子.脑袋里进行的几条线路,觉得今天要再做些什么才可以睡觉. 那个未理通的架构思路有些卡在那里了.像一个搜索殷勤的话,客户需求进来,对语句进行一步步解析和过滤,再拉出整理后的结果返还给客户.用那种动态的架构就比较容易新增加一些功能和解析逻辑.大的小的都可以比较容易改动起来.关键是对整个项目比较好调动,站在这个思想上. 我有些找不到自己想做的事.如果有钱就去开个网吧,早7晚11,饭点收费加三倍,不让吸烟空气清晰,不提供通宵.就是一个白天上网的地方

能写出这样的文章,还会有心继续做程序猿吗?

编者(就是我啦,坤哥,超级表格创始人)按: 我看电影前喜欢先看影评,经常惊叹于他人的精辟分析.我写不出来,纵使我也有满腹意见.没想到的是,我们的程序猿小凯,已然写出了我写不出来的"精辟影评".想到这,我很得意,因为可以对这个"作家"吆喝:小凯,你这厮给我改bug去,超级表格的团队模块发现了漏洞! 扯淡技术哪家强?<秘术>周末隆重登场.这个电影倒也不是通篇扯淡,起码告诉了女同胞们三个很深刻的人生感悟:一,小白脸都是坏人:二,汉奸发型的都是坏人.三,说自己不

还在用Excel做管理?安利一款简单灵活,又能满足高要求的在线表格

现代化办公对时效性.数据安全性.稳定性都有很高要求 现在的企业们在追求效率的同时,对数据安全性.稳定性等提出了前所未有高要求,在那些重视管理的企业里,一切的决策都围绕着数据进行,希望可以用到比较可续鞥多而方式来指导企业做出的每一个动作,互联网时代,如果继续凭经验的企业真的无法与那些手持高科技工具的企业进行竞争. Excel灵活便捷,但作为管理工具并不是最好的选择 说到高科技工具,我就要先提Excel软件,当然,大家对它再熟悉不过了,它简单灵活,几乎每个人在工作中都使用过.例如某家企业使用Exce

雷军成功七字真诀:专注、极致、口碑和快(做精品的同时,还强调性价比,做自己的极限,对用户的需求最快速响应,而不是急着出产品)

凤凰科技讯 5月17日消息,由凤凰网科技主办的<趋·势>沙龙第九期于5月12日举办,本期主题特邀国内知名天使投资人.现任小米科技创始人兼CEO雷军分享创业和投资经验.创新工场合伙人郎春晖主持了本次沙龙. 雷军表示,自己不是天才,成功的主要原因是遵循“专注.极致.口碑和快”这七字真诀.在他看来,做到这七字真诀,便是用互联网思维武装自己,做事就可事半功倍. 以下是雷军提出的七字真诀: 专注:少就是多.大道至简 我们所有人都在谈论苹果,谈论乔布斯,其实苹果和乔布斯给我们的第一个启发就是专注. 苹果已

还在用rem做移动端适配?最新移动端适配方案vw,vh了解一下!

vw,vh都是相对于屏幕视口的单位. vw:相对于视口的宽度.视口被均分为100单位的vw: vh:相对于视口的高度.视口被均分为100单位的vh: vmax:相对于视口的宽度或高度中较大的那个.其中最大的那个被均分为100单位的vmax: vmin:相对于视口的宽度或高度中较小的那个.其中最小的那个被均分为100单位的vmin: 解释完相关观念,下面就来说说具体的适配方案: 一般UI给的设计稿都是采用750X1334的,因此可以使用sass来编写一个函数: 1 $containerWidth:

用Fragment做蒙版来进行一个初始教学提示的效果

在android 软件第一次使用的时候,一般会在当前的界面上做一个灰色的蒙版,上面有显示的一些提醒性质的教学文字或者图案. 我想的是当前界面上蒙上一个 Fragment 把提示信息也放在Fragment上. 这是效果图.后面附上demo源码. 具体就是在activity成功启动之后.画出activity的view之后.这个不能在生命周期进行判断.我尝试的是用Handler去不断postDelay查看view是否被画出.即view的width > 0. 然后用代码动态的把这个蒙版Fragment加

我想做产品,实现一个非常优秀的电脑桌面记事本加闹钟

如果你觉得可以,如果你是编程,嘿嘿,如果你愿意与我合作,我就非常高兴. 我希望做一个桌面记事本,他那个是动态的,像秋天一样,让我的鼠标划过那个地方的时候,那种像秋天展开一样站过来站,抽,就打开来,或者说笑一个,记事本一样往下翻开,显示出对应的内容,然后,我会将整个桌面,设计成很多的小方格,大小不同,形状各异,图案各异,也可以实现自定义,个性化的定制,图片背景,和颜色色彩搭配,然后,在桌面上的每个小方格上面,可以自己进行,输入相关的内容,当我划过的时候,鼠标滑过的时候,而且能够灵敏的,展开和收楼,