我想根据布尔标志仅在180度的一个方向上旋转按钮。因此,当标志处于活动状态时,按钮的旋转应为180,否则为0.这非常有效:
button.animate().rotation(active ? 180 : 0).setDuration(250).start();
但是按钮不会始终在同一方向旋转,例如,如果目标旋转为0,他将逆时针旋转。
所以我的问题是我怎样才能实现180度旋转动画总是顺时针?
修改
因此,一个重要的注意事项是可以多次调用代码。因此,如果我使用rotateBy(来自下面的答案),如果它之前是活动的,它会旋转。对不起,我忘记提及了。因此,如果该标志处于活动状态,则必须为rotation % 180 == 0
,否则为rotation % 360 == 0 or rotation == 0
答案 0 :(得分:3)
我相信它是因为当你的结束程度大于你的起始程度时,视图会顺时针转动,而当它的结束程度反转时,它会逆时针转动。您可以尝试获取当前的rotationX值并向其添加180.
修改强>
view.rate_button.animate()
.rotationBy(view.rate_button.rotationX + rotationValue)
.setDuration(250)
.withStartAction { active = true }
.withEndAction { active = false }
.start()
编辑2:
behaviorSubject.subscribe({
if (active && view.rate_button.rotationX == 0f) {
// Active state is true but the button is not rotated to 180
// degrees like we need so set the rotation value to 180 so we
// can still increment.
rotateButton(180f)
}
else if (active && view.rate_button.rotationX == 180f) {
// Active state is true and the button is rotated to 180
// degrees like we need set the rotation value to -180
// basically canceling out any rotation.
rotateButton(-180f)
}
else if (!active && view.rate_button.rotationX == 0f) {
// Active state is false and the button is rotated to 0
// degrees like we need set the rotation value to 0
// basically canceling out any rotation.
rotateButton(0f)
}
else if (!active && view.rate_button.rotationX == 180f) {
// Active state is false but the button is not rotated
// to 0 degrees like we need set the rotation value to 180
// so we can still increment.
rotateButton(180f)
}
else {}
})
private fun rotateButton(rotationValue: Float) {
button.animate()
.rotationBy(button.rotationX + rotationValue)
.setDuration(250)
.start()
}
为简单起见,我仍然使用onclick事件触发behaviorSubject.onNext
事件,但任何操作/事件都可以。
答案 1 :(得分:0)
使用rotationBy(float)方法而不是旋转(float)。
button.animate().rotationBy(active ? 180 : 0).setDuration(250).start();