c#翻页效果
用c#和GDI+實(shí)現(xiàn)雜志翻頁(yè)動(dòng)畫(huà)效果時(shí)間:2010-01-13 blog.csdn.net 周公 -
說(shuō)明:以前本人參與個(gè)一個(gè)電子雜志項(xiàng)目,當(dāng)時(shí)要求實(shí)現(xiàn)模擬現(xiàn)實(shí)生活中的雜志翻頁(yè)動(dòng)畫(huà)效果,別人推薦了這篇文章,最后達(dá)到了我想要的效果,今天嘗試把這篇文章翻譯了一下。希望對(duì)英語(yǔ)水平不太好的同行有幫助。如果你的英語(yǔ)水平足夠好,我推薦你閱讀英文原文,網(wǎng)址是:http://www.codeproject.com/KB/GDI-plus/TurnThePage.aspx,同時(shí)希望大家原諒本人的翻譯水平。
介紹圖1 翻頁(yè)效果這篇文章用來(lái)介紹如何在電子書(shū)或者電子相冊(cè)中并列顯示圖片時(shí)創(chuàng)建一種翻頁(yè)效果,這種翻頁(yè)效果模仿了現(xiàn)實(shí)中的書(shū)本翻頁(yè)情況。背景寫(xiě)作這篇文章的靈感來(lái)自于一個(gè)可重用的用于顯示圖片的組件的需求。我使用了C#和GDI+來(lái)提高我對(duì).net下圖形圖象編程的理解。
創(chuàng)建這種效果的技術(shù)背景來(lái)自于一篇文章《FalshMX中的翻頁(yè)效果》,網(wǎng)址是:http://www.oreillynet.com/pub/a/javascript/2004/09/03/flashhacks.html,作者是Sham Bhangal。Sham在文章里如何在動(dòng)畫(huà)效果中使用對(duì)稱(chēng)線來(lái)控制頁(yè)面的可見(jiàn)部分。盡管在Flash MX中和在GDI+中的處理有些不同,但是利用對(duì)稱(chēng)線來(lái)計(jì)算頁(yè)面的可見(jiàn)部分這個(gè)概念是相同的。
在這篇文章中,我們假定第3頁(yè)和第4頁(yè)是當(dāng)前頁(yè),并且下一個(gè)動(dòng)作是要翻到第5頁(yè)和第6頁(yè)。換句話說(shuō),我們要展現(xiàn)的是第4頁(yè)的翻頁(yè)效果。動(dòng)畫(huà)技巧下圖闡述了在整個(gè)動(dòng)畫(huà)中的關(guān)鍵區(qū)域和變化區(qū)域。圖2 關(guān)鍵區(qū)域和參數(shù)本文來(lái)自編程入門(mén)網(wǎng):http://www.bianceng.cn/Programming/csharp/201001/14287.htm
整個(gè)翻頁(yè)動(dòng)畫(huà)可以概括為:1、完全繪制出第3頁(yè)和第4頁(yè)。在繪制完成之后,B和C部分將會(huì)遮擋住第4頁(yè)的原來(lái)可見(jiàn)部分。2、計(jì)算出對(duì)稱(chēng)線和B和C的裁剪區(qū)域。3、繪制B部分。這是下面的一頁(yè)的部分區(qū)域(第6頁(yè))。4、根據(jù)熱點(diǎn)進(jìn)行相應(yīng)轉(zhuǎn)換,并且進(jìn)行相應(yīng)旋轉(zhuǎn)。5、繪制C部分。這是第4頁(yè)在翻頁(yè)過(guò)程中顯示的它的背面(第5頁(yè))的內(nèi)容。當(dāng)前頁(yè)《FalshMX中的翻頁(yè)效果》一文中指出當(dāng)前頁(yè)并不參與翻頁(yè)效果。這就意味著在翻頁(yè)中的每一面(第3頁(yè)和第4頁(yè))都會(huì)首先被不進(jìn)行任何裁減和轉(zhuǎn)換就繪制出來(lái)。B和C這兩個(gè)可見(jiàn)部分將會(huì)在當(dāng)前頁(yè)之上進(jìn)行繪制。熱點(diǎn)“熱點(diǎn)”這個(gè)詞是我從《FalshMX中的翻頁(yè)效果》一文中借鑒過(guò)來(lái)的。熱點(diǎn)一詞代表在翻頁(yè)時(shí)折痕在水平軸線上的位置,它標(biāo)明對(duì)稱(chēng)線的起始位置。在翻頁(yè)過(guò)程中,熱點(diǎn)一直在從頁(yè)邊緣到書(shū)中間這段距離之間移動(dòng)。從頁(yè)邊到熱點(diǎn)的這段距離(x)將隨著頁(yè)面的翻動(dòng)而變化。當(dāng)熱點(diǎn)到達(dá)書(shū)的中間位置時(shí),動(dòng)畫(huà)就停止了,這時(shí)x=PAGE_WIDTH。對(duì)稱(chēng)線對(duì)稱(chēng)線代表翻頁(yè)時(shí)頁(yè)面的折痕。它是用于計(jì)算在翻頁(yè)時(shí)參與的頁(yè)面可見(jiàn)部分。在程序中,對(duì)稱(chēng)線控制兩件事情:1、B和C部分的裁剪區(qū)域。本文來(lái)自編程入門(mén)網(wǎng):http://www.bianceng.cn/Programming/csharp/201001/14287_2.htm
2、C部分進(jìn)行轉(zhuǎn)換的坐標(biāo)原點(diǎn)。對(duì)稱(chēng)線可以用下面兩個(gè)等式來(lái)描述:a = 45 + ( (45 *x) / PAGE_WIDTH )h = x Tan ( a )注意角度a會(huì)隨著x的變化而變化。這個(gè)等式表明當(dāng)x=0時(shí)a = 45度并且當(dāng)x= PAGE_WIDTH時(shí)a = 90度。當(dāng)動(dòng)畫(huà)開(kāi)始時(shí),x=0,因此B和C部分并不可見(jiàn)。隨著x的增加,對(duì)稱(chēng)線就形成了直角三角形的斜邊。三角形由三個(gè)長(zhǎng)度確定:對(duì)稱(chēng)線、x和高度h。圖2展示了這樣一種情況。隨著x的增加,將會(huì)出現(xiàn)h>= PAGE_WIDTH的情況。當(dāng)這種情況出現(xiàn)后,對(duì)稱(chēng)線與頁(yè)面相交的區(qū)域?qū)?huì)由三角形變成梯形。梯形的高度就是PAGE_WIDTH。圖1就是這種情況。不管是梯形還是三角形,這個(gè)閉合路線都指出了B和C這兩個(gè)裁減區(qū)域。要想看到運(yùn)行中看到這種帶有邊框的效果,在提供的源代碼中將INCLUDE_DRAW_GRAPHICS_PATH這個(gè)參數(shù)設(shè)置為true就行了。程序?qū)?huì)在閉合路徑的外面繪制出一個(gè)金色的輪廓。A部分區(qū)域這部分是要翻動(dòng)的頁(yè)面在裁減出B和C部分之后的可見(jiàn)部分(第4頁(yè))。B部分區(qū)域B部分來(lái)自于正在翻動(dòng)的頁(yè)面的之下的另一頁(yè)面,在這個(gè)例子中指的是第6頁(yè)的可見(jiàn)部分。B部分區(qū)域就是被對(duì)稱(chēng)線與頁(yè)面形成的閉合曲線所裁減的部分。在這個(gè)部分之上的頁(yè)面(第4頁(yè))的相應(yīng)部分將會(huì)被直接裁減掉。顯而易見(jiàn),隨著x的增加(a也隨著增加),這個(gè)可見(jiàn)部分將會(huì)越來(lái)越大。要想看A和B部分區(qū)域的關(guān)系,請(qǐng)將INCLUDE_UNDERSIDE_PAGE_IN_ANIMATION變量設(shè)置為false。這將把C部分從動(dòng)畫(huà)效果中去掉。C部分區(qū)域C部分區(qū)域的圖象表示了正在翻動(dòng)的頁(yè)面的背面的圖象。在這個(gè)例子中,C部分區(qū)域代表了第5頁(yè)的可見(jiàn)部分。C部分也是通過(guò)對(duì)稱(chēng)線指定的,但是是在頁(yè)面的這一邊(對(duì)稱(chēng)線的左邊)。舉個(gè)例子,當(dāng)翻動(dòng)第4頁(yè)時(shí),B部分將會(huì)是第6頁(yè)的右下部分,而C部分將會(huì)是第5頁(yè)的左下部分。圖3展示了B和C之間的關(guān)系。圖3 B和C之間的關(guān)系本文來(lái)自編程入門(mén)網(wǎng):http://www.bianceng.cn/Programming/csharp/201001/14287_3.htm
在繪制C部分區(qū)域時(shí),我們用了一個(gè)后臺(tái)的圖象來(lái)輔助,就是pageUndersideImage。這個(gè)新圖象的裁減區(qū)域通過(guò)對(duì)稱(chēng)線來(lái)確定。第5頁(yè)的圖象被繪制在這個(gè)新的緩沖區(qū)里面,這個(gè)新建的圖象將會(huì)靠近B部分區(qū)域繪制。連接B和C部分區(qū)域當(dāng)C部分的后臺(tái)圖像已經(jīng)準(zhǔn)備好,它通過(guò)下面的步驟繪制:首先調(diào)整系統(tǒng)坐標(biāo)到熱點(diǎn)。將系統(tǒng)坐標(biāo)旋轉(zhuǎn)180-2a度,請(qǐng)看圖4了解它們的關(guān)系。將含有C部分區(qū)域的圖像繪制到相應(yīng)坐標(biāo)(-x,-PAGE_HEIGHT)。圖5標(biāo)明了這種旋轉(zhuǎn)。圖4 調(diào)整角度以匹配對(duì)稱(chēng)線圖5 旋轉(zhuǎn)坐標(biāo)系我發(fā)現(xiàn)沿著對(duì)稱(chēng)線排列B和C部分區(qū)域非常具有挑戰(zhàn)性因?yàn)楫?dāng)前頁(yè)面的顏色容易出“血邊”(因?yàn)榈?頁(yè)的一些紅色像素)。當(dāng)我繪制B或者C部分區(qū)域時(shí),我用了一個(gè)變通方法:指定圖形對(duì)象的pixeloffsetmode以pixeloffsetmode.half方式繪制。g.PixelOffsetMode= PixelOffsetMode.Half;我還發(fā)現(xiàn),在繪制C部分區(qū)域之前,增加一個(gè)像素(或者減掉一個(gè)像素)來(lái)旋轉(zhuǎn)坐標(biāo)也可以防止出“血邊”。PathTranslationMatrix.Translate((float)hotSpot.Origin.X+1,(float)hotSpot.Origin.Y);要使用pixeloffsetmode變通方法,請(qǐng)將源代碼中的USE_PIXEL_MODE_OFFSET設(shè)置為true。-本文來(lái)自編程入門(mén)網(wǎng):http://www.bianceng.cn/Programming/csharp/201001/14287_4.htm
繪制動(dòng)畫(huà)每一幀動(dòng)畫(huà)都是在timer1_Tick方法中繪制到緩沖區(qū)中的CurrentShownBitmap對(duì)象上。CurrentShownBitmap方法僅僅是將繪制到屏幕上。主要功能說(shuō)明計(jì)算動(dòng)畫(huà)中每一幀里B和C部分的圖象都是由以下方法完成的:private GraphicsPath GetPageUnderGraphicsPath(int x,refdouble a, int height, int width,bool isUnderSide, TurnType type)參數(shù)x代表從頁(yè)面邊緣到熱點(diǎn)處的距離(前面已經(jīng)說(shuō)明),height和width參數(shù)代表當(dāng)前頁(yè)面要顯示的高度和寬度。isUnderSide參數(shù)用來(lái)告訴程序是否在計(jì)算C部分區(qū)域(正在翻動(dòng)的那一頁(yè)的背面),最后一個(gè)參數(shù)type是表示頁(yè)面是左翻頁(yè)還是右翻頁(yè)。基本上,isUnderSide和type參數(shù)是用來(lái)獲取圖形路徑的正確性的,參數(shù)a如上所述是代表當(dāng)前角度的。參數(shù)a傳遞的是引用,隨后將在繪制C之前用于旋轉(zhuǎn)坐標(biāo)(見(jiàn)圖4和圖5)。使用代碼安裝控件為了簡(jiǎn)單起見(jiàn),這個(gè)控件有自己的圖片。初始化圖象的代碼在LoadSamples()方法中。這個(gè)方法在Sample類(lèi)的構(gòu)造方法中調(diào)用。控制翻頁(yè)的速度和數(shù)目翻頁(yè)的速度是通過(guò)一個(gè)timer來(lái)控制的,public屬性TickSpeed能用來(lái)控制翻頁(yè)速度(毫秒為單位),動(dòng)畫(huà)的幀數(shù)是通過(guò)每個(gè)timer間隔熱點(diǎn)移動(dòng)的距離來(lái)控制的。public屬性暴露給外界以控制已經(jīng)移動(dòng)的距離x。調(diào)整高度沿著背頁(yè)的頂部裁減是一個(gè)問(wèn)題,public屬性HeightAdjustment用于在控件頂部留一點(diǎn)空白區(qū)域便于裁剪。開(kāi)始動(dòng)畫(huà)這個(gè)組件公開(kāi)兩個(gè)方法來(lái)開(kāi)始動(dòng)畫(huà)。animateRightPageTurn() and animateLeftPageTurn().注意事項(xiàng)我本來(lái)試圖解當(dāng)h=PAGE_HEIGHT時(shí)的非線性方程h = x Tan( 45 + ((45 * (x)) / PAGE_WIDTH) )中的x的值,我的這個(gè)蠻力辦法的代碼包含在源代碼中。是不是還有一個(gè)更優(yōu)雅的辦法呢?說(shuō)明:程序的源代碼可以到http://download.csdn.net/source/381727下載。
本文來(lái)自編程入門(mén)網(wǎng):http://www.bianceng.cn/Programming/csharp/201001/14287_5.htm View Code
用c#和GDI+實(shí)現(xiàn)雜志翻頁(yè)動(dòng)畫(huà)效果詳解
說(shuō)明:以前本人參與個(gè)一個(gè)電子雜志項(xiàng)目,當(dāng)時(shí)要求實(shí)現(xiàn)模擬現(xiàn)實(shí)生活中的雜志翻頁(yè)動(dòng)畫(huà)效果,別人推薦了這篇文章,最后達(dá)到了我想要的效果,今天嘗試把這篇文章翻譯了一下。希望對(duì)英語(yǔ)水平不太好的同行有幫助。如果你的英語(yǔ)水平足夠好,我推薦你閱讀英文原文,網(wǎng)址是:http://www.codeproject.com/KB/GDI-plus/TurnThePage.ASPx,同時(shí)希望大家原諒本人的翻譯水平。 介紹圖1 翻頁(yè)效果這篇文章用來(lái)介紹如何在電子書(shū)或者電子相冊(cè)中并列顯示圖片時(shí)創(chuàng)建一種翻頁(yè)效果,這種翻頁(yè)效果模仿了現(xiàn)實(shí)中的書(shū)本翻頁(yè)情況。背景寫(xiě)作這篇文章的靈感來(lái)自于一個(gè)可重用的用于顯示圖片的組件的需求。我使用了C#和GDI+來(lái)提高我對(duì).net下圖形圖象編程的理解。創(chuàng)建這種效果的技術(shù)背景來(lái)自于一篇文章《FalshMX中的翻頁(yè)效果》,網(wǎng)址是:http://www.oreillynet.com/pub/a/JavaScript/2004/09/03/flashhacks.html,作者是Sham Bhangal。Sham在文章里如何在動(dòng)畫(huà)效果中使用對(duì)稱(chēng)線來(lái)控制頁(yè)面的可見(jiàn)部分。盡管在Flash MX中和在GDI+中的處理有些不同,但是利用對(duì)稱(chēng)線來(lái)計(jì)算頁(yè)面的可見(jiàn)部分這個(gè)概念是相同的。 在這篇文章中,我們假定第3頁(yè)和第4頁(yè)是當(dāng)前頁(yè),并且下一個(gè)動(dòng)作是要翻到第5頁(yè)和第6頁(yè)。換句話說(shuō),我們要展現(xiàn)的是第4頁(yè)的翻頁(yè)效果。動(dòng)畫(huà)技巧下圖闡述了在整個(gè)動(dòng)畫(huà)中的關(guān)鍵區(qū)域和變化區(qū)域。圖2 關(guān)鍵區(qū)域和參數(shù)整個(gè)翻頁(yè)動(dòng)畫(huà)可以概括為:1、完全繪制出第3頁(yè)和第4頁(yè)。在繪制完成之后,B和C部分將會(huì)遮擋住第4頁(yè)的原來(lái)可見(jiàn)部分。2、計(jì)算出對(duì)稱(chēng)線和B和C的裁剪區(qū)域。3、繪制B部分。這是下面的一頁(yè)的部分區(qū)域(第6頁(yè))。4、根據(jù)熱點(diǎn)進(jìn)行相應(yīng)轉(zhuǎn)換,并且進(jìn)行相應(yīng)旋轉(zhuǎn)。5、繪制C部分。這是第4頁(yè)在翻頁(yè)過(guò)程中顯示的它的背面(第5頁(yè))的內(nèi)容。當(dāng)前頁(yè)《FalshMX中的翻頁(yè)效果》一文中指出當(dāng)前頁(yè)并不參與翻頁(yè)效果。這就意味著在翻頁(yè)中的每一面(第3頁(yè)和第4頁(yè))都會(huì)首先被不進(jìn)行任何裁減和轉(zhuǎn)換就繪制出來(lái)。B和C這兩個(gè)可見(jiàn)部分將會(huì)在當(dāng)前頁(yè)之上進(jìn)行繪制。熱點(diǎn)“熱點(diǎn)”這個(gè)詞是我從《FalshMX中的翻頁(yè)效果》一文中借鑒過(guò)來(lái)的。熱點(diǎn)一詞代表在翻頁(yè)時(shí)折痕在水平軸線上的位置,它標(biāo)明對(duì)稱(chēng)線的起始位置。在翻頁(yè)過(guò)程中,熱點(diǎn)一直在從頁(yè)邊緣到書(shū)中間這段距離之間移動(dòng)。從頁(yè)邊到熱點(diǎn)的這段距離(x)將隨著頁(yè)面的翻動(dòng)而變化。當(dāng)熱點(diǎn)到達(dá)書(shū)的中間位置時(shí),動(dòng)畫(huà)就停止了,這時(shí)x=PAGE_WIDTH。對(duì)稱(chēng)線對(duì)稱(chēng)線代表翻頁(yè)時(shí)頁(yè)面的折痕。它是用于計(jì)算在翻頁(yè)時(shí)參與的頁(yè)面可見(jiàn)部分。在程序中,對(duì)稱(chēng)線控制兩件事情:1、B和C部分的裁剪區(qū)域。2、C部分進(jìn)行轉(zhuǎn)換的坐標(biāo)原點(diǎn)。對(duì)稱(chēng)線可以用下面兩個(gè)等式來(lái)描述:a = 45 + ( (45 *x) / PAGE_WIDTH )h = x Tan ( a )注意角度a會(huì)隨著x的變化而變化。這個(gè)等式表明當(dāng)x=0時(shí)a = 45度并且當(dāng)x= PAGE_WIDTH時(shí)a = 90度。當(dāng)動(dòng)畫(huà)開(kāi)始時(shí),x=0,因此B和C部分并不可見(jiàn)。隨著x的增加,對(duì)稱(chēng)線就形成了直角三角形的斜邊。三角形由三個(gè)長(zhǎng)度確定:對(duì)稱(chēng)線、x和高度h。圖2展示了這樣一種情況。 隨著x的增加,將會(huì)出現(xiàn)h>= PAGE_WIDTH的情況。當(dāng)這種情況出現(xiàn)后,對(duì)稱(chēng)線與頁(yè)面相交的區(qū)域?qū)?huì)由三角形變成梯形。梯形的高度就是PAGE_WIDTH。圖1就是這種情況。不管是梯形還是三角形,這個(gè)閉合路線都指出了B和C這兩個(gè)裁減區(qū)域。要想看到運(yùn)行中看到這種帶有邊框的效果,在提供的源代碼中將INCLUDE_DRAW_GRAPHICS_PATH這個(gè)參數(shù)設(shè)置為true就行了。程序?qū)?huì)在閉合路徑的外面繪制出一個(gè)金色的輪廓。A部分區(qū)域這部分是要翻動(dòng)的頁(yè)面在裁減出B和C部分之后的可見(jiàn)部分(第4頁(yè))。B部分區(qū)域B部分來(lái)自于正在翻動(dòng)的頁(yè)面的之下的另一頁(yè)面,在這個(gè)例子中指的是第6頁(yè)的可見(jiàn)部分。B部分區(qū)域就是被對(duì)稱(chēng)線與頁(yè)面形成的閉合曲線所裁減的部分。在這個(gè)部分之上的頁(yè)面(第4頁(yè))的相應(yīng)部分將會(huì)被直接裁減掉。顯而易見(jiàn),隨著x的增加(a也隨著增加),這個(gè)可見(jiàn)部分將會(huì)越來(lái)越大。要想看A和B部分區(qū)域的關(guān)系,請(qǐng)將INCLUDE_UNDERSIDE_PAGE_IN_ANIMATION變量設(shè)置為false。這將把C部分從動(dòng)畫(huà)效果中去掉。C部分區(qū)域C部分區(qū)域的圖象表示了正在翻動(dòng)的頁(yè)面的背面的圖象。在這個(gè)例子中,C部分區(qū)域代表了第5頁(yè)的可見(jiàn)部分。C部分也是通過(guò)對(duì)稱(chēng)線指定的,但是是在頁(yè)面的這一邊(對(duì)稱(chēng)線的左邊)。舉個(gè)例子,當(dāng)翻動(dòng)第4頁(yè)時(shí),B部分將會(huì)是第6頁(yè)的右下部分,而C部分將會(huì)是第5頁(yè)的左下部分。圖3展示了B和C之間的關(guān)系。圖3 B和C之間的關(guān)系在繪制C部分區(qū)域時(shí),我們用了一個(gè)后臺(tái)的圖象來(lái)輔助,就是pageUndersideImage。這個(gè)新圖象的裁減區(qū)域通過(guò)對(duì)稱(chēng)線來(lái)確定。第5頁(yè)的圖象被繪制在這個(gè)新的緩沖區(qū)里面,這個(gè)新建的圖象將會(huì)靠近B部分區(qū)域繪制。 連接B和C部分區(qū)域當(dāng)C部分的后臺(tái)圖像已經(jīng)準(zhǔn)備好,它通過(guò)下面的步驟繪制:首先調(diào)整系統(tǒng)坐標(biāo)到熱點(diǎn)。將系統(tǒng)坐標(biāo)旋轉(zhuǎn)180-2a度,請(qǐng)看圖4了解它們的關(guān)系。將含有C部分區(qū)域的圖像繪制到相應(yīng)坐標(biāo)(-x,-PAGE_HEIGHT)。圖5標(biāo)明了這種旋轉(zhuǎn)。圖4 調(diào)整角度以匹配對(duì)稱(chēng)線圖5 旋轉(zhuǎn)坐標(biāo)系我發(fā)現(xiàn)沿著對(duì)稱(chēng)線排列B和C部分區(qū)域非常具有挑戰(zhàn)性因?yàn)楫?dāng)前頁(yè)面的顏色容易出“血邊”(因?yàn)榈?頁(yè)的一些紅色像素)。當(dāng)我繪制B或者C部分區(qū)域時(shí),我用了一個(gè)變通方法:指定圖形對(duì)象的pixeloffsetmode以pixeloffsetmode.half方式繪制。g.PixelOffsetMode= PixelOffsetMode.Half;我還發(fā)現(xiàn),在繪制C部分區(qū)域之前,增加一個(gè)像素(或者減掉一個(gè)像素)來(lái)旋轉(zhuǎn)坐標(biāo)也可以防止出“血邊”。PathTranslationMatrix.Translate((float)hotSpot.Origin.X+1,(float)hotSpot.Origin.Y);要使用pixeloffsetmode變通方法,請(qǐng)將源代碼中的USE_PIXEL_MODE_OFFSET設(shè)置為true。繪制動(dòng)畫(huà)每一幀動(dòng)畫(huà)都是在timer1_Tick方法中繪制到緩沖區(qū)中的CurrentShownBitmap對(duì)象上。CurrentShownBitmap方法僅僅是將繪制到屏幕上。主要功能說(shuō)明計(jì)算動(dòng)畫(huà)中每一幀里B和C部分的圖象都是由以下方法完成的:private GraphicsPath GetPageUnderGraphicsPath(int x,refdouble a, int height, int width,bool isUnderSide, TurnType type)參數(shù)x代表從頁(yè)面邊緣到熱點(diǎn)處的距離(前面已經(jīng)說(shuō)明),height和width參數(shù)代表當(dāng)前頁(yè)面要顯示的高度和寬度。isUnderSide參數(shù)用來(lái)告訴程序是否在計(jì)算C部分區(qū)域(正在翻動(dòng)的那一頁(yè)的背面),最后一個(gè)參數(shù)type是表示頁(yè)面是左翻頁(yè)還是右翻頁(yè)。基本上,isUnderSide和type參數(shù)是用來(lái)獲取圖形路徑的正確性的,參數(shù)a如上所述是代表當(dāng)前角度的。參數(shù)a傳遞的是引用,隨后將在繪制C之前用于旋轉(zhuǎn)坐標(biāo)(見(jiàn)圖4和圖5)。使用代碼安裝控件為了簡(jiǎn)單起見(jiàn),這個(gè)控件有自己的圖片。初始化圖象的代碼在LoadSamples()方法中。這個(gè)方法在Sample類(lèi)的構(gòu)造方法中調(diào)用。控制翻頁(yè)的速度和數(shù)目翻頁(yè)的速度是通過(guò)一個(gè)timer來(lái)控制的,public屬性TickSpeed能用來(lái)控制翻頁(yè)速度(毫秒為單位),動(dòng)畫(huà)的幀數(shù)是通過(guò)每個(gè)timer間隔熱點(diǎn)移動(dòng)的距離來(lái)控制的。public屬性暴露給外界以控制已經(jīng)移動(dòng)的距離x。調(diào)整高度沿著背頁(yè)的頂部裁減是一個(gè)問(wèn)題,public屬性HeightAdjustment用于在控件頂部留一點(diǎn)空白區(qū)域便于裁剪。開(kāi)始動(dòng)畫(huà)這個(gè)組件公開(kāi)兩個(gè)方法來(lái)開(kāi)始動(dòng)畫(huà)。animateRightPageTurn() and animateLeftPageTurn().注意事項(xiàng)我本來(lái)試圖解當(dāng)h=PAGE_HEIGHT時(shí)的非線性方程h = x Tan( 45 + ((45 * (x)) / PAGE_WIDTH) )中的x的值,我的這個(gè)蠻力辦法的代碼包含在源代碼中。是不是還有一個(gè)更優(yōu)雅的辦法呢?說(shuō)明:程序的源代碼可以到http://download.csdn.net/source/381727下載。 View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/blogpro/p/11465115.html
總結(jié)
- 上一篇: python中计算a的b次方
- 下一篇: C#和C++的区别,也就是解释型语言跟编