Как остановить событие во время анимации? - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над анимацией своего вида, где я анимирую перевод и масштабирование вида.

Проблема:

Если продолжительность моей анимации составляет 2000 мс (2Во-вторых, я не хочу, чтобы какие-либо пользовательские события вмешивались между анимациями.

Пример, если двойное нажатие на представлении запуска вызывает анимацию масштабирования и анимацию перевода триггера прокрутки. Длительность анимации составляет 2 секунды, но если дважды нажатьи прокручивайте одну за другой, это создает странный результат.

Так что я хочу остановить события, когда анимация продолжается.

Есть ли какое-либо простое решение без сохранения состояния анимации OnGoing и переопределения onTouchEventотключить события?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Решение, которое я использовал:

  • Создано State анимации

     private var isAnimationOnGoing: Boolean = false
    
  • Настройка State в прослушивателе анимации

    translationAnimation.setAnimationListener(object : Animation.AnimationListener {
        override fun onAnimationRepeat(animation: Animation?) {
        }
    
        override fun onAnimationEnd(animation: Animation?) {
            isAnimationOnGoing = false
        }
    
        override fun onAnimationStart(animation: Animation?) {
            isAnimationOnGoing = true
        }
    })
    
  • Использовать dispatchTouchEvent(ev: MotionEvent?).для предотвращения событий, которые будут получены ViewGroup или детьми ViewGroup

    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        val dispatchTouchEvent = super.dispatchTouchEvent(ev)
        if (isAnimationOnGoing) {
            return false
        }
        return dispatchTouchEvent
      }
    
0 голосов
/ 19 декабря 2018

Блокировка интерфейса от событий:

private void lockUI() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);   
}

Разблокировка интерфейса:

private void unlockUI() {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}
...