Android View 動畫框架

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、交互需求越來越高的年的,視圖動畫註定會被更豐富的效果所取代。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章