按钮倒计时 - Android

时间:2012-02-12 02:30:51

标签: java android animation button countdown

我想实现一个按下时倒计时的按钮。想法是允许用户取消激活按钮。一旦按下,我希望按钮变为红色并读取“CANCEL(3)”并倒计时到“CANCEL(0)”,如果再次按下,倒计时将停止,不会发生任何事情。如果未取消,应用程序将在时间到期后转到下一个屏幕。有没有办法每秒更新按钮的文本(倒计时)并更改其功能?

由于

1 个答案:

答案 0 :(得分:4)

您可以在处理程序上使用postDelayed稍后在UI线程上调用您的方法,以便您可以更新UI。

实际上有一篇关于如何在Android上完成此操作的非常好的文章:http://developer.android.com/resources/articles/timed-ui-updates.html

您可以通过在UI线程上运行的代码中创建一个处理程序,或者通过在视图上调用getHandler()(例如您的按钮本身)来获取处理程序。

我提供了一个例子,但链接的文章已经非常详细和清晰,所以我会遵从它。

编辑:这里概述了它的外观。我目前没有安装Android SDK,因此我无法验证这是否有效。

public class CountdownButton extends Button {
  private boolean isCounting = false;
  private int count;

  private final Runnable countdownRunnable = new Runnable() {
    @Override
    public void run() {
      setText(Integer.toString(count));
      if (count > 0) {
        count--;
        getHandler().postDelayed(countdownRunnable, 1000);
      } else {
        // count reached zero
        isCounting = false;
        setText("boom");
      }
    }
  }

  private final View.OnClickListener onClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      if (isCounting) {
        // stop counting
        isCounting = false;
        getHandler().removeCallbacks(countdownRunnable);
        setText("cancelled");
      } else {
        // start counting
        isCounting = true;
        count = 10;
        countdownRunnable.run();
      }
    }
  }

  public CountdownButton(Context context) {
    super(context);
    setOnClickListener(onClickListener);
  }

  public CountdownButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    setOnClickListener(onClickListener);
  }

  public CountdownButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    setOnClickListener(onClickListener);
  }
}

时机可能并不完美(特别是如果还有很多其他CPU工作正在进行中),但它应该足以满足您的需要。