轉(zhuǎn)帖|其它|編輯:郝浩|2010-09-16 13:55:22.000|閱讀 543 次
概述:在最近的項(xiàng)目中,有一項(xiàng)要求是在 Microsoft .NET Framework 精簡版的 Windows 窗體中顯示動(dòng)畫 GIF。.NET Framework 精簡版的 1.0 版沒有顯示動(dòng)畫 GIF 文件的功能,也不包含 .NET Framework 完整版中的 ImageAnimator 輔助類。通過 ImageAnimator 類可以為基于時(shí)間幀的圖像制作動(dòng)畫。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
簡介
在最近的項(xiàng)目中,有一項(xiàng)要求是在 Microsoft.NET Framework 精簡版的 Windows窗體中顯示動(dòng)畫 GIF。.NET Framework 精簡版的 1.0 版沒有顯示動(dòng)畫 GIF 文件的功能,也不包含 .NET Framework 完整版中的 ImageAnimator 輔助類。通過 ImageAnimator 類可以為基于時(shí)間幀的圖像制作動(dòng)畫。
盡管可以編寫 C# 代碼讀取 GIF86a 格式的動(dòng)畫 GIF,但是我在程序中選擇了一種更簡單直觀的方法來顯示動(dòng)畫。
創(chuàng)建情節(jié)
如果您在選定的 GIF 編輯器中打開一個(gè)動(dòng)畫 GIF,將會看到此文件是由相互銜接的多個(gè)圖像(幀)組成的:
圖 1:動(dòng)畫幀
這些圖像以壓縮格式存儲,并附帶有關(guān)大小、數(shù)量和幀之間的延遲時(shí)間的信息。這些信息由顯示動(dòng)畫的程序讀取。
許多 GIF 編輯器允許您將圖像幀提取到順序排列的“故事板”中:
圖 2:故事板
我將故事板保存在一個(gè)位圖文件中,后來將此文件轉(zhuǎn)換為 GIF 格式,因?yàn)榇烁袷降奈募?.NET Framework 精簡版中占用的內(nèi)存較少。現(xiàn)在我要向您演示如何使用此圖像創(chuàng)建基于 .NET Framework 精簡版的“動(dòng)畫”控件。
我們所使用的讓此位圖動(dòng)起來的方法相當(dāng)簡單。它基于這樣一個(gè)事實(shí),當(dāng)您在 .net Framework 精簡版中使用圖像時(shí),不必顯示載入內(nèi)存的整個(gè)圖像。graphics.DrawImage 方法的一個(gè)重載方法將 Rectangle 對象作為參數(shù)接受。我們就用這個(gè)矩形將故事板位圖中的每個(gè)圖像作為幀來處理。通過移動(dòng)幀矩形的位置,我們可以動(dòng)態(tài)載入要在窗體中顯示的位圖的不同部分。
我們向 .NET Framework 精簡版項(xiàng)目中添加一個(gè)新類 AnimateCtl,并從 System.Windows.Forms.Control 派生這個(gè)類:
using System; public class AnimateCtl : System.Windows.Forms.Control |
向這個(gè)類中添加一個(gè)公共的 Bitmap 屬性,用于從客戶端傳遞位圖。不要忘記為這個(gè)位圖聲明一個(gè)私有成員,以便在類中使用:
private Bitmap bitmap; public Bitmap Bitmap { get { return bitmap; } set { bitmap = value; { { |
我們創(chuàng)建的這個(gè)控件將使用在其中檢索的 Graphics 對象的 DrawImage 方法來繪制這些幀:
private void Draw(int iframe) Rectangle rect = new Rectangle(XLocation, 0, frameWidth, //繪制圖像 |
此方法接受需要繪制的當(dāng)前幀號。然后計(jì)算圖形框的左邊位置以創(chuàng)建矩形。
為了實(shí)現(xiàn)該控件的循環(huán)邏輯,我選擇使用 System.Windows.Forms.Timer。
還有不少其他選項(xiàng)可以提供同樣的功能,例如使用 System.Threading.Timer 或是創(chuàng)建一個(gè)單獨(dú)的線程也可以達(dá)到相同的目的;但是使用 System.Windows.Forms.Timer 更簡單方便。在控件的構(gòu)造函數(shù)中添加以下代碼:
public AnimateCtl() { //緩存 Graphics 對象 graphics = this.CreateGraphics(); //實(shí)例化 Timer fTimer = new System.Windows.Forms.Timer(); //與 Timer 的 Tick 事件掛鉤 fTimer.Tick += new System.EventHandler(this.timer1_Tick); } |
在構(gòu)造函數(shù)中,我們從控件的實(shí)例中緩存 Graphics 對象并創(chuàng)建一個(gè)新的 Timer 實(shí)例,然后將其與 Timer 的 Tick 事件掛鉤。現(xiàn)在已經(jīng)可以插入 StartAnimation 方法,以便實(shí)際啟動(dòng)動(dòng)畫:
public void StartAnimation(int frWidth, int DelayInterval, int LoopCount) frameWidth = frWidth; |
此方法接受一些非常重要的動(dòng)畫參數(shù):幀寬度、延遲間隔和循環(huán)次數(shù)。
另外,不要忘記循環(huán)邏輯:
private void timer1_Tick(object sender, System.EventArgs e) private void DrawFrame() |
在上面代碼的 timer1_Tick 事件中,我們檢查 loopCount 以跟蹤已繪制的循環(huán)次數(shù),并將其與調(diào)用 StartAnimation 方法時(shí)捕獲的 loopCounter 相比較。
我們已經(jīng)完成了 AnimateCtl,現(xiàn)在可以進(jìn)行測試。第一步,必須將帶有“故事板”的圖像文件添加到您的項(xiàng)目中。可以通過將此文件變?yōu)榍度氲馁Y源或僅通知 Visual Studio .net 2003 將此文件作為項(xiàng)目的一部分進(jìn)行復(fù)制來完成此任務(wù)。在 Solution Explorer(解決方案資源管理器)中的項(xiàng)目上單擊鼠標(biāo)右鍵,并在彈出式菜單中選擇 Add Existing Item...(添加現(xiàn)有項(xiàng)...)。瀏覽到圖像文件并確保此文件的 Build Action(生成操作)屬性已被設(shè)置為 Content(內(nèi)容)。
現(xiàn)在,在窗體的構(gòu)造函數(shù)中插入以下代碼:
public Form1() //實(shí)例化控件 |
在上面的代碼中,我們使用從圖像文件中創(chuàng)建的 Bitmap 對象指定動(dòng)畫控件的 Bitmap 屬性。
在設(shè)計(jì)器的窗體上放置兩個(gè)按鈕,并將以下代碼添加到它們的 Click 事件中:
private void button1_Click(object sender, System.EventArgs e)
|
運(yùn)行項(xiàng)目并點(diǎn)擊 Start Animation(啟動(dòng)動(dòng)畫)按鈕,您就可以看到動(dòng)畫了:
圖 3:最終產(chǎn)品
偽動(dòng)畫 GIF 文件包含的幀的數(shù)目和幀之間的延遲時(shí)間可能會變化。當(dāng)您為不同的動(dòng)畫調(diào)用 StartAnimation 方法時(shí),需要調(diào)整 DelayInterval 參數(shù)。
無論怎么說,此代碼都不是最終版本。AnimateCtl 不能提供動(dòng)畫 GIF 中包含的所有功能。例如,AnimateCtl 控件不能處理幀之間的不同延遲時(shí)間。例如,您可能希望第一幀顯示的時(shí)間比其他幀顯示的時(shí)間稍長一些。本文中的代碼對于您來說是一個(gè)很好的起點(diǎn),您可以根據(jù)需要擴(kuò)展此控件。
請記住,顯示高分辨率的圖形動(dòng)畫將加重系統(tǒng)資源負(fù)擔(dān)。一定要注意運(yùn)行此代碼的某些設(shè)備的內(nèi)存和資源限制。不要忘記進(jìn)行全面測試,并確保應(yīng)用程序既不會占用所有內(nèi)存,也不會占用所有處理器時(shí)間。
小結(jié)
雖然 .NET Framework 精簡版只是 .NET Framework 完整版的一個(gè)子集,但是開發(fā)人員仍然可以創(chuàng)建對最終用戶更具吸引力的用戶界面。通過使用 .NET Framework 精簡版提供的 GIF 編輯器工具和繪圖能力,開發(fā)人員可以在其智能設(shè)備項(xiàng)目中顯示動(dòng)畫。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載