Android - 仅顺时针旋转视图180度

时间:2018-06-18 14:23:03

标签: javascript android

我想根据布尔标志仅在180度的一个方向上旋转按钮。因此,当标志处于活动状态时,按钮的旋转应为180,否则为0.这非常有效:

button.animate().rotation(active ? 180 : 0).setDuration(250).start();

但是按钮不会始终在同一方向旋转,例如,如果目标旋转为0,他将逆时针旋转。

所以我的问题是我怎样才能实现180度旋转动画总是顺时针?

修改

因此,一个重要的注意事项是可以多次调用代码。因此,如果我使用rotateBy(来自下面的答案),如果它之前是活动的,它会旋转。对不起,我忘记提及了。因此,如果该标志处于活动状态,则必须为rotation % 180 == 0,否则为rotation % 360 == 0 or rotation == 0

2 个答案:

答案 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();