Android实现倒计时效果

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Android实现倒计时效果

nixs_0702   2020-10-15 我要评论

一个倒计时的效果

先看效果图:

直接上代码:

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

/**
  * 倒计时计算
  */
 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>

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

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们