【问题标题】:How to Stop Event's While Animation is in process?如何在动画正在进行时停止事件?
【发布时间】:2018-12-19 06:42:33
【问题描述】:

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

问题:

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

例如,如果双击视图触发器的缩放动画和滚动触发器的平移动画。两个动画持续时间都是 2 秒,但是如果我一个接一个地双击并滚动它会产生奇怪的结果。

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

是否有任何简单的解决方案,无需维护 OnGoing 动画的状态并覆盖 onTouchEvent 以禁用事件?

【问题讨论】:

  • 在制作动画时禁用所有功能,在动画结束时再次启用它们
  • @VivekMishra 你的意思是根据动画状态禁用视图的事件?这是唯一的方法吗?

标签: android android-animation android-event


【解决方案1】:

从事件中锁定 UI:

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);
}

【讨论】:

  • 我正在尝试从视图内部找出解决方案,并且真的不喜欢为每个动画转到活动/片段。想要在视图本身内部处理这种情况。正如我在单一活动架构中一样,这个逻辑会使流程复杂化。 @骗子
【解决方案2】:

我使用的解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    相关资源
    最近更新 更多