热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现倒计时效果

这篇文章主要为大家详细介绍了Android实现倒计时效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android实现倒计时效果的具体代码,供大家参考,具体内容如下

一个倒计时的效果

先看效果图:

直接上代码:

这里是关于倒计时 …天时分秒…的逻辑判断

/**
  * 倒计时计算
  */
 private void computeTime() {
  mSecond--;
  if (mSecond <0) {
   mMin--;
   mSecOnd= 59;
   if (mMin <0) {
    mMin = 59;
    mHour--;
    if (mHour <0) {
     // 倒计时结束
     mHour = 23;
     mDay--;
     if(mDay <0){
      // 倒计时结束
      mDay = 0;
      mHour= 0;
      mMin = 0;
      mSecOnd= 0;
     }
    }
   }
  }
}

定时器主要代码如下…当然也可以开线程或者开后台服务来处理…只是没那种必要…定时器就可以搞定容易控制…毕竟倒计时时间起点…你总得后台获取吧,不是做时钟闹钟…如果是做时钟闹钟…拿你也不用考虑后台服务或者自己开线程…而是使用AlarmManager来实现

/**
  * 开启倒计时
  * //time为Date类型:在指定时间执行一次。
  *  timer.schedule(task, time);
  * //firstTime为Date类型,period为long,表示从firstTime时刻开始,每隔period毫秒执行一次。
  *  timer.schedule(task, firstTime,period);
  * //delay 为long类型:从现在起过delay毫秒执行一次。
  *  timer.schedule(task, delay);
  * //delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。
  *  timer.schedule(task, delay,period);
  */
 private void startRun() {
  TimerTask mTimerTask = new TimerTask() {
   @Override
   public void run() {
    Message message = Message.obtain();
    message.what = 1;
    timeHandler.sendMessage(message);
   }
  };
  mTimer.schedule(mTimerTask,0,1000);
 }

修改界面,利用handler来提醒更新界面

private Handler timeHandler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   if (msg.what == 1) {
    computeTime();
    mDays_Tv.setText(mDay+"");//天数不用补位
    mHours_Tv.setText(getTv(mHour));
    mMinutes_Tv.setText(getTv(mMin));
    mSeconds_Tv.setText(getTv(mSecond));
    if (mSecOnd== 0 && mDay == 0 && mHour == 0 && mMin == 0 ) {
     mTimer.cancel();
    }
   }
  }
 };
 
 private String getTv(long l){
  if(l>=10){
   return l+"";
  }else{
   return "0"+l;//小于10,,前面补位一个"0"
  }
 }

附带主activity的代码…

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
 
import java.util.Timer;
import java.util.TimerTask;
 
public class MainActivity extends AppCompatActivity {
 
 private RelativeLayout countDown;
 // 倒计时
 private TextView mDays_Tv, mHours_Tv, mMinutes_Tv, mSeconds_Tv;
 
 private long mDay = 23;// 天
 private long mHour = 11;//小时,
 private long mMin = 56;//分钟,
 private long mSecOnd= 32;//秒
 
 private Timer mTimer;
 
 private Handler timeHandler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   super.handleMessage(msg);
   if (msg.what == 1) {
    computeTime();
    mDays_Tv.setText(mDay+"");//天数不用补位
    mHours_Tv.setText(getTv(mHour));
    mMinutes_Tv.setText(getTv(mMin));
    mSeconds_Tv.setText(getTv(mSecond));
    if (mSecOnd== 0 && mDay == 0 && mHour == 0 && mMin == 0 ) {
     mTimer.cancel();
    }
   }
  }
 };
 
 private String getTv(long l){
  if(l>=10){
   return l+"";
  }else{
   return "0"+l;//小于10,,前面补位一个"0"
  }
 }
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mTimer = new Timer();
  countDown = (RelativeLayout) findViewById(R.id.countdown_layout);
  mDays_Tv = (TextView) findViewById(R.id.days_tv);
  mHours_Tv = (TextView) findViewById(R.id.hours_tv);
  mMinutes_Tv = (TextView) findViewById(R.id.minutes_tv);
  mSeconds_Tv = (TextView) findViewById(R.id.seconds_tv);
  startRun();
 }
 
 /**
  * 开启倒计时
  * //time为Date类型:在指定时间执行一次。
  *  timer.schedule(task, time);
  * //firstTime为Date类型,period为long,表示从firstTime时刻开始,每隔period毫秒执行一次。
  *  timer.schedule(task, firstTime,period);
  * //delay 为long类型:从现在起过delay毫秒执行一次。
  *  timer.schedule(task, delay);
  * //delay为long,period为long:从现在起过delay毫秒以后,每隔period毫秒执行一次。
  *  timer.schedule(task, delay,period);
  */
 private void startRun() {
  TimerTask mTimerTask = new TimerTask() {
   @Override
   public void run() {
    Message message = Message.obtain();
    message.what = 1;
    timeHandler.sendMessage(message);
   }
  };
  mTimer.schedule(mTimerTask,0,1000);
 }
 
 /**
  * 倒计时计算
  */
 private void computeTime() {
  mSecond--;
  if (mSecond <0) {
   mMin--;
   mSecOnd= 59;
   if (mMin <0) {
    mMin = 59;
    mHour--;
    if (mHour <0) {
     // 倒计时结束
     mHour = 23;
     mDay--;
     if(mDay <0){
      // 倒计时结束
      mDay = 0;
      mHour= 0;
      mMin = 0;
      mSecOnd= 0;
     }
    }
   }
  }
 }
}

附带xml的代码

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
 
 
  
 
  
 
  
 
  
 
 
 
 
  
 
  
 
  
 
  
 
  
 
 

完美实现,直接用就可以了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 本视频教程将带你快速了解 Android 开发的基础知识,并详细讲解如何在 Android 应用中使用 SQLite 数据库进行数据存储和管理。 ... [详细]
  • 本文详细介绍了如何在 Android 应用中获取系统的版本号,包括具体的应用场景和实现步骤。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • Linux系统中默认安装目录有哪些?Tomcat在Linux下的默认安装路径是什么?
    在Linux系统中,默认安装目录通常包括 `/usr`, `/opt`, 和 `/var` 等。对于Tomcat而言,在Linux下的默认安装路径通常是 `/opt/tomcat` 或者 `/usr/local/tomcat`。具体路径可能会因不同的发行版和配置而有所差异。例如,在Ubuntu Server中,Tomcat的默认安装路径通常是 `/opt/tomcat`。这些目录的选择旨在确保系统的整洁性和可维护性。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • Parallels Desktop 10 是一款功能强大的虚拟化软件,专为 Mac 用户设计,使其能够无缝运行 Windows 应用程序。该软件不仅显著提升了图形应用的性能,还优化了演示效果。对于需要在 Mac 上高效运行 Windows 程序的用户来说,Parallels Desktop 10 是一个理想的选择。本文将介绍如何获取其激活码及免费下载渠道,帮助用户轻松激活并使用这一强大工具。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
author-avatar
哭着说再见0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有