Как остановить событие во время анимации?

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

Проблема:

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

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

Поэтому я хочу остановить событие, когда идет анимация.

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


person Anmol    schedule 19.12.2018    source источник
comment
просто отключите все, когда вы анимируете, и включите их снова, когда ваша анимация закончится   -  person Vivek Mishra    schedule 19.12.2018
comment
@VivekMishra, вы имеете в виду отключение событий представления в зависимости от состояния анимации? Это единственный подход?   -  person Anmol    schedule 19.12.2018


Ответы (2)


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

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);
}
person Liar    schedule 19.12.2018
comment
Я пытаюсь найти решение внутри представления и на самом деле не предпочитаю переходить к действию/фрагменту для каждой анимации. Хотите обработать этот случай внутри самого представления. Поскольку я работаю в архитектуре с одним действием, эта логика усложнит поток. @Лжец - person Anmol; 19.12.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
      }
    
person Anmol    schedule 21.12.2018