如何在动画过程中停止事件?

How to Stop Event's While Animation is in process?

我正在为视图的平移和缩放设置动画。

问题:

如果我的动画持续时间为 2000 毫秒(2 秒),我不希望任何用户事件干扰动画之间。

示例,如果双击视图触发器的缩放动画和滚动触发器的翻译 Animation.Both 动画持续时间为 2 秒,但如果我双击并一个接一个地滚动,它会产生奇怪的结果。

所以我想在动画进行时停止事件。

有没有简单的解决方案,无需维护 OnGoing 动画的状态并覆盖 onTouchEvent 来禁用事件?

从事件中锁定 UI:

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

解锁UI:

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

我使用的解决方案:

  • 创建了一个 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
      }