當我們的軟件基本功能都實現了之後,我們是不是還可以把它做的更好呢?一個能讓用戶體驗明顯提升的方法,就是為我們的應用適當的增加一些動畫效果,android系統中已經為我們內置了幾個常用的動畫,基本滿足我們日常的需要。但是如果我們的需求比較特殊,需要實現自己特定的動畫效果又改怎麼辦呢?下面就為大家介紹一下。
整體來說Android中的動畫,就是一個線性變換,學過線性代數的同學肯定不陌生拉~通過增加變換矩陣,就可以實現我們向要的各種效果,當然,如果你的數學不是很好,也沒有關系,因為具體的數學細節android已經封裝很多了,我們要做的只是調用相應的接口就可以了。
首先,我們要繼承Animation類,並實現它的applyTransformation方法,這個方法是一個回調方法,在動畫進行的過程中,系統會一直不停的調用這個方法,每次調用,這個方法給我們傳進來一個變換矩陣,通過對這個矩陣的操作,我們就可以實現自己的動畫效果了,例如下面的代碼:
下載 (39.26 KB)
2010-12-17 14:09
在initialize方法中,我們首先設置了動畫的時間,1.5秒,然後是setFillAfter,這個方法設置成true的意思是在動畫結束後保持動畫效果,如果這裡不明白可以忽略這個,不影響大局。接下來是保存動畫對象的中點坐標,隨後會用到,最後一行的意思是線性動畫,這個的意思就是整個動畫的速率是不變的,也就是線性的。
在下面的applyTransformation方法中,我們首先取得到了變換矩陣,然後對這個矩陣進行了兩個變換操作:
matrix.preScale(interpolatedTime, interpolatedTime);
這個方法是進行縮放,傳給它的參數interpolatedTime 代表當前方法掉用時,動畫進行的一個時間點,這個值的范圍是0到1,也就是說動畫剛開始的時候傳進來的interpolatedTime為0,動畫進行中的時候,傳進來的是0到1之間的小數,動畫結束的時候傳進來的是1。
而preScale方法接受的兩個參數也是0到1,代表縮放的比例,0是最小,1是原始尺寸。
所以這個變換的意思就是,以當前動畫進行的時間為參考,逐漸放大我們的可見對象。再說白了,就是從一個點,慢慢放大,最後恢復到原始尺寸,這樣的效果。
matrix.preRotate(interpolatedTime * 360);
這個方法是旋轉動畫,和上面的一樣,根據動畫的時間,將可見對象旋轉一周,應該不難理解。
這兩個變換疊加再一起,就實現了一個這樣的效果,我們的可見對象從畫面正中央,旋轉著逐漸放大,最終充滿可見區域。
matrix.preTranslate(-halfWidth, -halfHeight);
matrix.postTranslate(halfWidth, halfHeight);
這兩行代碼意思可能就不那麼明顯了,先說如果不加這兩行代碼,會是一個什麼情況,默認情況下,動畫是以對象的左上角為起點的,如果這樣的話,動畫的效果就變成了可見對象在它的左上角開始,逐漸向右下角擴大,這顯然不是我們期望的。
所以我們前面用到的halfWidth,halfHeight就用到了,這裡保存了可見對象的一半寬度和高度,也就是中點,使用上面這兩個方法後,就會改變動畫的起始位置,動畫默認是從右下角開始擴大的,使用matrix.preTranslate(-halfWidth, -halfHeight) 就把擴散點移到了中間,同樣,動畫的起始點為左上角,使用matrix.postTranslate(halfWidth, halfHeight)就把起始點移到了中間,這樣就實現我們期望的效果了。
接下來我們要做的就是應用這個動畫,首先需要一個Activity,和一個布局文件:
下載 (51.06 KB)
2010-12-17 14:09
這裡定義了一個ListVIEw,我們將用它作為我們的動畫對象,下面是Activity的代碼:
下載 (54.55 KB)
2010-12-17 14:09
這裡通過一個按鈕來開啟動畫效果,關鍵的代碼就是這一行:
list.startAnimation(new MyAnimation());
當我們點擊按鈕後,就可以看到漂亮的效果拉~