@lovinprogram

Как убрать лаги при перемещении imageView?

Пишу Android приложение на Kotlin.
Суть приложения: imageview перемещается сверху вниз и рикошетит снизу в верх (координата x статична). Эта imageview как бесконечный попрыгунчик. **НО:**
При нажатии на imageview (которая сама движется от верхней стенке к нижней и наоборот) скорость передвижения должна увеличиваться (чем больше скорость передвижения, тем сложнее попасть. В этом и смысл игры).
Я реализовал через такую "физику":
// btnBall - imageview, по нажатию которой увеличивается скорость передвижения
        val btnBall = findViewById<ImageButton>(R.id.btnBall)
        var speed_of_ball = 500F

        btnBall.setOnClickListener(object : View.OnClickListener {
            override fun onClick(view: View?) {
                speed_of_ball += 10
            }
        })


        // кнопка старт игры
        ButtonStartGame.setOnClickListener {

            val display = windowManager.defaultDisplay
            val size = Point()
            display.getSize(size)
            val height: Int = size.y
            
            var dt = 0.01
            var yVel = speed_of_ball
            var y = 1.0
            var yPos = 0F
            var flag_go_up = false
            btnBall.y = yPos
            GlobalScope.launch(context = Dispatchers.Main) {
                while (true) { // бесконечный цикл передвижения в корутине
                    if (!flag_go_up) {
                        yPos += (dt * yVel).toFloat()
                        yVel += (dt * y).toFloat()
                        y += 0.01
                        btnBall.y = yPos
                        delay(5)
                        // проверка, что imageview не вышла за нижние границы экрана
                        if (yPos >= (height - btnBall.height)) {
                            flag_go_up = true
                            y = 1.0
                            yVel = speed_of_ball
                        }
                    } else { // иначе imageview перемещается снизу вверх
                        yPos -= (dt * yVel).toFloat()
                        yVel += (dt * y).toFloat()
                        y += 0.01
                        btnBall.y = yPos
                        delay(5)
                        if (yPos <= 0) {
                            flag_go_up = false
                            y = 1.0
                            yVel = speed_of_ball
                        }
                    }
                }
            }
        }

Код рабочий, imageview бесконечно движется от верхней стенке к нижней стенке и наоборот.
Но эта imageview иногда подлагивает, т.е. она перемещается не со стабильной скоростью (то быстро, то медленно).
Где-то прочитал, что не хватает ресурсов, поэтому android иногда замедляет скорость перемещения imageview.
Как избавиться от лагов, сохранив задуманный функционал - увеличение скорости движения при нажатии на эту imageview?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Не надо так делать. Никаких бесконечных циклов.
Посмотри апи аниматоров, и не анимируй с помощью изменения координаты. Для этого есть translationX/translationY.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы