Android实现倒计时效果

作者:nixs_0702 时间:2021-10-13 03:25:29 

本文实例为大家分享了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的代码


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/countdown_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@android:color/white"
   android:gravity="center" >

<RelativeLayout
 android:id="@+id/daojishi_rl"
 android:layout_width="match_parent"
 android:layout_height="40.0dip"
 android:layout_marginLeft="10.0dip"
 android:layout_marginRight="10.0dip"
 android:gravity="center" >

<ImageView
  android:id="@+id/describe_iv"
  android:layout_width="40dp"
  android:layout_height="40dp"
  android:src="@mipmap/img"
  android:scaleType="fitXY"
  android:gravity="center_vertical" />

<TextView
  android:id="@+id/describe_tv"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerVertical="true"
  android:layout_marginRight="5.0dip"
  android:layout_toRightOf="@+id/describe_iv"
  android:text="距离开团还有"
  android:textSize="25sp" />

<TextView
  android:id="@+id/days_tv"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerVertical="true"
  android:padding="4dp"
  android:layout_toRightOf="@+id/describe_tv"
  android:background="#c2c2c2"
  android:gravity="center"
  android:text=""
  android:textSize="20sp" />

<TextView
  android:id="@+id/colon0"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerVertical="true"
  android:layout_marginLeft="5.0dip"
  android:layout_marginRight="3.0dip"
  android:layout_toRightOf="@+id/days_tv"
  android:text="天"
  android:textSize="20sp"
  android:textStyle="bold" />
</RelativeLayout>

<RelativeLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_below="@+id/daojishi_rl"
 android:gravity="center_horizontal" >

<TextView
  android:id="@+id/hours_tv"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerVertical="true"
  android:layout_toLeftOf="@+id/colon1"
  android:background="#c2c2c2"
  android:gravity="center"
  android:text="23"
  android:padding="3dp"
  android:textSize="20sp" />

<TextView
  android:id="@+id/colon1"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerVertical="true"
  android:layout_marginLeft="3.0dip"
  android:layout_marginRight="3.0dip"
  android:layout_toLeftOf="@+id/minutes_tv"
  android:text=":"
  android:textSize="20sp"
  android:textStyle="bold" />

<TextView
  android:id="@+id/minutes_tv"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerVertical="true"
  android:layout_toLeftOf="@+id/colon2"
  android:background="#c2c2c2"
  android:gravity="center"
  android:text="59"
  android:padding="3dp"
  android:textSize="20sp" />

<TextView
  android:id="@+id/colon2"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerVertical="true"
  android:layout_marginLeft="3.0dip"
  android:layout_marginRight="3.0dip"
  android:layout_toLeftOf="@+id/seconds_tv"
  android:text=":"
  android:textSize="20sp"
  android:textStyle="bold" />

<TextView
  android:id="@+id/seconds_tv"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentRight="true"
  android:layout_centerVertical="true"
  android:background="#c2c2c2"
  android:gravity="center"
  android:text="59"
  android:padding="3dp"
  android:textSize="20sp" />
</RelativeLayout>

</RelativeLayout>

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

来源:https://blog.csdn.net/wvqusrtg/article/details/109032130

标签:Android,倒计时
0
投稿

猜你喜欢

  • C#时间格式转换为时间戳的方法步骤

    2022-04-13 12:27:19
  • [Alibaba-ARouter]浅谈简单好用的Android页面路由框架

    2023-06-28 06:37:22
  • 50 道Java 线程面试题(经典)

    2023-11-23 19:47:37
  • spring mvc4的日期/数字格式化、枚举转换示例

    2021-11-07 09:49:11
  • C语言 奇偶排序算法详解及实例代码

    2023-04-17 04:47:39
  • java定义数组的三种类型总结

    2022-06-27 01:44:44
  • java编码IDEA主题推荐

    2021-10-21 03:54:18
  • Java中实现在一个方法中调用另一个方法

    2022-05-15 10:02:11
  • SpringBoot Security前后端分离登录验证的实现

    2023-03-09 10:30:07
  • Android 去掉状态栏的方法汇总

    2022-05-25 01:31:18
  • C#中英文混合字符串截取函数

    2023-01-19 06:02:55
  • java设计模式之工厂方法详解

    2023-09-09 01:18:56
  • Android中ListView如何分页加载数据

    2023-09-08 18:44:35
  • java unicode转码为中文实例

    2021-08-14 04:44:14
  • Java线程池大小的设置方法实例

    2022-10-04 04:20:19
  • Android处理图像数据转换的各种方法

    2023-07-10 10:58:50
  • java中日期格式化的大坑

    2021-07-02 09:42:59
  • C++深入细致探究二叉搜索树

    2021-12-31 00:09:24
  • Java两个乒乓球队比赛名单问题(判断素数)

    2022-11-15 08:39:20
  • 使用java实现各种数据统计图(柱形图,饼图,折线图)

    2022-03-09 22:12:50
  • asp之家 软件编程 m.aspxhome.com