1

我是倒数计时器的新手,所以我不知道这个问题。我尝试了很多东西,但没有得到我所期望的。这是我的计时器代码。像往常一样,它是一个类中的一个类。

// TIMER
    public class Timer extends CountDownTimer {

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

        @Override
        public void onFinish() {

            //getNgo(true, score, tries, secLeft);
        }

        @Override
        public void onTick(long millisUntilFinished) {

            //secLeft = millisUntilFinished;

            int sec = (int) (millisUntilFinished / 1000);
            sec = sec % 60;
            int min = sec / 60;
            tvTime.setTextColor(Color.WHITE);

            if (sec <= 10) {

                animScale(tvTime);

                tvTime.setTextColor(Color.RED);
                tvTime.setText("" + min + ":" + sec);

                if (sec < 10) {
                    tvTime.setTextColor(Color.RED);
                    tvTime.setText("" + min + ":0" + sec);
                }

            } else {
                tvTime.setText("" + min + ":" + sec);
            }
        }

    }

所以,我只是想知道当我按下按钮时如何减去 3 秒(即 3000 毫秒),并且 textview 显示的计时器将继续滴答作响,但时间已经被扣除了。我把代码放在哪里。谢谢!

4

3 回答 3

0

当我不得不对计划在固定时间进行的任务执行此操作时,我已经:

  1. 取消了原来的任务。
  2. 用新的时间段提交了一个新的。

我怀疑这是一个比你使用的更标准的模式Timer

例如:

private final Runnable task = new Runnable() { @Override public void run() { /* ... */ } };

private final ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor();

private final long initialSeconds = 3;

public void submitTask() {
    stpe.schedule(task, initialSeconds, TimeUnit.Seconds());
}

public void subtractSeconds(long sec) {
    if(stpe.remove(task)) {
        stpe.schedule(task, Math.Max(initialSeconds - sec, 0), TimeUnit.Seconds);
    }
}

你需要弄清楚:

  • 如何确保任务仅最初提交一次并跟踪固定变量
  • 您是否需要一项固定final任务或更改该任务
  • 如果任务可以多次提交,并发/多线程问题
于 2013-02-24T16:55:52.090 回答
0

我已经使用其中一个 stackoverflow 帖子实现了一个简单的倒计时

// gets current time  
long timeNow = System.currentTimeMillis();  
/* timer holds the values of the current second the timer should display  
 * requiredTime is the start value that the countdown should start from  
 * startTime is the time when the application starts  
*/  
timer = requiredTime - (timeNow - startTime) / 1000;  
if (timer >= 0)   
    timer.setText(String.valueOf(timer));

要减去计时器,减去 requiredTime 即可。因为你改变了参考值。

// Override onClickListener and add the line
// to deduct 3 seconds
requiredTime -= 3; 
于 2015-12-17T11:35:51.303 回答
-1

你不能。你必须自己写CountDownTimer。复制原始代码并添加方法

public synchronized void addTime(long millis) {
    mStopTimeInFuture += millis;
}

然后设置onClickListener为按钮

bt.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        timer.addTime(-2000);       
    }
});

是完整的示例代码

于 2013-02-24T16:53:29.367 回答