1. 程式人生 > >Android屬性動畫總結

Android屬性動畫總結

Android SDK提供的動畫方面的API主要存在於兩個包裡面,分別是android.view.animation和andorid.animation; 其中android.view.animation包是從API1開始就已經有了,主要是提供給補間動畫(Tween)使用的API,補間動畫的使用方式如下:

Animation rotateAnimation = 
                AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
        //播放動畫完成之後,保留動畫最後的狀態
        rotateAnimation.setFillAfter(true);
        //播放動畫
        btnRotate.startAnimation(rotateAnimation);

逐幀動畫和補間動畫在本文不過多講解,逐幀動畫主要使用xml配置,AnimationDrawable介面去啟動動畫;

另外一個包android.animation中很多都是API11(3.0)開始加進來的,即所謂的屬性動畫;新增的屬性動畫原因在於原來的補間動畫只能實現平移,縮放,旋轉,淡入淡出等四種針對view的動畫,而且補間動畫沒有改變view的position,因此有些點選事件也無法獲取。屬性動畫的提出不但解決了以上問題,而且提供了更加豐富的動畫效果,不僅可以對view進行屬性值的改變,還可以對任意物件進行屬性值的改變,例如自定義View中將有個Point物件,需要將位置從1移動到100,按照原來補間動畫是沒辦法實現。

屬性動畫

屬性動畫最重要的幾個東西,Animator屬性動畫的基類,ValueAnimator和ObjectAnimator都可以去實現動畫,相比於ValueAnimator,ObjectAnimator可能才是我們最常接觸到的類,因為ValueAnimator只不過是對值進行了一個平滑的動畫過渡,但我們實際使用到這種功能的場景好像並不多。而ObjectAnimator則就不同了,它是可以直接對任意物件的任意屬性進行動畫操作的,比如說View的alpha屬性。

ValueAnimator基本使用方法如下:

ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);
anim.setDuration(5000);
anim.start();

ObjectAnimator基本使用方法如下:

ObjectAnimator anim = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
anim.setDuration(500);
anim.start();

 監聽類 AnimatorListener,  如果想只實現某個回撥則可以用AnimatorListenerAdapter

anim.addListener(new AnimatorListenerAdapter() {
    
})

插值器(Interpolator)和估值器(Evaluator)

插值器是動畫過度的速度,常見的插值器有AccelerateInterpolator,DecelerateInterpolator,BounceInterpolator;估值器返回的是當前物件過度的值。自定義的估值器實現TypeEvaluator介面即可,自定義插值器需要實現 TimeInterpolator介面,其中getInterpolation(float input) 返回的就是fraction值。說到這個input的值,我覺得有不少朋友可能會聯想到fraction值。那麼這裡的input和fraction有什麼關係或者區別呢?答案很簡單,input的值決定了fraction的值。input的值是由系統經過計算後傳入到getInterpolation()方法中的,然後我們可以自己實現getInterpolation()方法中的演算法,根據input的值來計算出一個返回值,而這個返回值就是fraction了。

ViewPropertyAnimator

屬性動畫另一種寫法textView.animate().x(500).y(500).setDuration(500).setIntepolater(new BounceIntepolater);