在WPF中可以很方便的實現動畫的效果,而在普通的WinForm程式裡實現卻有點麻煩,這裡我用一種類比的方式來實現WinForm有關的動畫
回憶一下在WPF中動畫效果的實現,首先建立一個故事板 Storyboard,然後建立一個動畫 Animation,並把要產生動畫的屬性與Animation綁定後添加到故事板,最後執行,得到了我們想要的效果,這裡我們只考慮線性變化效果
這裡我主要是用來改變WinForm上控制項的大小位置來產生一些動畫的效果 。
一 StoryBoard 故事板
由於是要控制介面上的面板所以需要非同步來改變介面控制項的一些屬性 。而動畫效果需要一個定時器來迴圈的執行產生動畫的效果 。所以首先用Start函數來開啟一個線程,然後線上程sta()中開啟一個定時器用來執行相關的操作 這裡我設定的定時器執行一次為8毫秒.
timeInt為一個靜態變數來作為計數器判斷定時器執行了多少次當執行完成的時候歸零。_control為建構函式裡傳入的執行的面板控制項 可以是一個Form或Control。然後讓
_control.BeginInvoke(new Sta(too));
通知介面改變。代碼如下
最後一步中迴圈執行的ControlAnimation用來儲存動畫執行的相關資訊
其中包括了動畫的效果animation 要綁定的控制項 control 繫結控制項的屬性值 我們看too()函數中利用
PropertyInfo value = tp.GetProperty(a.name);
if (value != null)
{
value.SetValue(a.control, a.animation.Change(), null);
}
來實現給屬性的賦值。
最後就是實現動畫 ,主要是儲存起始值From 結束值To 所需要的事件Time這三個值,傳入這三個值後,求出需要變化的Num,實現每次變化Change()的值,
代碼如下:
這樣就簡單的完成了一個類比動畫效果的類 :看看AnimationPoint類,只是用類兩個AnimationInt類來實現的,當然也可以用三個來實現一個Color類。。。
好我們來調用一下
看看我實現了一個控制項的位置在200毫秒的時間位置向後移動了200和向移動200的位置。效果如下 :