有没有办法在CountDownTimer中增加3秒



当用户得到3个正确答案(非连续答案(并且计时器正在运行时,是否有方法将3秒添加到CountDownTimer?例如,如果用户在计时器显示10时得到3个正确答案,则计时器应增加到13秒。这是我实现的代码,但它不起作用。

class GamePage : AppCompatActivity() {
var correctCount = 0
var wrongCount = 0
val timer: TextView = findViewById(R.id.timer)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_game_page)
val finish = Intent(this, GameOver::class.java)
var timeCount : Long = 50000
fun counter(timeCount: Long){
var countdownTimer = object : CountDownTimer(50000, 1000) {
override fun onTick(millisUntilFinished: Long) {
timer.text = "Seconds remaining: " + millisUntilFinished / 1000
}
@Override
override fun onFinish() {
if (correctCount !=0 && correctCount % 5 == 0) {
finish.putExtra("correct", correctCount.toString())
finish.putExtra("wrong", wrongCount.toString())
startActivity(finish)
} else {
counter(5000);
}
}
}.start();
}
counter(timeCount)
}
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
//here you can have your logic to set text to edittext
}
public void onFinish() {
mTextField.setText("done!");
}
}.start();

为什么不使用协同程序?你可以很容易地修改计数器,计时器就会增加。

fun counter (timeCount: Long) {
var counter = timeCount
lifecycleScope.launch(Dispatchers.Main) {
while (counter > 0) {
delay(1000L)
counter -= 1000
if (isAnswerCorrect()) {
counter += 3 * 1000L     
}
}
// timer finished
}
}

您可以创建这样的倒计时流:

fun countdownFlow(duration: Duration) = flow {
val endTime = System.currentTimeMillis() + duration.inWholeMilliseconds
while(isActive) {
val timeRemaining = (endTime - System.currentTimeMillis()).coerceAtLeast(0L).milliseconds
emit(timeRemaining)
if (timeRemaining == Duration.ZERO) break
delay(1)
}
}

然后像这样使用它,如果你想增加计时器,你可以取消协同程序并重新启动它。

class GamePage : AppCompatActivity() {
var correctCount = 0
var wrongCount = 0
val timer: TextView = findViewById(R.id.timer)
private var remainingTime = Duration.ZERO
private var countdownJob: Job? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_game_page)
startCountdown(50.seconds)
}
private fun startCountdown(duration: Duration)
countdownJob?.cancel()
remainingTime = duration
countdownJob = lifecycleScope.launch {
countdownFlow(duration).collect {
remainingTime = it
timer.text = "Seconds remaining: ${it.inWholeSeconds}"
}

if (correctCount !=0 && correctCount % 5 == 0) {
val finish = Intent(GamePage.this, GameOver::class.java).apply {
putExtra("correct", correctCount.toString())
putExtra("wrong", wrongCount.toString())
}
startActivity(finish)
} else {
startCountdown(5.seconds)
}
}
}
private fun addTime(duration: Duration) {
startCountdown(remainingTime.milliseconds + duration)
}
}

最新更新