nineoldandroids的使用

nineoldandroids的使用

在學習nineoldandroids的使用之前,我們先來了解Android其他幾種實現動畫效果的方式:

  • 逐幀動畫: 類似放幻燈片,不斷循環切換(播放)圖片資源實現視覺上的動畫效果
  • 補間動畫:對view進行一系列的動畫操作,包括淡入淡出、縮放、平移、旋轉四種

逐幀動畫

1.定義好動畫文件:(oneshot:只有一次?)

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >
        <item
        android:drawable="@drawable/main_plant_1"
        android:duration="100"/>
                <item
        android:drawable="@drawable/main_plant_2"
        android:duration="100"/>
</animation-list>

2.setImageRescource傳入動畫資源,再可通過(AnimationDrawable)~.getBackground()或是… .getDrawable()方法得到AnimationDrawable對象,調用start()即可開始動畫了。

補間動畫

補間動畫顧名思義就是在確定 兩個幀間填補所需的過度幀,所以只需要確定開始幀與結束幀的狀態就OK了。補間動畫有四種:放大縮小、位移、旋轉、漸變。也就是——

AlphaAnimation:透明度(alpha)漸變效果,對應<alpha/>標籤。
TranslateAnimation:位移漸變,需要指定移動點的開始和結束座標,對應<translate/>標籤。
ScaleAnimation:縮放漸變,可以指定縮放的參考點,對應<scale/>標籤。
RotateAnimation:旋轉漸變,可以指定旋轉的參考點,對應<rotate/>標籤。

當然還有個<set/>標籤可以來組合使用這幾種動畫,定義好動畫(其實都是這兩個from,to而已),然後使用也十分簡單,如下:

Animation animation = AnimationUtils.loadAnimation(this,  
                R.anim.translate_demo);  
animation.setRepeatCount(Animation.INFINITE);//循環顯示  
imageView.startAnimation(animation);

但是,要實現比較複雜一些的動畫,比如我們要一個可以自動展開的扇形動畫,顯然依靠這兩種動畫方式是不夠的。幸運的是Android自從3.0開始引入了一種全新的動畫模式,這也就是屬性動畫了。屬性動畫也是如此,顧名思義也就是動態改變其屬性(這裏不僅僅只對view),實現動畫,這個動態改變的過程類似補間動畫,當然我們也一加入一些插值器影響這個動態設置的過程,實現更加絢麗的效果。

接下來真正進入到主題,nineoldandroids是一個兼容3.0以前的開源的動畫框架,在3.0以前我們也能以此來使用屬性動畫來實現複雜的動畫效果。

ValueAnimatior

屬性動畫的運行機制是通過不斷地對值進行操作來實現的,而初始值和結束值之間的動畫過渡就是由ValueAnimator這個類來負責計算的。

ofInt()
ofFloat()
ofObject()

ObjectAnimatior

ObjectAnimator.ofFloat(view, 屬性(具備getter&setter,並能具備變化的動作,比如刷新界面的動作),起始值,終點值)

AnimatorSet

組合動畫
before(Animator anim)
after(Animator anim)
after(long delay)
with(Animator anim)
play()

XML編寫動畫

<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:ordering="sequentially" >  

    <objectAnimator  
        android:duration="2000"  
        android:propertyName="translationX"  
        android:valueFrom="-500"  
        android:valueTo="0"  
        android:valueType="floatType" >  
    </objectAnimator>  

    <set android:ordering="together" >  
        <objectAnimator  
            android:duration="3000"  
            android:propertyName="rotation"  
            android:valueFrom="0"  
            android:valueTo="360"  
            android:valueType="floatType" >  
        </objectAnimator>  

        <set android:ordering="sequentially" >  
            <objectAnimator  
                android:duration="1500"  
                android:propertyName="alpha"  
                android:valueFrom="1"  
                android:valueTo="0"  
                android:valueType="floatType" >  
            </objectAnimator>  
            <objectAnimator  
                android:duration="1500"  
                android:propertyName="alpha"  
                android:valueFrom="0"  
                android:valueTo="1"  
                android:valueType="floatType" >  
            </objectAnimator>  
        </set>  
    </set>  

</set> 

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
animator.setTarget(view);  
animator.start(); 

屬性動畫的使用最重要的是理解動態設置屬性這一過程,我們可以自己定義一個屬性然後通過setter,getter方法實現這一動態過程,這在一些自定義View的創建中可以實現你所需要的動畫過程。
(睡覺去……)

下面是一個例子:
自定義實現一個可以動態展開的扇形ImageView:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
        if (null == rectF)
            rectF = new RectF(0 - (int)(canvas.getWidth() * 0.414), 0 - (int) (canvas.getHeight() * 0.414),
                    (int) (canvas.getWidth() * 1.414), (int) (canvas.getHeight() * 1.414));
        paint.reset();
        paint.setColor(Color.parseColor("#7f000000"));
        canvas.drawArc(rectF, 0, 360 - angle, true, paint);
    }

    public int getAngle() {
        return angle;
    }

    public void setAngle(int angle) {
        this.angle = angle;
        invalidate();
    }

動畫調用:

 ValueAnimator angleAnim = ObjectAnimator.ofInt(view, "angle", fromAngle, toAngle);
        angleAnim.setDuration(1000);
//        angleAnim.setEvaluator(new ArgbEvaluator());
        angleAnim.start();

通過”angle”找到getter/setter方法,實現動態設置實現動畫效果。

該對象的屬性必須有get和set方法(方法的格式必須是駝峯式),方法格式爲set(),因爲ObjectAnimator會自動更新屬性,它必須能夠訪問到屬性的setter方法,比如屬性名爲foo,你就需要一個setFoo()方法,如果setter方法不存在,你有三種選擇:
a.添加setter方法
b.使用包裝類。通過該包裝類通過一個有效的setter方法獲取或者改變屬性值的方法,然後應用於原始對象。
c.使用ValueAnimator代替。

也就是說,要具有能讓ObjectAnimator找到的setter 和 getter方法,然後能夠一一對應並且能夠通過刷新界面等方式產生出動畫效果!

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