Animation框架定義了透明度、旋轉、縮放和位移幾種常見的動畫,而且控制的是整個View,實現原理是每次繪製視圖時View所在的ViewGroup中的drawChild函數獲取該View的Animation的Transformation值,然後調用canvas.concat(transformToApply.getMatrix()),通過矩形運算完成動畫幀。如果動畫沒有完成,就繼續調用invalidate()函數,啓動下次繪製來驅動動畫,從而完成整個動畫的繪製。
視圖動畫使用簡單,效果豐富,它提供了AlphaAnimation、RotateAnimation、TranslateAni-mation、ScaleAnimation四種動畫方式,並提供了AnimationSet動畫集合,混合使用多種動畫。在Android3.0之前,視圖動畫一家獨大,但隨着Android3.0之後的屬性動畫框架推出,它的風光就大不如前了。相比屬性動畫,視圖動畫的一個非常大的缺陷就是不具備交互性,當某個元素髮生視圖動畫後,其相應事件的位置還依然在動畫前的地方,所以視圖動畫只能做普通的動畫效果,避免交互的發生。但是它的優點也非常明顯,即效率比較高且使用方法。
下面這個實例就列舉了一些簡單的視圖動畫的使用方法。
● 透明度動畫
爲視圖增加透明度的變化動畫。
AlphaAnimation aa = new AlphaAnimation(0,1);
aa.setDuration(1000);
view.startAnimation(aa);
● 旋轉動畫
爲視圖增加旋轉的變換動畫。
RotateAnimation ra = new RotateAnimation(0,360,100,100);
ra.setDuration(1000);
view.startAnimation(ra);
其參數分別爲旋轉的起始角度和旋轉中心的座標。當然,可以通過設置參數來控制旋轉動畫的參考系,代碼如下所示(這裏設置旋轉參考系爲自身中心點)。
RotateAnimation ra = new RotateAnimation(0,360,
RotateAnimation.RELATIVE_TO_SELF,0.5F,
RotateAnimation.RELATIVE_TO_SELF,0.5F);
● 位移動畫
爲視圖移動時增加位移動畫。
TranslateAnimation ta = new TranslateAnimation(0,200,0,300);
ta.setDuration(1000);
view.startAnimation(ta);
● 縮放動畫
爲視圖的縮放增加動畫效果。
ScaleAnimation sa = new ScaleAnimation(0,2,0,2);
sa.setDuration(1000);
view.startAnimation(sa);
與旋轉動畫一樣,縮放動畫也可以設置縮放的中心點,代碼如下所示(這裏的參數效果與前面設置的的旋轉中心爲自身中心效果相同)。
ScaleAnimation sa = new ScaleAnimation(0,1,0,1,
Animation.RELATIVE_TO_SELF,0.5F,
Animation.RELATIVE_TO_SELF,0.5F);
sa.setDuration(1000);
surfaceviewtemplate.startAnimation(sa);
● 動畫集合
通過AnimationSet,可以將動畫組合的形式展示出來:
AnimationSet as = new AnimationSet(true);
as.setDuration(1000);
AlphaAnimation aa = new AlphaAnimation(0,1);
aa.setDuration(1000);
as.addAnimation(aa);
TranslateAnimation ta = new TranslateAnimation(0,100,0,200);
ta.setDuration(1000);
as.addAnimation(ta);
surfaceviewtemplate.startAnimation(as);
程序運行效果如圖(1)所示。
圖(1)視圖動畫
通過這個小實例,可以非常方便地瞭解各種視圖動畫的使用方法。
對於動畫事件,Android也提供了對應的監聽回調,要添加相應的監聽方法,代碼如下所示。
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
通過這個監聽回調,可以獲取到動畫的開始、結束、和重複事件,並針對相應的事件做出不同的處理。
通過前面的實例,可以發現視圖動畫的效果比較侷限,而在這樣一個對UI、交互需求越來越高的年的,視圖動畫註定會被更豐富的效果所取代。