天天看點

Android動畫機制與使用技巧(一)——Android View動畫架構

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) {

            }
        });
           

繼續閱讀