Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android學會屬性動畫的基本用法(下),Interpolator 與ViewPropertyAnimator的用法

Android學會屬性動畫的基本用法(下),Interpolator 與ViewPropertyAnimator的用法

編輯:關於Android編程

Interpolator的用法

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

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

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

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

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

那麼再來看一下在“中”篇文章中完成的小球移動加變色的功能,如下圖所示:

從上圖中我們明顯可以看出,小球一開始運動速度比較慢,然後逐漸加速,中間的部分運動速度就比較快,接下來開始減速,最後緩緩停住。另外顏色變化也是這種規律,一開始顏色變化的比較慢,中間顏色變化的很快,最後階段顏色變化的又比較慢。

從以上幾點我們就可以總結出一個結論了,使用屬性動畫時,系統默認的Interpolator其實就是一個先加速後減速的Interpolator,對應的實現類就是AccelerateDecelerateInterpolator。

當然,我們也可以很輕松地修改這一默認屬性,將它替換成任意一個系統內置好的Interpolator。就拿“中”篇文章中的代碼來舉例吧,MyAnimView中的startAnimation()方法是開啟動畫效果的入口,這裡我們對Point對象的坐標稍做一下修改,讓它變成一種垂直掉落的效果,代碼如下所示:

  1. privatevoidstartAnimation(){
  2. PointstartPoint=newPoint(getWidth()/2,RADIUS);
  3. PointendPoint=newPoint(getWidth()/2,getHeight()-RADIUS);
  4. ValueAnimatoranim=ValueAnimator.ofObject(newPointEvaluator(),startPoint,endPoint);
  5. anim.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){
  6. @Override
  7. publicvoidonAnimationUpdate(ValueAnimatoranimation){
  8. currentPoint=(Point)animation.getAnimatedValue();
  9. invalidate();
  10. }
  11. });
  12. anim.setDuration(2000);
  13. anim.start();
  14. }
這裡主要是對Point構造函數中的坐標值進行了一下改動,那麼現在小球運動的動畫效果應該是從屏幕正中央的頂部掉落到底部。但是現在默認情況下小球的下降速度肯定是先加速後減速的,這不符合物理的常識規律,如果把小球視為一個自由落體的話,那麼下降的速度應該是越來越快的。我們怎樣才能改變這一默認行為呢?其實很簡單,調用Animator的setInterpolator()方法就可以了,這個方法要求傳入一個實現TimeInterpolator接口的實例,那麼比如說我們想要實現小球下降越來越快的效果,就可以使用AccelerateInterpolator,代碼如下所示:
  1. privatevoidstartAnimation(){
  2. PointstartPoint=newPoint(getWidth()/2,RADIUS);
  3. PointendPoint=newPoint(getWidth()/2,getHeight()-RADIUS);
  4. ValueAnimatoranim=ValueAnimator.ofObject(newPointEvaluator(),startPoint,endPoint);
  5. anim.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){
  6. @Override
  7. publicvoidonAnimationUpdate(ValueAnimatoranimation){
  8. currentPoint=(Point)animation.getAnimatedValue();
  9. invalidate();
  10. }
  11. });
  12. anim.setInterpolator(newAccelerateInterpolator(2f));
  13. anim.setDuration(2500);
  14. anim.start();
  15. }

代碼很簡單,這裡調用了setInterpolator()方法,然後傳入了一個AccelerateInterpolator的實例,注意AccelerateInterpolator的構建函數可以接收一個float類型的參數,這個參數是用於控制加速度的。現在運行一下代碼,效果如下圖所示:

\

OK,效果非常明顯,說明我們已經成功替換掉了默認的Interpolator,AccelerateInterpolator確實是生效了。但是現在的動畫效果看上去仍然是怪怪的,因為一個小球從很高的地方掉落到地面上直接就靜止了,這也是不符合物理規律的,小球撞擊到地面之後應該要反彈起來,然後再次落下,接著再反彈起來,又再次落下,以此反復,最後靜止。這個功能我們當然可以自己去寫,只不過比較復雜,所幸的是,Android系統中已經提供好了這樣一種Interpolator,我們只需要簡單地替換一下就可以完成上面的描述的效果,代碼如下所示:

  1. privatevoidstartAnimation(){
  2. PointstartPoint=newPoint(getWidth()/2,RADIUS);
  3. PointendPoint=newPoint(getWidth()/2,getHeight()-RADIUS);
  4. ValueAnimatoranim=ValueAnimator.ofObject(newPointEvaluator(),startPoint,endPoint);
  5. anim.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){
  6. @Override
  7. publicvoidonAnimationUpdate(ValueAnimatoranimation){
  8. currentPoint=(Point)animation.getAnimatedValue();
  9. invalidate();
  10. }
  11. });
  12. anim.setInterpolator(newBounceInterpolator());
  13. anim.setDuration(3000);
  14. anim.start();
  15. }
可以看到,我們只是將設置的Interpolator換成了BounceInterpolator的實例,而BounceInterpolator就是一種可以模擬物理規律,實現反復彈起效果的Interpolator。另外還將整體的動畫時間稍微延長了一點,因為小球反復彈起需要比之前更長的時間。現在重新運行一下代碼,效果如下圖所示:

\

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved