我正在为 Windows 8 实现一个模拟时钟。但是我正在努力获得完美的分针动画。
当秒针到达 12 时,分针应该“滑”6 度到下一个数字,而不是突然出现在下一个数字上。这是正在使用的代码
XAML 中的动画
<converter:ThemeTimeConverter
x:Key="minuteHandTransform"
Component="MinuteHandFromAngle" />
<converter:ThemeTimeConverter
x:Key="minuteHandToTransform"
Component="MinuteHandToAngle" />
<!-- Minute Hand -->
<Image
Source="{Binding Time, Converter={StaticResource MinHandBackground}}"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Canvas.Left="118"
Canvas.Top="118">
<Image.RenderTransform>
<TransformGroup>
<TranslateTransform
X="-11"
Y="-90" />
<RotateTransform
x:Name="minHandTransform" />
</TransformGroup>
</Image.RenderTransform>
<Image.Triggers>
<EventTrigger
RoutedEvent="Image.Loaded">
<BeginStoryboard>
<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 minuteHandToTransform}}"
RepeatBehavior="forever">
<DoubleAnimation.EasingFunction>
<SineEase
EasingMode="EaseOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Image.Triggers>
</Image>
这些是转换器用于确定动画的起点和终点
case ThemeComponents.MinuteHandFromAngle:
{
double minangle = (((float)dt.Minute) / 60) * 360;
_RotateTransform.Angle = minangle;
return _RotateTransform.Angle;
}
case ThemeComponents.MinuteHandToAngle:
{
double minangle = (((float)dt.Minute) / 60) * 360;
if (((float)dt.Second) == 59)
{
_RotateTransform.Angle = minangle + 6;
}
else
{
_RotateTransform.Angle = minangle;
}
return _RotateTransform.Angle;
}
使用此代码,分针滑动到下一个数字,然后弹回前一个数字,然后再次弹回下一个数字。我只想让它滑到下一个数字。
如果您有任何想法或建议,请告诉我。
谢谢