我为自己创建了一个小型原型。它将标签从屏幕的右边缘移动到左侧。在那里,它再次从右边开始,使它看起来无限。就像新闻报道一样。
我的问题是,标签的位置非常颤抖。它看起来粗鲁而坎坷。我将标签每33毫秒移动到左边的1.0。
我的渲染器在硬件端运行(第2层)。 框架:4.5
XAML:
<Window x:Class="Canny.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="811" Name="main">
<Canvas Name="myCanvas" Background="Black">
<Label Name="lb1" Content="Lauftext+++" Foreground="WhiteSmoke" FontSize="25" Canvas.Left="618" Canvas.Top="10" FontFamily="Courier New" FontWeight="ExtraBold" FontStretch="UltraExpanded"/>
</Canvas>
XAML.CS:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;
namespace Canny
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
DispatcherTimer timer;
double newPos;
readonly double actualWidthLb;
int renderingTier;
public MainWindow()
{
InitializeComponent();
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(33.0);
timer.Tick += timer_Tick;
newPos = myCanvas.ActualWidth;
actualWidthLb = lb1.ActualWidth;
timer.Start();
renderingTier = (RenderCapability.Tier >> 16);
}
void timer_Tick(object sender, EventArgs e)
{
newPos -= 1.0;
Canvas.SetLeft(lb1,newPos);
if (Canvas.GetLeft(lb1) + actualWidthLb <= 0)
{
Canvas.SetLeft(lb1, myCanvas.ActualWidth);
newPos = myCanvas.ActualWidth;
}
}
}
}
我提前感谢您的建议!
答案 0 :(得分:0)
您是否尝试降低计时器间隔? 33ms约为30Hz。这个速度太慢了,我们的眼睛不能像流动的画面那样经历。我们的眼睛比这快!这就是为什么你开始至少50Hz(20ms)的速度,但为了真正的平滑体验,你最好从70Hz开始,类似于14ms甚至更快。 (频率:f = 1 / T)。要调整滚动速度,您可以降低步数(例如,递增位置值x = x - 0.1 - >慢或x = x - 0.01 - >比将x递增-1.0慢100倍),反之亦然。
您可以考虑将DispatcherTimer与DispatcherPriority(通过构造函数)一起使用,优先级为Render或更高......
但是如果你使用WPF,为什么不使用提供的漂亮的动画功能呢?使用Blend可以快速轻松地完成它。 MSDN - How to: Animate an Object Along a Path (Double Animation)