【Android開發藝術探索】Android動畫

Android的動畫能夠分爲三種:View動畫、幀動畫和屬性動畫,幀動畫也屬於View動畫的一種,只不過它和平移、旋轉等常見的View動畫在表現形式上略有不一樣而已。app

一、View動畫

  • 平移動畫:TranslateAnimationide

  • 縮放動畫:ScaleAnimation動畫

  • 旋轉動畫:RotateAnimationcode

  • 透明度動畫:AlphaAnimationorm

用XML來定義屬性動畫須要定義在res/anim目錄下。對象

二、View動畫的特殊使用場景

2.一、LayoutAnimation

LayoutAnimation使用於ViewGroup,爲ViewGroup指定一個動畫,它的子元素出場時都會具備這種動畫效果。這種效果經常使用在ListView上。圖片

2.二、Activity的切換效果

主要用到overridePendingTransition(int enterAnim,int exitAnim)這個方法,必須在startActivity(intent)或者finish()以後被調用才能生效。內存

Fragment中添加切換動畫,能夠經過FragmentTransaction中的setCustomAnimations()方法來添加切換動畫,這個切換動畫須要的是View動畫。get

三、屬性動畫

屬性動畫能夠對任意對象的屬性進行動畫而不單單是View,動畫默認時間間隔是300ms,默認幀是10ms/幀。animation

用XML來定義屬性動畫須要定義在res/animator目錄下。

對object的屬性abc屬性作動畫,若是要讓動畫生效,要同時知足兩個條件:

一、object必需要提供setAbc方法,若是動畫的時候沒有傳遞初始值,還要提供getAbc方法,由於系統要去取abc屬性的初始值。若是不知足這條,程序直接Crash。

二、object的setAbc對屬性abc所作的改變必須可以經過某種方法反映出來,好比會帶來UI的改變等。若是不知足這條,動畫無效果但不會Crash。

若是隻知足條件1,不知足條件2,能夠有3種解決方法:

  • 給對象加上get和set,若是有權限的話

  • 用一個類來包裝原始對象,間接爲其提供get和set方法

    private void performAnimate(){
    ViewWrapper wrapper = new ViewWrapper(mButton);
    ObjectAnimator.ofInt(wrapper,"width",500).setDuration(5000).start();
    }

    private static class ViewWrapper{
    private View mTarget;

    public ViewWrapper(View target){
          mTarget = target;
      }
    
      public int getWidth(){
          return mTarget.getLayoutParams().width;
      }
    
      public void setWidth(int width){
          mTarget.getLayoutParams().width = width;
          mTarget.requestLayout();
      }

    }

  • 採用ValueAnimator,監聽動畫過程,本身實現屬性的改變

四、注意事項

一、OOM問題

這個問題主要出如今幀動畫中,當圖片數量較多肯於圖片較大時就極易出現OOM。

二、內存泄露

在屬性動畫中有一類無限循環的動畫,這類動畫須要在Activity退出時及時中止,不然將致使Activity沒法釋放從而形成內存泄露,View動畫不存在此問題。

三、兼容性問題

動畫在3.0如下系統上有兼容性問題。

四、View動畫的問題

View動畫是對View的影像作動畫,並非真正地改變View的狀態,所以有時候會出現動畫完成後View沒法隱藏的現象,即setVisibility(View.GONE)失效,這時只要調用view.clearAnimation()清除View動畫便可解決此問題。

五、不要用px

六、動畫元素的交互

7硬件加速

使用動畫的過程當中,建議開啓硬件加速,這樣會提升動畫的流暢性。

相關文章
相關標籤/搜索