Android倒计时效果.docx

上传人:b****6 文档编号:8828465 上传时间:2023-02-02 格式:DOCX 页数:13 大小:52.74KB
下载 相关 举报
Android倒计时效果.docx_第1页
第1页 / 共13页
Android倒计时效果.docx_第2页
第2页 / 共13页
Android倒计时效果.docx_第3页
第3页 / 共13页
Android倒计时效果.docx_第4页
第4页 / 共13页
Android倒计时效果.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Android倒计时效果.docx

《Android倒计时效果.docx》由会员分享,可在线阅读,更多相关《Android倒计时效果.docx(13页珍藏版)》请在冰豆网上搜索。

Android倒计时效果.docx

Android倒计时效果

Android倒计时效果

在Android开发中,我们一般用3个简单的方法来实现定时器的效果:

采用Handler与线程的sleep(long)方法,通过线程休眠的方法来定时利用handler来发送数据,并在handler的handlerMessage()方法中进行处理。

采用Handler的postDelayed(Runnable,long)方法,这也是我在开发中经常用到的方法,例如:

启动页跳转引导页和主页面的时候,我就经常使用这种方法,还有ViewPager做轮播图的时候等等。

采用Handler与timer及TimerTask结合的方法,这种方法在我的开发中,有一次要做直播页面,需要模仿观看回放时候的点赞效果,虚拟模仿观看者点赞效果,在1秒之内随机点多少个赞,就是用的这种方法实现的。

下面详细介绍一下三个方法该怎么使用:

下面逐一介绍:

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

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

Handlerhandler=newHandler(){

@Override

publicvoidhandleMessage(Messagemsg){

super.handleMessage(msg);

//这里写handler要处理的工作,例如页面的文字的改变,

}

};

新建一个实现Runnable接口的线程类。

publicclassMyHandlerThreadimplementsRunnable{

@Override

publicvoidrun(){

while(true){

try{

//线程休眠一秒钟

Thread.sleep(1000);

//通过Message对象来发送消息

Messagemessage=newMessage();

message.what=1;

handler.sendMessage(message);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

}

}

在需要启动线程的地方通过Thread的start()方法来启动线程:

newThread(newMyHandlerThread()).start();

一旦通过3中的方法启动线程后,该线程将会每隔一秒钟发送一个消息,handler在接受到消息之后就可以进行数据的处理操作了。

二、采用Handler的postDelayed(Runnable,long)方法。

这个实现比较简单,在实际开发中也经常用到。

定义一个Handler类:

Handlerhandler=newHandler();

Runnablerunnable=newRunnable(){

@Override

publicvoidrun(){

//这里写处理的逻辑

handler.postDelayed(this,2000);

}

};

启动计时器:

调用handler.postDelayed(this,2000);方法,会每隔两秒执行一个runnable中的run()方法,达到定时的效果。

停止计时器:

handler.removeCallbacks(runnable);

三、采用Handler与timer及TimerTask结合的方法,这种方法在用的时候稍微有点复杂,这里涉及到Timer和TImerTask这两个类的使用

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

privateTimertimer;

privateTimerTasktimerTask;

Handlerhandler=newHandler(){

@Override

publicvoidhandleMessage(Messagemsg){

//这里写要处理的逻辑

super.handleMessage(msg);

}

};

初始化计时器任务:

timerTask=newTimerTask(){

@Override

publicvoidrun(){

Messagemessage=newMessage();

message.what=1;

handler.sendMessage(message);

}

};

启动定时器:

最后调用timer的schedule()方法来启动定时器。

schedule()如下所示:

我们一般调用timer的schedule(TimerTasktask,longdelay)和schedule(TimerTasktask,longdelay,longperiod)这两个方法,第一个方法,timerTask将会在dalay/1000秒后执行.且只执行一次。

第二个方法会在dalay/1000秒后执行,且经过period/1000秒后将会重新执行该timeTask。

关闭定时器:

timer.cancel();调用timer的cancle()方法即可关闭该定时器。

总结:

首先非常感谢原作者风吹过wu在安卓巴士网站的分享。

其次掌握这三个方法不仅仅加深对Handle、Thread、Timer和TimerTask这几个类的理解,更重要的是可以提高我们在开发中的工作效率。

今日工作中需要实现一个类似淘宝的时分秒倒计时的效果,此效果就可以用上述所述的方法来完成,不过需要仔细计算而已。

但是,开发中讲究的是高效率,高质量,于是自己就从GitHub上serach了一份代码用着挺好的,推荐给大家。

这里主要是一个自定义的View——-RushBuyCountDownTimerView,

packagecom.qust.widght;

importjava.util.Timer;

importjava.util.TimerTask;

importandroid.annotation.SuppressLint;

importandroid.content.Context;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.util.AttributeSet;

importandroid.view.LayoutInflater;

importandroid.view.View;

importandroid.widget.LinearLayout;

importandroid.widget.TextView;

importandroid.widget.Toast;

importcom.qust.rushbuycountdowntimerview.R;

@SuppressLint("HandlerLeak")

publicclassRushBuyCountDownTimerViewextendsLinearLayout{

//小时,十位

privateTextViewtv_hour_decade;

//小时,个位

privateTextViewtv_hour_unit;

//分钟,十位

privateTextViewtv_min_decade;

//分钟,个位

privateTextViewtv_min_unit;

//秒,十位

privateTextViewtv_sec_decade;

//秒,个位

privateTextViewtv_sec_unit;

privateContextcontext;

privateinthour_decade;

privateinthour_unit;

privateintmin_decade;

privateintmin_unit;

privateintsec_decade;

privateintsec_unit;

//计时器

privateTimertimer;

privateHandlerhandler=newHandler(){

publicvoidhandleMessage(Messagemsg){

countDown();

};

};

publicRushBuyCountDownTimerView(Contextcontext,AttributeSetattrs){

super(context,attrs);

this.context=

LayoutInflaterinflater=(LayoutInflater)context

.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

Viewview=inflater.inflate(R.layout.view_countdowntimer,this);

tv_hour_decade=(TextView)view.findViewById(R.id.tv_hour_decade);

tv_hour_unit=(TextView)view.findViewById(R.id.tv_hour_unit);

tv_min_decade=(TextView)view.findViewById(R.id.tv_min_decade);

tv_min_unit=(TextView)view.findViewById(R.id.tv_min_unit);

tv_sec_decade=(TextView)view.findViewById(R.id.tv_sec_decade);

tv_sec_unit=(TextView)view.findViewById(R.id.tv_sec_unit);

}

/**

*

*@Description:

开始计时

*@param

*@returnvoid

*@throws

*/

publicvoidstart(){

if(timer==null){

timer=newTimer();

timer.schedule(newTimerTask(){

@Override

publicvoidrun(){

handler.sendEmptyMessage(0);

}

},0,1000);

}

}

/**

*

*@Description:

停止计时

*@param

*@returnvoid

*@throws

*/

publicvoidstop(){

if(timer!

=null){

timer.cancel();

timer=null;

}

}

/**

*@throwsException

*

*@Description:

设置倒计时的时长

*@param

*@returnvoid

*@throws

*/

publicvoidsetTime(inthour,intmin,intsec){

if(hour>=60||min>=60||sec>=60||hour<0||min<0||sec<0){

thrownewRuntimeException("Timeformatiserror,pleasecheckoutyourcode");

}

hour_decade=hour/10;

hour_unit=hour-hour_decade*10;

min_decade=min/10;

min_unit=min-min_decade*10;

sec_decade=sec/10;

sec_unit=sec-sec_decade*10;

tv_hour_decade.setText(hour_decade+"");

tv_hour_unit.setText(hour_unit+"");

tv_min_decade.setText(min_decade+"");

tv_min_unit.setText(min_unit+"");

tv_sec_decade.setText(sec_decade+"");

tv_sec_unit.setText(sec_unit+"");

}

/**

*

*@Description:

倒计时

*@param

*@returnboolean

*@throws

*/

privatevoidcountDown(){

if(isCarry4Unit(tv_sec_unit)){

if(isCarry4Decade(tv_sec_decade)){

if(isCarry4Unit(tv_min_unit)){

if(isCarry4Decade(tv_min_decade)){

if(isCarry4Unit(tv_hour_unit)){

if(isCarry4Decade(tv_hour_decade)){

Toast.makeText(context,"时间到了",Toast.LENGTH_SHORT).show();

stop();

}

}

}

}

}

}

}

/**

*

*@Description:

变化十位,并判断是否需要进位

*@param

*@returnboolean

*@throws

*/

privatebooleanisCarry4Decade(TextViewtv){

inttime=Integer.valueOf(tv.getText().toString());

time=time-1;

if(time<0){

time=5;

tv.setText(time+"");

returntrue;

}else{

tv.setText(time+"");

returnfalse;

}

}

/**

*

*@Description:

变化个位,并判断是否需要进位

*@param

*@returnboolean

*@throws

*/

privatebooleanisCarry4Unit(TextViewtv){

inttime=Integer.valueOf(tv.getText().toString());

time=time-1;

if(time<0){

time=9;

tv.setText(time+"");

returntrue;

}else{

tv.setText(time+"");

returnfalse;

}

}

}

从上面代码中即可看到,此倒计时效果就是使用上面所提到的第三种方法来完成的,其中所用到的view_countdowntimer布局文件如下:

xmlversion="1.0"encoding="utf-8"?

>

android="wrap_content"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

background="@android:

color/white"

android:

orientation="horizontal"

android:

padding="10dp">

android:

id="@+id/tv_hour_decade"

style="@style/RushBuyCountDownTimerViewStyle"/>

android:

id="@+id/tv_hour_unit"

style="@style/RushBuyCountDownTimerViewStyle"

android:

layout_marginLeft="1dp"/>

android:

layout_width="wrap_content"

android:

layout_height="match_parent"

android:

background="@android:

color/white"

android:

gravity="center"

android:

text=":

"

android:

textColor="#4F4242"

android:

textSize="30sp"/>

android:

id="@+id/tv_min_decade"

style="@style/RushBuyCountDownTimerViewStyle"/>

android:

id="@+id/tv_min_unit"

style="@style/RushBuyCountDownTimerViewStyle"

android:

layout_marginLeft="1dp"/>

android:

layout_width="wrap_content"

android:

layout_height="match_parent"

android:

background="@android:

color/white"

android:

gravity="ter"

android:

text=":

"

android:

textColor="#4F4242"

android:

textSize="30sp"/>

android:

id="@+id/tv_sec_decade"

style="@style/RushBuyCountDownTimerViewStyle"/>

android:

id="@+id/tv_sec_unit"

style="@style/RushBuyCountDownTimerViewStyle"

android:

layout_marginLeft="1dp"/>

RushBuyCountDownTimerViewStyle这个Style文件如下,在这个文件中主要定义字体大小、颜色、背景色等:

layout_width">wrap_content

layout_height">wrap_content

background">@drawable/bg_view

gravity">center

text">0

textColor">@android:

color/white

textSize">35sp

textStyle">bold

上面的布局效果默认是这样的:

00:

00:

00//分别对应时、分、秒

最后:

假如需要在MainActivity.Java中使用此倒计时控件,只需要在MainActivityjava的布局文件activity_main.xml中加入此控件,设置倒计时的时候,然后在代码中调用start()方法即可实现倒计时的效果。

activity_main.xml文件如下:

android:

layout_width="match_parent"

android:

layout_height="match_parent"

android:

orientation="vertical">

android:

id="@+id/timerView"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content">

MainActivity.java文件如下:

packagecom.qust.widght;

importandroid.app.Activity;

importandroid.os.Bundle;

importcom.qust.rushbuycountdowntimerview.R;

publicclassMainActivityextendsActivity{

privateRushBuyCountDownTimerViewtimerView;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

timerView=(RushBuyCountDownTimerView)findViewById(R.id.timerView);

//设置倒计时的时、分、秒

timerView.setTime(10,0,10);

//开始倒计时

timerView.start();

}

}

最后:

通过上面的几个步骤即可完成倒计时效果,且rushbuycountdowntimerview中也加入了倒计时结束时候的逻辑处理,一般我们需要在这里给用户提示信息,或者对View进行处理等,详细的就不在这里说了。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1