如何在动画过程中停止事件?
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
}
我正在为视图的平移和缩放设置动画。
问题:
如果我的动画持续时间为 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 或 ViewGroupoverride fun dispatchTouchEvent(ev: MotionEvent?): Boolean { val dispatchTouchEvent = super.dispatchTouchEvent(ev) if (isAnimationOnGoing) { return false } return dispatchTouchEvent }