日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义Interpolator

發(fā)布時間:2025/1/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义Interpolator 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

nterpolator這個東西很難進行翻譯,直譯過來的話是補間器的意思,它的主要作用是可以控制動畫的變化速率,比如去實現(xiàn)一種非線性運動的動畫效果。那么什么叫做非線性運動的動畫效果呢?就是說動畫改變的速率不是一成不變的,像加速運動以及減速運動都屬于非線性運動。

不過Interpolator并不是屬性動畫中新增的技術(shù),實際上從Android 1.0版本開始就一直存在Interpolator接口了,而之前的補間動畫當(dāng)然也是支持這個功能的。只不過在屬性動畫中新增了一個TimeInterpolator接口,這個接口是用于兼容之前的Interpolator的,這使得所有過去的Interpolator實現(xiàn)類都可以直接拿過來放到屬性動畫當(dāng)中使用,那么我們來看一下現(xiàn)在TimeInterpolator接口的所有實現(xiàn)類,如下圖所示:


可以看到,TimeInterpolator接口已經(jīng)有非常多的實現(xiàn)類了,這些都是Android系統(tǒng)內(nèi)置好的并且我們可以直接使用的Interpolator。每個Interpolator都有它各自的實現(xiàn)效果,比如說AccelerateInterpolator就是一個加速運動的Interpolator,而DecelerateInterpolator就是一個減速運動的Interpolator。

我覺得細心的朋友應(yīng)該早已經(jīng)發(fā)現(xiàn)了,在前面兩篇文章當(dāng)中我們所學(xué)到的所有屬性動畫,其實都不是在進行一種線程運動。比如說在“上”篇文章中使用ValueAnimator所打印的值如下所示:


可以看到,一開始的值變化速度明顯比較慢,僅0.0開頭的就打印了4次,之后開始加速,最后階段又開始減速,因此我們可以很明顯地看出這一個先加速后減速的Interpolator。

編寫自定義Interpolator最主要的難度都是在于數(shù)學(xué)計算方面的,由于我數(shù)學(xué)并不是很好,因此這里也就寫一個簡單點的Interpolator來給大家演示一下。既然屬性動畫默認的Interpolator是先加速后減速的一種方式,這里我們就對它進行一個簡單的修改,讓它變成先減速后加速的方式。新建DecelerateAccelerateInterpolator類,讓它實現(xiàn)TimeInterpolator接口,代碼如下所示:

[java]?view plaincopy
  • public?class?DecelerateAccelerateInterpolator?implements?TimeInterpolator{??
  • ??
  • ????@Override??
  • ????public?float?getInterpolation(float?input)?{??
  • ????????float?result;??
  • ????????if?(input?<=?0.5)?{??
  • ????????????result?=?(float)?(Math.sin(Math.PI?*?input))?/?2;??
  • ????????}?else?{??
  • ????????????result?=?(float)?(2?-?Math.sin(Math.PI?*?input))?/?2;??
  • ????????}??
  • ????????return?result;??
  • ????}??
  • ??
  • }??
  • 這段代碼是使用正弦函數(shù)來實現(xiàn)先減速后加速的功能的,因為正弦函數(shù)初始弧度的變化值非常大,剛好和余弦函數(shù)是相反的,而隨著弧度的增加,正弦函數(shù)的變化值也會逐漸變小,這樣也就實現(xiàn)了減速的效果。當(dāng)弧度大于π/2之后,整個過程相反了過來,現(xiàn)在正弦函數(shù)的弧度變化值非常小,漸漸隨著弧度繼續(xù)增加,變化值越來越大,弧度到π時結(jié)束,這樣從0過度到π,也就實現(xiàn)了先減速后加速的效果。

    同樣我們可以將這個算法的執(zhí)行情況通過曲線圖的方式繪制出來,結(jié)果如下圖所示:


    可以看到,這也是一個S型的曲線圖,只不過曲線的方向和剛才是相反的。從上圖中我們可以很清楚地看出來,一開始縱坐標(biāo)的變化幅度很大,然后逐漸變小,橫坐標(biāo)到0.5的時候縱坐標(biāo)變化幅度趨近于零,之后隨著橫坐標(biāo)繼續(xù)增加縱坐標(biāo)的變化幅度又開始變大,的確是先減速后加速的效果。

    那么現(xiàn)在我們將DecelerateAccelerateInterpolator在代碼中進行替換,如下所示:

    [java]?view plaincopy
  • private?void?startAnimation()?{??
  • ????Point?startPoint?=?new?Point(getWidth()?/?2,?RADIUS);??
  • ????Point?endPoint?=?new?Point(getWidth()?/?2,?getHeight()?-?RADIUS);??
  • ????ValueAnimator?anim?=?ValueAnimator.ofObject(new?PointEvaluator(),?startPoint,?endPoint);??
  • ????anim.addUpdateListener(new?ValueAnimator.AnimatorUpdateListener()?{??
  • ????????@Override??
  • ????????public?void?onAnimationUpdate(ValueAnimator?animation)?{??
  • ????????????currentPoint?=?(Point)?animation.getAnimatedValue();??
  • ????????????invalidate();??
  • ????????}??
  • ????});??
  • ????anim.setInterpolator(new?DecelerateAccelerateInterpolator());??
  • ????anim.setDuration(3000);??
  • ????anim.start();??
  • }??
  • 非常簡單,就是將DecelerateAccelerateInterpolator的實例傳入到setInterpolator()方法當(dāng)中。重新運行一下代碼,效果如下圖所示:


    OK!小球的運動確實是先減速后加速的效果,說明我們自定義的Interpolator已經(jīng)可以正常工作了。通過這樣一個程度的學(xué)習(xí),相信大家對屬性動畫Interpolator的理解和使用都達到了一個比較深刻的層次了。


    總結(jié)

    以上是生活随笔為你收集整理的自定义Interpolator的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。