Я рекомендую использовать встроенные утилиты анимации для этого.Они позволят вам указать, какую общую продолжительность вы хотите, и позаботятся о том, чтобы рассчитать правильные «тиковые» времена и ставки.Вы получите плавные обновления без необходимости выполнять много ручной работы.
val animator = ObjectAnimator.ofInt(progressBar, "progress", 0, 100)
animator.interpolator = LinearInterpolator()
animator.duration = 5_000 // milliseconds
btn.setOnTouchListener { _, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
animator.start()
true
}
MotionEvent.ACTION_UP -> {
animator.cancel()
progressBar.progress = 0
true
}
else -> false
}
}
Эта структура также позволит вам выполнить код после завершения процесса (или других событий, как при запуске анимации):
animator.addListener(object: AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
Toast.makeText(context, "done", Toast.LENGTH_SHORT).show()
}
})