gpt4 book ai didi

wpf - 为什么这个旋转动画变得断断续续?

转载 作者:行者123 更新时间:2023-12-02 04:16:27 27 4
gpt4 key购买 nike

我有一个 WPF 应用程序,其中图像不断旋转,并且偶尔会有某种动画。当应用程序运行时,旋转会保持平稳运行,除了两个关键帧保持相同值的时候。出于演示目的,我将其精简为最基本的内容:

<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
x:Name="RootElement">
<Window.Resources>

<Storyboard x:Key="Storyboard1">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="image">
<SplineDoubleKeyFrame KeyTime="0" Value="0"/>
<SplineDoubleKeyFrame KeyTime="0:0:1" Value="1"/>
<SplineDoubleKeyFrame KeyTime="0:0:3" Value="1"/>
<SplineDoubleKeyFrame KeyTime="0:0:4" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>

</Window.Resources>
<Window.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard Storyboard="{StaticResource Storyboard1}"/>
</EventTrigger>
</Window.Triggers>
<Grid>
<Image x:Name="image" Source="image.jpg" RenderTransformOrigin="0.5,0.5" >
<Image.RenderTransform>
<RotateTransform Angle="{Binding Angle, ElementName=RootElement}" />
</Image.RenderTransform>
</Image>
</Grid>

该窗口包含一个图像元素,该元素具有 RotateTransform 作为其渲染变换,旋转角度绑定(bind)到窗口代码隐藏中的属性。

还有一个动画,可以在第一秒内将图像的不透明度从 0 渐变到 1,然后在接下来的两秒内将其保持为 1,最后一秒将其从 1 渐变到 0。

隐藏代码如下所示:

public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();

timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1.0 / 30.0);
timer.Tick += timer_Tick;
timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
Angle += 360.0 * timer.Interval.TotalSeconds;
}

private DispatcherTimer timer;
private double angle;

public double Angle
{
get { return angle; }
set
{
angle = value;

if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Angle"));
}
}
}


public event PropertyChangedEventHandler PropertyChanged;
}

有一个 double 类型的属性 Angle,其中包含 RotateTransform 的角度值。它使用 INotifyPropertyChanged 的​​事件处理程序来通知绑定(bind)项的更改。还有一个每秒触发 30 次的 DispatcherTimer,并且在每次滴答时都会稍微增加 Angle 属性,以便它保持旋转。

如果运行该应用程序,您会发现图像以 30fps 每秒 1 次旋转的速度旋转。它在第一秒内平稳地旋转和淡入,但在不透明度保持为 1 的两秒内,旋转变得非常不稳定。然后,当不透明度开始回退到 0 时,旋转再次变得平滑。

奇怪的是,如果你确保不透明度不保持在 1,这个问题就可以解决:如果你在这两秒内稍微增加它:

<SplineDoubleKeyFrame KeyTime="0:0:3" Value="1.001"/>

...旋转保持平稳。

这是怎么回事?

最佳答案

DispatcherTimer 的默认优先级是Background。此优先级描述如下:在所有其他非空闲操作完成后处理操作。

由于不透明度没有改变,DoubleAnimationUsingKeyFrames 可能会优化重绘调用,并且无论出于何种原因,这似乎都会影响调度程序队列。

使用 new DispatcherTimer(DispatcherPriority.Normal) 更改调度程序计时器优先级,或实例化另一个 DoubleAnimation 来为角度设置动画,而不是手动设置动画。

关于wpf - 为什么这个旋转动画变得断断续续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24993551/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com