Animation架構定義了透明度、旋轉、縮放和位移幾種常見的動畫,而且控制的是整個View,實作原理是每次繪制視圖時,View所在的ViewGroup中的drawChild()方法擷取該View的Animation的Transformation值,然後調用canvas.concat(transformToApply.getMatrix()),通過矩陣運算完成動畫幀。如果動畫沒有完成,就繼續調用invalidate()方法,啟動下次繪制來驅動動畫,進而完成整個動畫的繪制。
視圖動畫使用簡單,效果豐富,它提供了AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation四種動畫方式,并提供了AnimationSet動畫集合,混合使用多種動畫。Android系統在3.0之後推出了屬性動畫架構,相比屬性動畫,視圖動畫的一個非常大的缺陷就是不具備互動性,當某個元素發生視圖動畫後,其響應事件的位置還依然是在動畫前的地方,是以視圖動畫隻能做普通的動畫效果,避免互動的發生。但它的優點也非常明顯,即效率比較高且使用友善。
視圖動畫使用非常簡單,不僅可以通過XML檔案來描述一個動畫過程,同樣可以使用代碼來控制整個動畫過程。
透明度動畫
為視圖增加透明度的變換動畫。
AlphaAnimation aa = new AlphaAnimation(, );
aa.setDuration();
view.startAnimation(aa);
旋轉動畫
為視圖增加旋轉的變換動畫。
RotateAnimation ra = new RotateAnimation(, , , );
ra.setDuration();
view.startAnimation(ra);
其參數分别為旋轉的起始角度和旋轉中心點的坐标。可以通過設定參數來控制旋轉動畫的參考系,代碼如下所示(這裡設定旋轉參考系為自身中心點)。
RotateAnimation ra = new RotateAnimation(, , Animation.RELATIVE_TO_SELF, f,
Animation.RELATIVE_TO_SELF, f);
ra.setDuration();
view.startAnimation(ra);
位移動畫
為視圖移動時增加位移動畫。
TranslateAnimation ta = new TranslateAnimation(, , , );
ta.setDuration();
view.startAnimation(ta);
縮放動畫
為視圖的縮放增加動畫效果。
ScaleAnimation sa = new ScaleAnimation(, , , );
sa.setDuration();
view.startAnimation(sa);
與旋轉動畫一樣,縮放動畫也可以設定縮放的中心點,代碼如下所示(這裡設定縮放參考系為自身中心點)。
ScaleAnimation sa = new ScaleAnimation(, , , , Animation.RELATIVE_TO_SELF, f,
Animation.RELATIVE_TO_SELF, f);
sa.setDuration();
view.startAnimation(sa);
動畫集合
通過AnimationSet,可以将動畫以組合的形式展現出來:
AnimationSet as = new AnimationSet(true);
as.setDuration();
AlphaAnimation aa = new AlphaAnimation(, );
aa.setDuration();
as.addAnimation(aa);
TranslateAnimation ta = new TranslateAnimation(, , , );
ta.setDuration();
as.addAnimation(ta);
view.startAnimation(as);
對于動畫事件,Android也提供了對應的監聽回調,代碼如下所示:
animation.setAnimationListener(new Animation.AnimationListener() {
//動畫開始
@Override
public void onAnimationStart(Animation animation) {
}
//動畫結束
@Override
public void onAnimationEnd(Animation animation) {
}
//動畫重複
@Override
public void onAnimationRepeat(Animation animation) {
}
});