Как сделать непрерывный цикл с помощью метода animate?

Как сделать непрерывный цикл анимации, используя animate? В этом примере все, что я хочу сделать, это бесконечно вращать белый квадрат.

myBall = new Layer
    x: 100
    y: 100
    width: 200
    height: 200
    borderRadius: "20px"
    backgroundColor: "#FFF"

myBall.animate
    properties:
        rotationZ: 360
    time: 1
myBall.on Events.AnimationEnd, ->
    this.animate
        properties:
            rotationZ: 360
        time: 1
    this.backgroundColor = "#666"

После первого вращения на 360˚ цвет фона изменится на #666, но анимация прекратится. Я думаю, что было бы идеально, если repeat: -1 указано непрерывно без необходимости слушать AnimationEnd,

3 ответа

Решение

После того, как первая анимация поворачивает слой на 360°, вы пытаетесь снова повернуть его на 360°, что возвращает визуальную несуществующую анимацию. решение для этого состоит в том, чтобы установить myBall.rotationZ = 0 прямо перед тем, как снова начать вращаться. в вашем коде:

myBall.on Events.AnimationEnd, ->
    this.rotationZ = 0 # reset to back to zero
    this.animate
        properties:
            rotationZ: 360
        time: 1

Другое решение с использованием new Animation

Вы можете сделать это с помощью состояний или функции анимации, что приведет к более чистому коду:

rotateAnim = new Animation
    layer: myBall
    properties:
        rotationZ: 360
    time: 1

rotateAnim.start() # kick if off once

rotateAnim.on "end", ->
    myBall.rotationZ = 0 # need to reset to zero so we can animate to 360 again
    rotateAnim.start()

Как предложил Фришмилх, вы также можете использовать new Animation метод, но его код был немного не в порядке:

# Create animation
animation = new Animation({
    layer: myBall
    properties:
        rotationZ: 360
    time: 1
})
# Start animation
animation.start()
# Loop animation
animation.on Events.AnimationEnd, ->
    # Reset rotation before looping
    myBall.rotationZ = 0
    animation.start()

использование reverse() создать обратную анимацию и вызвать ее.

animation = new Animation 
    layer: bookmark
    properties:
        scale: 1.08
    time: 1
    curve: Bezier.easeInOut

animation.start()

animation.onAnimationEnd ->
    reversedAnimation = animation.reverse()
    reversedAnimation.start()
    reversedAnimation.onAnimationEnd ->
        animation.start()

И вот оно в действии.

Другие вопросы по тегам