Android CountDownTimer示例

时间:2020-02-23 14:28:51  来源:igfitidea点击:

在此Android倒数计时器示例中,我们将实现一个计时器对象,以在ProgressBar中显示进度。
我们将在本教程中构建的应用程序是测验应用程序中的一个有用组件,其中,完成关卡所需的时间以图形方式显示,以增强用户体验。

Android CountDownTimer

Android的" CountDownTimer"类用于安排倒计时,直到用户定义的将来某个时间为止,并定期通知间隔时间。
此类是一个抽象类,其方法必须重写才能在我们的项目中实现。
需要在我们的活动中添加以下行以导入该类:

导入android.os.CountDownTimer;

CountDownTimer类的相关方法如下。

  • synchronized final void cancel():用于取消倒计时
  • abstract void onFinish():计时器结束时会触发此回调方法
  • abstract void onTick(long millisUntilFinished):定期触发此回调方法
  • synchronized final CountDownTimer start():此方法用于启动倒计时

CountDownTimer类的公共构造函数的签名如下所示。

CountDownTimer(long millisInFuture,long countDownInterval)

构造函数的参数定义如下:

  • millisInFuture:从调用start()到倒计时完成并调用onFinish()以后的毫秒数。

  • countDownInterval:接收onTick(long)回调的时间间隔

在此项目中,我们将在重复调用onTick()方法时更新ProgressBar中的时间值。

Android倒数计时器代码

activity_main.xml由两个按钮组成,即开始和停止计时器按钮以及用于显示时间的ProgressBar。

activity_main.xml

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
  xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent"
  android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

  <ProgressBar
      android:id="@+id/progressBar"
      style="?android:attr/progressBarStyleHorizontal"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:indeterminate="false"
      android:max="10"
      android:minHeight="50dp"
      android:minWidth="200dp"
      android:progress="0"
      android:layout_centerVertical="true"
      android:layout_alignParentRight="true"
      android:layout_alignParentEnd="true"
      android:layout_alignParentLeft="true"
      android:layout_alignParentStart="true" 

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Start Timer"
      android:id="@+id/button"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="61dp" 

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Stop Timer"
      android:id="@+id/button2"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="46dp"
      android:layout_below="@+id/progressBar" 

</RelativeLayout>

MainActivity.java如下所示:

package com.theitroad.countdowntimer;

import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

  ProgressBar progressBar;
  Button start_timer,stop_timer;
  MyCountDownTimer myCountDownTimer;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      progressBar=(ProgressBar)findViewById(R.id.progressBar);
      start_timer=(Button)findViewById(R.id.button);
      stop_timer=(Button)findViewById(R.id.button2);

      start_timer.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {

              myCountDownTimer = new MyCountDownTimer(10000, 1000);
              myCountDownTimer.start();

          }
      });

      stop_timer.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {

              myCountDownTimer.cancel();

          }
      });

  }

  public class MyCountDownTimer extends CountDownTimer {

      public MyCountDownTimer(long millisInFuture, long countDownInterval) {
          super(millisInFuture, countDownInterval);
      }

      @Override
      public void onTick(long millisUntilFinished) {

          int progress = (int) (millisUntilFinished/1000);

          progressBar.setProgress(progressBar.getMax()-progress);
      }

      @Override
      public void onFinish() {
          finish();
      }
  }
}

在上面的代码中,我们定义了一个名为" MyCountDownTimer"的匿名内部类。
在此示例中,我们将计时器设置为10秒,每秒钟更新一次。
默认情况下,计时器以降序显示/更新时间(称为CountDown!),因此,为了以升序显示进度,我们从最大时间中减去了时间。

一旦停止计时器将重新开始。