我想學習一些WPF,希望能夠實現一個簡單的遊戲。在這個遊戲中,有一些項目在Canvas
。對於這個問題的目的,讓我們說這裏只有一個,這是一個Ellipse
:如何在WPF中拖動對象時獲得平滑的動畫效果
<Canvas Name="canvas">
<Ellipse Name="ellipse" Width="100" Height="100" Stroke="Black" StrokeThickness="3" Fill="GreenYellow"/>
</Canvas>
用戶需要能夠左右任意拖動這些項目。
所以我採取了以下代碼,它似乎工作:
public MainWindow()
{
InitializeComponent();
Canvas.SetLeft(ellipse, 0);
Canvas.SetTop(ellipse, 0);
ellipse.MouseDown += new MouseButtonEventHandler(ellipse_MouseDown);
ellipse.MouseMove += new MouseEventHandler(ellipse_MouseMove);
ellipse.MouseUp += new MouseButtonEventHandler(ellipse_MouseUp);
}
void ellipse_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed)
return;
ellipse.CaptureMouse();
ellipse.RenderTransform = new ScaleTransform(1.25, 1.25, ellipse.Width/2, ellipse.Height/2);
ellipse.Opacity = 0.75;
}
void ellipse_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton != MouseButtonState.Pressed || !ellipse.IsMouseCaptured)
return;
var pos = e.GetPosition(canvas);
Canvas.SetLeft(ellipse, pos.X - ellipse.Width * 0.5);
Canvas.SetTop(ellipse, pos.Y - ellipse.Height * 0.5);
}
void ellipse_MouseUp(object sender, MouseButtonEventArgs e)
{
if (!ellipse.IsMouseCaptured)
return;
ellipse.ReleaseMouseCapture();
ellipse.RenderTransform = null;
ellipse.Opacity = 1;
}
現在,如果你試試這個,你會看到運動是非常參差不齊。當你向下滑動時,橢圓會立即增長並立即改變其透明度。我想平滑這一點,所以有沒有突然跳躍。
我已經嘗試使用明顯的事情一DoubleAnimation
上Ellipse.OpacityProperty
,ScaleTransform.ScaleXProperty
和(特別是)Canvas.LeftProperty/TopProperty
。但是,我遇到了以下問題:
只要我一開始就
Canvas.LeftProperty/TopProperty
動畫,我永遠不能再次使用Canvas.SetLeft/Top
,所以它被拖到當橢圓不動。我找不到從對象中移除動畫的方法。如果用戶在動畫仍在發生的情況下釋放鼠標,
ScaleTransform
上的「縮小」動畫從「成長」動畫到達之前的全尺寸開始,這會導致突然跳躍。如果你瘋狂地點擊鼠標,對象的大小會瘋狂跳躍,而不應該跳躍。
如果需要,您可以look at my failed code, which doesn’t work。
如何在WPF中正確實現這些平滑運動?
請不要發佈一個答案,而不要先嚐試它。如果有突然的跳躍,結果是不令人滿意的。謝謝!
所以......我應該先嚐試過了? – 2011-02-06 15:39:03
爲什麼downvoting它?它幾乎是他想要的東西:p – Machinarius 2011-02-06 16:03:39
我不明白爲什麼這個答案被低估了,我已經使用了該代碼項目文章中顯示的方法,它似乎完全按照這個問題的要求進行。 – mattythomas2000 2011-02-06 16:43:50