做Android開發的同學很多都知道或者使用過壹個動畫庫,那就是NineOldAndroids,它的作者及其牛X,好幾個著名的開源庫都是他的作品,具體大家可以看他的 JakeWharton 。簡單來說,NineOldAndroids是壹個向下兼容的動畫庫,主要是使低於API 11的系統也能夠使用View的屬性動畫。以下是個其官網的簡述 :
Android library for using the Honeycomb (Android 3.0) animation API on all versions of the platform back to 1.0!Animation prior to Honeycomb was very limited in what it could accomplish so in Android 3.x a new API was written. With only a change in imports, we are able to use a large subset of the new-style animation with exactly the same API.
View的屬性動畫在Android API 11及其以後才支持,該庫的作用就是讓API 11以下的系統也能夠正常的使用屬性動畫。它的類名、用法與官方的都壹樣,只是包名不壹樣。使用該庫,妳就可以在API 版本很低的情況下也能夠使用各種屬性動畫,讓妳的應用更加有動感、平滑。 官方地址 : ?nineoldandroids 。
基本原理簡介
壹般來說,我們使用NineOldAndroids的屬性動畫時的代碼大致是如下這樣的:
ValueAnimator colorAnim = ObjectAnimator.ofFloat(myView, "scaleX", 0.3f);colorAnim.setDuration(1000);colorAnim.start();
這個動畫會將myView (View的子類型)的寬度在1秒鐘之內縮放到原始寬度的30%。下面我們先來簡單說明壹下NineOldAndroids的基本原理。
不管是官方的支持,還是nideoldandroids的低版本支持,它們使用的技術原理都是壹樣的。NineOldAndroids的基本原理就是在構建屬性動畫時根據用戶的系統版本來選擇不同的實現方式,並且對於低版本的API使用自己的實現來做屬性動畫。如果用戶的系統API大於等於11,即Android 3.0及其以上,那麽就會在動畫的duration期間內連續地通過反射來調用該屬性的set方法來修改它的值。例如上面的 scaleX屬性,該動畫庫會在內部構造 scaleX 的set方法,格式如下為set + 首字母大寫屬性名 + 參數,例如setS caleX (float scale),這樣在壹段時間內連續的修改myView的縮放值就達到了動畫的效果。我們看setScaleX的文檔:
如果用戶的系統低於API 11,那麽就不會調用View的set屬性方法來修改它的屬性,而是通過矩陣(Matrix)來修改View的縮放、平移、旋轉等動畫。關於矩陣的壹些支持請參考相關的資料。 Android中圖像變換Matrix的原理、代碼驗證和應用(壹) , Android Matrix理論與應用詳解 , Android--Matrix圖片變換處理 。
基本原理了解以後我們就來看看它的實現吧。
源碼分析