Как сделать анимацию индикатора выполнения более плавной? - PullRequest
0 голосов
/ 23 сентября 2019

Мой индикатор выполнения реализован для того, чтобы при нажатии кнопки индикатор выполнения увеличивался.Когда кнопка отпущена, индикатор выполнения сбрасывается.Индикатор выполнения сейчас выглядит очень глючно.Я думаю, это потому, что его вызывают каждую секунду, и поэтому он прыгает вот так.

        btn.setOnTouchListener{ view, motionEvent ->
            Toast.makeText(context, "Long click detected", Toast.LENGTH_SHORT).show()
            progressBar.visibility = View.VISIBLE
            var i = 0
            progressBar.progress = i
          val countdownTimer = object: CountDownTimer(5000L, 500L){

               override fun onTick(p0: Long) {
                   Log.d(TAG,"button up")
                   Log.d(TAG, "seconds: $p0")
                   if(motionEvent.action == MotionEvent.ACTION_UP){
                       i = 0
                       this.cancel()
                   }else{
                       i++
                       progressBar.progress = i*100/(5000/1000)
                   }
               }

               override fun onFinish() {
                   Log.d(TAG, "timer finished")
               }
           }.start()
            true
        }

enter image description here

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Я рекомендую использовать встроенные утилиты анимации для этого.Они позволят вам указать, какую общую продолжительность вы хотите, и позаботятся о том, чтобы рассчитать правильные «тиковые» времена и ставки.Вы получите плавные обновления без необходимости выполнять много ручной работы.

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()
    }
})
0 голосов
/ 24 сентября 2019

Решение состоит в том, чтобы просто уменьшить временной интервал для CountDownTimer, чтобы индикатор выполнения обновлялся чаще и сглаживался.

btn.setOnTouchListener{ view, motionEvent ->
            progressBar.visibility = View.VISIBLE
            progressBar.progress = 0
            if(!isTimerRunning) {
                object : CountDownTimer(5000L, 50L) {

                    override fun onTick(p0: Long) {
                        if (motionEvent.action == MotionEvent.ACTION_UP) {
                            this.cancel()
                        } else {
                            val progress = 100 - ((p0.toFloat() / 5000f) * 100f).toInt()
                            progressBar.progress = progress
                        }
                    }

                    override fun onFinish() {
                        progressBar.progress = 100
                        Log.d(TAG, "timer finished")
                    }
                }.start()
            }
            true
        }
...