到目前為止,看到的所有動(dòng)畫都使用線性插值從起點(diǎn)到終點(diǎn)。但如果需要?jiǎng)?chuàng)建具有多個(gè)分段的動(dòng)畫和不規(guī)則移動(dòng)的動(dòng)畫。例如,可能希望創(chuàng)建一個(gè)動(dòng)畫,快速地將一個(gè)元素滑入到視圖中,然后慢慢地將它移到正確位置。可通過(guò)創(chuàng)建兩個(gè)連續(xù)的動(dòng)畫,并使用BeginTime屬性在第一個(gè)動(dòng)畫之后開(kāi)始第二個(gè)動(dòng)畫來(lái)實(shí)現(xiàn)這種效果。然而,還有更簡(jiǎn)單的方法——可使用關(guān)鍵幀動(dòng)畫。
專注于為中小企業(yè)提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)涪陵免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過(guò)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
關(guān)鍵幀動(dòng)畫是由許多較短的段構(gòu)成的動(dòng)畫。每段表示動(dòng)畫中的初始值,最終值或中間值當(dāng)運(yùn)行動(dòng)畫時(shí),它平滑地從一個(gè)值移到另一個(gè)值。
例如,分析下面的將RadialGradientBrush畫刷的中心點(diǎn)從一個(gè)位置移到另一個(gè)位置的Point動(dòng)畫:
<PointAnimation Storyboard.TargetName="ellipse" Storyboard.TargetProperty="Fill.GradientOrigin"
From="0.7,0.3" To="0.3,0.7" Duration="0:0:10" AutoReverse="True" RepeatBehavior="Forever">
</PointAnimation>
可使用一個(gè)效果相同的PointAnimationUsingKeyFrames對(duì)象代替這個(gè)PointAnimation對(duì)象,如下所示:
復(fù)制代碼
<PointAnimationUsingKeyFrames Storyboard.TargetName="ellipse" Storyboard.TargetProperty="Fill.GradientOrigin" AutoReverse="True" RepeatBehavior="Forever">
<LinearPointKeyFrame Value="0.7,0.3" KeyTime="0:0:0"></LinearPointKeyFrame>
<LinearPointKeyFrame Value="0.3,0.7" KeyTime="0:0:10"></LinearPointKeyFrame>
</PointAnimationUsingKeyFrames>
復(fù)制代碼
這個(gè)動(dòng)畫包含兩個(gè)關(guān)鍵幀。當(dāng)動(dòng)畫首次啟動(dòng)時(shí)第一個(gè)關(guān)鍵幀設(shè)置Point值(如果希望使用在RadialGradientBrush畫刷中設(shè)置的當(dāng)前值,可省略這個(gè)關(guān)鍵幀)。第二個(gè)關(guān)鍵幀定義結(jié)束值,這是10秒之后達(dá)到的數(shù)值。PointAnimationUsingKeyFrames對(duì)象執(zhí)行線性插值。從第一個(gè)關(guān)鍵幀平滑移到第二個(gè)關(guān)鍵幀,就像PointAnimation對(duì)象對(duì)From和To值執(zhí)行的操作一樣。
可使用一系列關(guān)鍵幀創(chuàng)建更有趣的示例。下面的動(dòng)畫通過(guò)在不同的時(shí)刻到達(dá)的一系列位置經(jīng)歷中心點(diǎn)。中心點(diǎn)的移動(dòng)速度根據(jù)關(guān)鍵幀之間的持續(xù)時(shí)間以及需要移動(dòng)的距離而改變。
復(fù)制代碼
<PointAnimationUsingKeyFrames Storyboard.TargetName="ellipse" Storyboard.TargetProperty="Fill.GradientOrigin"
RepeatBehavior="Forever">
<LinearPointKeyFrame Value="0.7,0.3" KeyTime="0:0:0"></LinearPointKeyFrame>
<LinearPointKeyFrame Value="0.3,0.7" KeyTime="0:0:5"></LinearPointKeyFrame>
<LinearPointKeyFrame Value="0.5,0.9" KeyTime="0:0:8"></LinearPointKeyFrame>
<LinearPointKeyFrame Value="0.9,0.6" KeyTime="0:0:10"></LinearPointKeyFrame>
<LinearPointKeyFrame Value="0.8,0.2" KeyTime="0:0:12"></LinearPointKeyFrame>
<LinearPointKeyFrame Value="0.7,0.3" KeyTime="0:0:14"></LinearPointKeyFrame>
</PointAnimationUsingKeyFrames>
復(fù)制代碼
這個(gè)動(dòng)畫不是可反轉(zhuǎn)的,但可以重復(fù)。為確保在一次迭代的最后數(shù)據(jù)和下一次迭代的開(kāi)始數(shù)值之間不會(huì)出現(xiàn)跳躍,應(yīng)使動(dòng)畫的結(jié)束點(diǎn)和開(kāi)始點(diǎn)位于相同的中心點(diǎn)。
一、離散的關(guān)鍵幀動(dòng)畫
上面示例中的關(guān)鍵幀動(dòng)畫使用線性關(guān)鍵幀。所以,它在關(guān)鍵幀值之間平滑地過(guò)渡,另一種選擇是使用離散的關(guān)鍵幀。對(duì)于這種情況,不進(jìn)行插值。當(dāng)?shù)竭_(dá)關(guān)鍵時(shí)間時(shí),屬性突然改變?yōu)樾轮怠?/p>
線性關(guān)鍵幀類使用“Linear+數(shù)據(jù)類型+KeyFrame”的形式進(jìn)行命名。離散關(guān)鍵幀類使用“Discrete+數(shù)據(jù)類型+KeyFrame”的形式命名。下面是RadialGradientBrush畫刷示例的修改版本,在該修改版本中使用的是離散關(guān)鍵幀:
復(fù)制代碼
<PointAnimationUsingKeyFrames Storyboard.TargetName="ellipse" Storyboard.TargetProperty="Fill.GradientOrigin"
RepeatBehavior="Forever">
<DiscretePointKeyFrame Value="0.7,0.3" KeyTime="0:0:0"></DiscretePointKeyFrame>
<DiscretePointKeyFrame Value="0.3,0.7" KeyTime="0:0:5"></DiscretePointKeyFrame>
<DiscretePointKeyFrame Value="0.5,0.9" KeyTime="0:0:8"></DiscretePointKeyFrame>
<DiscretePointKeyFrame Value="0.9,0.6" KeyTime="0:0:10"></DiscretePointKeyFrame>
<DiscretePointKeyFrame Value="0.8,0.2" KeyTime="0:0:12"></DiscretePointKeyFrame>
<DiscretePointKeyFrame Value="0.7,0.3" KeyTime="0:0:14"></DiscretePointKeyFrame>
</PointAnimationUsingKeyFrames>
復(fù)制代碼
當(dāng)運(yùn)行這個(gè)動(dòng)畫時(shí),中心點(diǎn)在適當(dāng)?shù)臅r(shí)間從一個(gè)位置跳到下一個(gè)位置。這是戲劇性的(但是不平穩(wěn)的)效果。
所有關(guān)鍵幀動(dòng)畫類都支持離散關(guān)鍵幀,但只有一部分關(guān)鍵幀動(dòng)畫類支持線性關(guān)鍵幀。這完全取決于數(shù)據(jù)類型。支持線性關(guān)鍵幀的數(shù)據(jù)類型也支持線性插值,并提供了相應(yīng)的DataTypeAnimation類,如Point、Color以及double。不支持線性插值的數(shù)據(jù)類型包括字符串和對(duì)象。
二、緩動(dòng)關(guān)鍵幀
通過(guò)“【W(wǎng)PF學(xué)習(xí)】第五十一章 動(dòng)畫緩動(dòng) ”的學(xué)習(xí),看到了如何使用緩動(dòng)函數(shù)改進(jìn)普通動(dòng)畫。盡管關(guān)鍵幀動(dòng)畫被分割成多段,但每段仍使用普遍的、令人厭煩的線性插值。
如果這不是希望的結(jié)果,可使用緩動(dòng)函數(shù)為每個(gè)關(guān)鍵幀添加加速和減速的效果。然而,普通的線性插值關(guān)鍵幀類和離散關(guān)鍵幀類不支持該特征。相反,需要使用緩動(dòng)關(guān)鍵幀,如EasingDoubleKeyFrame、EasingColorKeyFrame或EasingPointKeyFrame。每個(gè)緩動(dòng)關(guān)鍵幀類和對(duì)應(yīng)的線性插值關(guān)鍵幀類的工作方式相同,但是額外提供了EasingFunction屬性。
下面的示例使用動(dòng)畫緩動(dòng)為前5秒得關(guān)鍵幀動(dòng)畫應(yīng)用加速效果:
復(fù)制代碼
<PointAnimationUsingKeyFrames Storyboard.TargetName="ellipse" Storyboard.TargetProperty="Fill.GradientOrigin"
RepeatBehavior="Forever">
<LinearPointKeyFrame Value="0.7,0.3" KeyTime="0:0:0"></LinearPointKeyFrame>
<EasingPointKeyFrame Value="0.3,0.7" KeyTime="0:0:5">
<EasingPointKeyFrame.EasingFunction>
<CircleEase></CircleEase>
</EasingPointKeyFrame.EasingFunction>
</EasingPointKeyFrame>
<LinearPointKeyFrame Value="0.5,0.9" KeyTime="0:0:8"></LinearPointKeyFrame>
<LinearPointKeyFrame Value="0.9,0.6" KeyTime="0:0:10"></LinearPointKeyFrame>
<LinearPointKeyFrame Value="0.8,0.2" KeyTime="0:0:12"></LinearPointKeyFrame>
<LinearPointKeyFrame Value="0.7,0.3" KeyTime="0:0:14"></LinearPointKeyFrame>
</PointAnimationUsingKeyFrames>
復(fù)制代碼
結(jié)合使用關(guān)鍵幀和動(dòng)畫緩動(dòng)是構(gòu)建復(fù)雜動(dòng)畫模型的簡(jiǎn)便方式,但仍可能無(wú)法提供所需的控制。不使用動(dòng)畫緩動(dòng),可創(chuàng)建數(shù)學(xué)公式指示動(dòng)畫的進(jìn)度。
三、樣條關(guān)鍵幀動(dòng)畫
還有一種關(guān)鍵幀類型:樣條關(guān)鍵幀。每個(gè)支持線性關(guān)鍵幀的類也支持樣條關(guān)鍵幀,它們使用“Spline+數(shù)據(jù)類型+KeyFrame”的形式進(jìn)行命名。
與線性關(guān)鍵幀一樣,樣條關(guān)鍵幀使用插值從一個(gè)鍵值平滑地移到另一個(gè)鍵值。區(qū)別是每個(gè)樣條關(guān)鍵幀都是KeySpline屬性??墒褂迷搶傩远x能影響插值方式的三次貝塞爾曲線。盡管為了得到希望的效果這樣做有些繁瑣,但這種技術(shù)能創(chuàng)建更加連貫的加速和減速以及更逼真的動(dòng)畫效果。
在前面章節(jié)學(xué)習(xí)過(guò),貝塞爾曲線由起點(diǎn)、終點(diǎn)以及兩個(gè)控制點(diǎn)定義。對(duì)于關(guān)鍵樣條,起點(diǎn)總是(0,0),終點(diǎn)總是(1,1)。用戶只需要提供兩個(gè)控制點(diǎn)。創(chuàng)建的曲線描述了時(shí)間(X軸)和動(dòng)畫值(Y值)之間的關(guān)系。
下面的示例通過(guò)對(duì)比Canvas面板上兩個(gè)橢圓的移動(dòng),演示了一個(gè)關(guān)鍵幀樣條動(dòng)畫。第一個(gè)橢圓使用DoubleAnimation動(dòng)畫緩慢勻速地再窗口上移動(dòng)。第二個(gè)橢圓使用具有兩個(gè)SplineDoubleKeyFrame對(duì)象的DoubleAnimationUsingKeyFrames動(dòng)畫。兩個(gè)橢圓同時(shí)到達(dá)目的位置(10秒后),但第二個(gè)橢圓在運(yùn)動(dòng)過(guò)程中會(huì)有明顯的加速和減速,減速時(shí)會(huì)超過(guò)第一個(gè)橢圓而減速時(shí)又會(huì)落后于第一個(gè)橢圓。
復(fù)制代碼
<DoubleAnimationUsingKeyFrames
Storyboard.TargetName="ellipse2" Storyboard.TargetProperty="(Canvas.Left)" >
<SplineDoubleKeyFrame KeyTime="0:0:5" Value="250" KeySpline="0.25,0 0.5,0.7"></SplineDoubleKeyFrame>
<SplineDoubleKeyFrame KeyTime="0:0:10" Value="500" KeySpline="0.25,0.8 0.2,0.4"></SplineDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimation
Storyboard.TargetName="ellipse1" Storyboard.TargetProperty="(Canvas.Left)"
To="500" Duration="0:0:10">
</DoubleAnimation>
復(fù)制代碼
最快的加速發(fā)生在5秒后不久,也就是當(dāng)進(jìn)入第二個(gè)SplineDoubleKeyFrame關(guān)鍵幀時(shí)。貝塞爾曲線的第一個(gè)控制點(diǎn)將較大的表示動(dòng)畫進(jìn)度(0.8)的Y軸值與較小的表示時(shí)間的X軸值相匹配。所以,在再次減慢速度前,橢圓在一小段距離內(nèi)會(huì)增加速度。
下圖以圖形方式顯示了兩條控制橢圓運(yùn)動(dòng)的曲線。為理解這些曲線,請(qǐng)記住它們從頂部到底部描述了動(dòng)畫過(guò)程。觀察第一條曲線可以發(fā)現(xiàn),它相對(duì)均勻地下降,在開(kāi)始處有較短的暫停,在末尾處平緩下降。然而第二條曲線快速下降,運(yùn)動(dòng)了一個(gè)大段距離,然后對(duì)于剩余的動(dòng)畫部分,曲線緩緩下降。
文章標(biāo)題:關(guān)鍵幀動(dòng)畫的三種類型
分享路徑:http://aaarwkj.com/article30/psoopo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站設(shè)計(jì)、云服務(wù)器、網(wǎng)站收錄、動(dòng)態(tài)網(wǎng)站、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)