15 5 1 F 中實現的動畫形式

2021-06-02 16:55:27 字數 2540 閱讀 8705

15.5.1 f# 中實現的動畫形式

在本節中,我們將實現顯示動畫的窗體。在 f # 中,特別有趣,因為,我們將在 f# interactive 中使用它,建立與實驗動畫。在這裡,f# 開發的典型風格是非常不同於 c#。在 c# 中,我們會實現窗體,建立動畫,編譯應用程式,然後執行。在 f# 中,我們會實現窗體,把它裝載到 f# interactive,然後,嘗試寫一些動畫,把它們注入到現有的窗體,來看它們如何工作。

清單 15.16 顯示了實現的 f# 窗體。c# 版本在本質上是相同的,你可以在本書的**上找到它。我們不會討論 c# **,因為必須編譯整個應用程式,以顯示動畫,但我們會繼續顯示**所有的有趣部分(例如,建立一些好的動畫), 在 c# 和 f# 中。

listing 15.16 implementing a form for showing animations (f#)

open system.windows.forms

type animationform() as this = 

inherit form() 

let emptyanim = forever(drawing(fun _ –> ())) 

let mutable starttime = datetime.utcnow 

let mutable anim = emptyanim

do this.setstyle(controlstyles.allpaintinginwmpaint ||| 

controlstyles.optimizeddoublebuffer, true) 

let tmr = new timers.timer(interval = 25.0) 

tmr.elapsed.add(fun _ -> this.invalidate() ) 

tmr.start()

member x.animation 

with get() = anim 

and set(newanim) = 

anim <- newanim 

starttime <- datetime.utcnow

override x.onpaint(e) = 

let w, h = x.clientsize.width, x.clientsize.height 

e.graphics.clear(brushes.white) 

e.graphics.translatetransform(float32(w) / 2.0f), float32(h) / 2.0f)) 

let elapsed = (datetime.utcnow - starttime).totalseconds 

let currentdrawing = anim |> readvalue (float32(elapsed)) 

currentdrawing.draw(e.graphics)

這個型別是繼承自 .net 的 form 類,使用可變值,繫結到儲存物件的狀態。在建構函式的內部,我們建立乙個計時器,每 25 毫秒重繪動畫的窗體。

這個類把動畫公開為可變屬性,可以讀取或設定區域性的可變值。在設定函式中,我們還置了動畫的開始時間。

繪圖在重寫的 onpaint 方法內實現,它使用 readvalue 函式,以獲得在給定時間的繪圖。

類宣告包含在 f# 中的 oop 幾個高階的方面,我們需要解釋。窗體繼承自 .net 的 form 類,直接把  inherit form() 構造寫在型別宣告的後面。類的主體開頭是幾個普通的 let 繫結。第乙個宣告乙個空的動畫:包含繪圖的常量行為(用 drawing 基元建立),它不畫任何內容,我們把它作為初始動畫顯示在窗體上。為了用動畫做實驗,需要在 f# interactive 中建立乙個窗體,使用命令式改變以顯示動畫。這是在 f# 中使用並互式開發時的常用方式,使用可變狀態是完全有效的。

使用乙個名為 animation 的屬性執行這種可變。要建立讀/寫屬性,使用 with 關鍵字,指定讀取函式和設定函式作為兩個**塊,使用的語法類似於普通函式宣告。在設定函式中,我們設定新動畫,並重置了開始時間。

窗體的宣告還包含了 as this 構造,直接跟在隱式建構函式的後面。這樣,我們可以在建構函式**中,使用對這個窗體的引用。我們用它來呼叫 setstyle 方法,以避免閃爍(||| 運算子是 f# 按位或運算子,它也可用於處理列舉)。我們在建立計時器時,也使用了 this 引用,強制重繪窗體。

最有趣的部分是 onpaint 成員,它重寫了 .net form 預設的 onpaint 方法,並繪製了動畫。它被計時器重複呼叫,使用 invalidate 方法,使窗體無效時。當清除視窗後,繪製動畫是很容易的。我們使用輔助函式 readvalue,是我們早先在用行為進行實驗時宣告的。該函式使可以我們在動畫中,繪製當前時間相應的影象。一旦我們有了繪圖,就可呼叫其 draw 方法,它在由系統提供的圖形物件上繪製。

這是我們必須寫的唯一複雜的**段,為了開始建立動畫。現在,我們可以 f# interactive 中例項化窗體,並設定它的 animation 屬性,為我們以前建立的簡單繪圖 (其值我們稱為 animdrawing)。此時,應該看到乙個圓。從這是乙個理論上的支吾,你不會看到任何運動,因為繪圖總是相同的。要顯示真正的動畫,還需要使用更有趣的行為。

15 5 1 F 中實現的動畫形式

15.5.1 f 中實現的動畫形式 在本節中,我們將實現顯示動畫的窗體。在 f 中,特別有趣,因為,我們將在 f interactive 中使用它,建立與實驗動畫。在這裡,f 開發的典型風格是非常不同於 c 在 c 中,我們會實現窗體,建立動畫,編譯應用程式,然後執行。在 f 中,我們會實現窗體,把...

Android中幀動畫的實現

對於android中動畫的實現,android中的動畫主要有幀動畫,補間動畫,屬性動畫,層layer。所謂的幀動畫就是多張進行迴圈的切換形成的效果。實現步驟 在res資料夾下新建資料夾drawable 在drawable資料夾下新建xml檔案,型別為 animation list 把我們要切換的通過...

svg animate實現載入中的動畫

viewbox 0 0 64 64 style width 40px height 40px stroke width 0 cx 24 cy 0 transform translate 32,32 r 7.48463 attributename r dur 750ms values 8 7 6 5 ...