Android的動畫能夠分爲三種:View動畫、幀動畫和屬性動畫,幀動畫也屬於View動畫的一種,只不過它和平移、旋轉等常見的View動畫在表現形式上略有不一樣而已。app
平移動畫:TranslateAnimationide
縮放動畫:ScaleAnimation動畫
旋轉動畫:RotateAnimationcode
透明度動畫:AlphaAnimationorm
用XML來定義屬性動畫須要定義在res/anim目錄下。對象
LayoutAnimation使用於ViewGroup,爲ViewGroup指定一個動畫,它的子元素出場時都會具備這種動畫效果。這種效果經常使用在ListView上。圖片
主要用到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硬件加速
使用動畫的過程當中,建議開啓硬件加速,這樣會提升動畫的流暢性。