实现覆盖活动的倒数计时器

时间:2015-12-01 13:37:27

标签: android android-asynctask android-animation countdowntimer background-task

我有一项活动正在评估与参考曲目实时演唱的人。我想要的是当用户点击练习按钮时,屏幕上会倒计时5秒钟,屏幕上的所有组件都会停用。我还想在屏幕上显示倒计时。我的想法是在Activity视图顶部显示透明的灰色叠加层,并显示倒计时。 我正在考虑在Android-SDK中使用AsyncTaskCountDownTimer来实现逻辑。什么是实现可视化的最佳方法?

2 个答案:

答案 0 :(得分:1)

我终于能够在不使用CountDownTimer的情况下实现这一目标。为此,我创建了一个扩展AsyncTask的类,如下所示:

    public class CountdownTask extends AsyncTask<Integer, Integer, Integer> {

    private ICountdownView mCountdownView;

    private static final String TAG = "CountdownTask";

    public CountdownTask(ICountdownView countdownView) {
        this.mCountdownView = countdownView;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Code to set up the timer ...
        mCountdownView.initCountdownView();

    }

    @Override
    protected Integer doInBackground(Integer... params) {
        // setting the default number of steps ..
        int countdownSteps = 5;
        // reading the number of steps if mentioned in the parameters
        if (params.length >= 1 && params[0] != null) {
            countdownSteps = params[0];
        }

        // setting the default step duration in milliseconds ..
        int stepDur = 1000;
        // reading the step duration if mentioned in the parameters
        if (params.length >= 2 && params[1] != null) {
            stepDur = params[1];
        }

        for (int i = 0; i < countdownSteps; i++) {
            publishProgress(countdownSteps - i);
            sleep(stepDur);
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        mCountdownView.updateCountdownView(values[0]);
    }

    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        mCountdownView.destroyCountDownView();
    }

    private void sleep(int mDelay) {
        try {
            Thread.sleep(mDelay);
        } catch (InterruptedException e) {
            Log.e(TAG, e.toString());
        }
    }
}

为了更新到UI,我创建了一个接口ICountdownView。无论哪个活动需要倒计时,都需要实现此界面,然后使用CountdownTask初始化new CountdownTask(this),其中this指的是活动类的引用。接口ICountdownView如下:

    public interface ICountdownView {

    void initCountdownView();

    void updateCountdownView(int timeLeft);

    void destroyCountDownView();
}

在您的活动中,您可以通过任何想要的动画实现所有这些方法。就我而言,在initCountdownView()上,我初始化了一个透明背景而没有标题的对话框。在每个updateCountdownView(int timeLeft)上,我会在对话框中显示剩余时间并为其设置动画。在destroyCountDownView()上,我dismiss()对话框,继续我接下来需要做的任何事情。希望这有帮助!

PS:您可以使用步数和每个步骤的持续时间(以毫秒为单位)启动CountdownTask,如:

mCountdownTask.execute(5, 1000);

以上语句使倒计时以5个步骤执行,每个步骤的长度为1000毫秒(1秒)。如果用户没有提供任何参数,这也是CountdownTask的默认行为。

答案 1 :(得分:0)

转到CountDownTimer,因为它提供了开箱即用的功能:

new CountDownTimer ( 5000, 1000 ) {
  @Override 
  public void onTick( long millisUntilFinished ) {
    countDownView.setText( (int)( millisUntilFinished / 1000 ) + "sec left" );
  }

  @Override 
  public void onFinish() {
    overlay.setVisibility( GONE );
  }
}.start()