如何在周期性间隔动画

本文关键字:动画 周期性 | 更新日期: 2023-09-27 17:52:38

我有一个动画分针滑动6度的故事板。现在我要分针永远每59秒滑动一次。storyboard有什么属性或者其他方法吗?

我的故事板

<Storyboard
                                    x:Name="myStoryboard2">
                                    <DoubleAnimation
                                        x:Name="minuteAnimation"
                                        Storyboard.TargetName="minHandTransform"
                                        Storyboard.TargetProperty="Angle"
                                        Duration="0:0:1"
                                        From="{Binding Time, Converter={StaticResource minuteHandTransform}}"
                                        To="{Binding Time, Converter={StaticResource minuteHandTransform}}"
                                        RepeatBehavior="1x">
                                        <DoubleAnimation.EasingFunction>
                                            <SineEase
                                                EasingMode="EaseOut" />
                                        </DoubleAnimation.EasingFunction>
                                    </DoubleAnimation>
                                </Storyboard>

如何在周期性间隔动画

这听起来不像是你想要依靠动画来管理的东西。只需管理每分钟从代码开始的动画,你就完成了。这样做比使用神秘的转换器来控制From/to值要容易得多。像DoubleAnimation这样的时间轴有一个BeginTime属性,但我已经看到并验证了长动画持续时间(如1分钟或以上)在WinRT中出现bug的报告。

EDIT*(代码示例)

我通常使用两种简单的方法来触发事件在一个间隔是使用DispatcherTimer与回调事件或异步循环。

1只;DispatcherTimer

var timer = new DispatcherTimer { Interval = TimeSpane.FromSeconds(1) };
timer.Tick += (s, e) => { /* do your stuff */ };
timer.Start();

2只;异步循环

RunMyLoop();
private async void RunMyLoop()
{
    while (true)
    {
        /* do your stuff */
        await Task.Delay(1000);
    }
}

尝试如下:

<Storyboard
                                x:Name="myStoryboard2">
                                <DoubleAnimation
                                    x:Name="minuteAnimation"
                                    Storyboard.TargetName="minHandTransform"
                                    Storyboard.TargetProperty="Angle"
                                    Duration="0:0:59"
                                    From="{Binding Time, Converter={StaticResource minuteHandTransform}}"
                                    To="{Binding Time, Converter={StaticResource minuteHandTransform}}"
                                    RepeatBehavior="Forever">
                                    <DoubleAnimation.EasingFunction>
                                        <SineEase
                                            EasingMode="EaseOut" />
                                    </DoubleAnimation.EasingFunction>
                                </DoubleAnimation>
                            </Storyboard>