自定义Interpolator
nterpolator這個(gè)東西很難進(jìn)行翻譯,直譯過來的話是補(bǔ)間器的意思,它的主要作用是可以控制動(dòng)畫的變化速率,比如去實(shí)現(xiàn)一種非線性運(yùn)動(dòng)的動(dòng)畫效果。那么什么叫做非線性運(yùn)動(dòng)的動(dòng)畫效果呢?就是說動(dòng)畫改變的速率不是一成不變的,像加速運(yùn)動(dòng)以及減速運(yùn)動(dòng)都屬于非線性運(yùn)動(dòng)。
不過Interpolator并不是屬性動(dòng)畫中新增的技術(shù),實(shí)際上從Android 1.0版本開始就一直存在Interpolator接口了,而之前的補(bǔ)間動(dòng)畫當(dāng)然也是支持這個(gè)功能的。只不過在屬性動(dòng)畫中新增了一個(gè)TimeInterpolator接口,這個(gè)接口是用于兼容之前的Interpolator的,這使得所有過去的Interpolator實(shí)現(xiàn)類都可以直接拿過來放到屬性動(dòng)畫當(dāng)中使用,那么我們來看一下現(xiàn)在TimeInterpolator接口的所有實(shí)現(xiàn)類,如下圖所示:
可以看到,TimeInterpolator接口已經(jīng)有非常多的實(shí)現(xiàn)類了,這些都是Android系統(tǒng)內(nèi)置好的并且我們可以直接使用的Interpolator。每個(gè)Interpolator都有它各自的實(shí)現(xiàn)效果,比如說AccelerateInterpolator就是一個(gè)加速運(yùn)動(dòng)的Interpolator,而DecelerateInterpolator就是一個(gè)減速運(yùn)動(dòng)的Interpolator。
我覺得細(xì)心的朋友應(yīng)該早已經(jīng)發(fā)現(xiàn)了,在前面兩篇文章當(dāng)中我們所學(xué)到的所有屬性動(dòng)畫,其實(shí)都不是在進(jìn)行一種線程運(yùn)動(dòng)。比如說在“上”篇文章中使用ValueAnimator所打印的值如下所示:
可以看到,一開始的值變化速度明顯比較慢,僅0.0開頭的就打印了4次,之后開始加速,最后階段又開始減速,因此我們可以很明顯地看出這一個(gè)先加速后減速的Interpolator。
編寫自定義Interpolator最主要的難度都是在于數(shù)學(xué)計(jì)算方面的,由于我數(shù)學(xué)并不是很好,因此這里也就寫一個(gè)簡(jiǎn)單點(diǎn)的Interpolator來給大家演示一下。既然屬性動(dòng)畫默認(rèn)的Interpolator是先加速后減速的一種方式,這里我們就對(duì)它進(jìn)行一個(gè)簡(jiǎn)單的修改,讓它變成先減速后加速的方式。新建DecelerateAccelerateInterpolator類,讓它實(shí)現(xiàn)TimeInterpolator接口,代碼如下所示:
[java]?view plaincopy同樣我們可以將這個(gè)算法的執(zhí)行情況通過曲線圖的方式繪制出來,結(jié)果如下圖所示:
可以看到,這也是一個(gè)S型的曲線圖,只不過曲線的方向和剛才是相反的。從上圖中我們可以很清楚地看出來,一開始縱坐標(biāo)的變化幅度很大,然后逐漸變小,橫坐標(biāo)到0.5的時(shí)候縱坐標(biāo)變化幅度趨近于零,之后隨著橫坐標(biāo)繼續(xù)增加縱坐標(biāo)的變化幅度又開始變大,的確是先減速后加速的效果。
那么現(xiàn)在我們將DecelerateAccelerateInterpolator在代碼中進(jìn)行替換,如下所示:
[java]?view plaincopy非常簡(jiǎn)單,就是將DecelerateAccelerateInterpolator的實(shí)例傳入到setInterpolator()方法當(dāng)中。重新運(yùn)行一下代碼,效果如下圖所示:
OK!小球的運(yùn)動(dòng)確實(shí)是先減速后加速的效果,說明我們自定義的Interpolator已經(jīng)可以正常工作了。通過這樣一個(gè)程度的學(xué)習(xí),相信大家對(duì)屬性動(dòng)畫Interpolator的理解和使用都達(dá)到了一個(gè)比較深刻的層次了。
總結(jié)
以上是生活随笔為你收集整理的自定义Interpolator的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Android学习笔记二] View
- 下一篇: 关于JQuery简单介绍