我具有扩展功能,可以使任何视图在单击时进行“缩放动画”,但是此功能不会检查视图是否处于动画状态。因此,当用户单击多次(并且视图尚未完成动画)时,视图会缩放并增加视图的原始大小...
我需要防止这种情况。也许仅在视图未设置动画时检查视图是否在设置动画和动画
fun View.setOnClickWithScaleAnimListener(block: View.() -> Unit) {
this.setOnClickListener { v ->
v.animate()
.scaleXBy(0.1f)
.scaleYBy(0.1f)
.setDuration(80)
.withEndAction {
v.animate()
.scaleXBy(-0.1f)
.scaleYBy(-0.1f)
.duration = 80
}
block(this)
}
}
答案 0 :(得分:1)
您可以取消当前动画。如果没有动画正在播放,则为空操作
void mx_deref_pointer(char ******str) {
str [0] [0] [0] [0] [0] [0] = "Follow the white rabbit!";
}
编辑:您可以在动画期间禁用视图,这样可以解决您的问题吗?
fun View.setOnClickWithScaleAnimListener(block: View.() -> Unit) {
this.setOnClickListener { v ->
v.animate().cancel()
v.animate()
.scaleXBy(0.1f)
.scaleYBy(0.1f)
.setDuration(80)
.withEndAction {
v.animate()
.scaleXBy(-0.1f)
.scaleYBy(-0.1f)
.duration = 80
}
block(this)
}
}
答案 1 :(得分:1)
单击视图时,在动画开始之前禁用其“可单击性”。在所有动画的末尾,恢复单击视图的功能。从本质上讲,这可以在动画过程中禁用侦听器,而不必删除它。
fun View.setOnClickWithScaleAnimListener(block: View.() -> Unit) {
this.setOnClickListener { v ->
v.animate()
.scaleXBy(0.1f)
.scaleYBy(0.1f)
.setDuration(80)
.withStartAction { v.isClickable = false }
.withEndAction {
v.animate()
.scaleXBy(-0.1f)
.scaleYBy(-0.1f)
.setDuration(80)
.withEndAction { v.isClickable = true }
}
block(this)
}
}
答案 2 :(得分:0)
感谢@Cheticamp给我一个主意。
仅设置isClickable
是不够的,因为如果用户快速单击多次,则视图会继续增加。
我解决了将scaleXBy
替换为scaleX/scaleY
,scaleX/scaleY
将X/Y
设置为X/Y
的值,并且scaleXBy/scaleYBy
将X/Y
增加了{一个特定的值。
fun View.setOnClickWithScaleAnimListener(block: View.() -> Unit) {
this.setOnClickListener { v ->
v.animate()
.scaleX(1.1f)
.scaleY(1.1f)
.setDuration(80)
.withEndAction {
v.animate()
.scaleX(1f)
.scaleY(1f)
.duration = 80
isClickable = true
}
.withStartAction {
isClickable = false
}
block(this)
}
}
不需要设置isClickable
,但是如果要防止用户“取消”缩放动画,则需要设置isClickable