Android動畫技術分析

Android動畫技術分析

動畫

本文將介紹Android動畫的實現技術。Android動畫實現有三種技術,逐幀動畫(Drawable Animation),補間動畫(View Animation)和屬性動畫(Property Animation)。下面列出了三者的特點:

1. 逐幀動畫 
	圖片一幀幀的播放,類似動畫片
2. 補間動畫
	將原始圖片進行一系列的變換:平移,選擇,縮放,淡入淡出。
	缺陷
        1) 只能對view進行變換,不能對自定義的非view對象進行變換,如自定義個代表點位置的Point類
        2) 不支持四種變換外的其他變換,如更換背景
        3) 只改變view的效果,不改變view的屬性,如移動到新的位置後不響應點擊事件
3. 屬性動畫
        1) 實現真正的移動
        2) 進行豐富的變換

逐幀動畫和補間動畫侷限性比較大,屬性動畫的效果更加豐富完善,接下來我們介紹屬性動畫的使用方法。

屬性動畫主要涉及到三個類,ValueAnimator,ObjectAnimator和AnimatorSet。其中ValueAnimator用於對數值進行動畫處理,ObjectAnimator用於對對象的某個屬性進行動畫處理,而AnimatorSet則用於組合動畫的實現。

ValueAnimator:實現300毫秒內從0平滑變換到1。

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        float currentValue = (float) animation.getAnimatedValue();
        Log.d("TAG", "cuurent value is " + currentValue);
    }
});
anim.start();

ObjectAnimator:實現將Textview的translationX屬性在1000毫秒內從當前值向左移100像素。

float curTranslationX = textView.getTranslationX();
ObjectAnimator moveLeftAnim = ObjectAnimator.ofFloat(textView, "translationX", 
                          curTranslationX, curTranslationX - 100);
moveLeftAnim.setDuration(1000);
moveLeftAnim.start();

AnimatorSet:組合動畫,Textview先從屏幕左側進入屏幕中心,然後旋轉360度同時先變淡後變深。

ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();

AnimatorListener:Animator監聽器,可以給動畫效果添加監聽器,處理開始動畫,結束動畫,重複動畫,取消動畫的事件

anim.addListener(new AnimatorListener() {
   @Override
   public void onAnimationStart(Animator animation) {
   }

   @Override
   public void onAnimationRepeat(Animator animation) {
   }

   @Override
   public void onAnimationEnd(Animator animation) {
   }

   @Override
   public void onAnimationCancel(Animator animation) {
   }
});

AnimatorListenerAdapter:提供了AnimatorListener四種回調函數的默認實現,可以按需重寫某個監聽事件。

anim.addListener(new AnimatorListenerAdapter() {  
}); 

使用XML編寫動畫:通過XML編寫動畫,可以實現動畫的重用。爲了區別,一般把補間動畫的xml放在res/anim文件夾下,屬性動畫xml放在res/animator文件夾下。

<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:="floatType" >
            </objectAnimator>
        </set>
    </set>
</set>

調用方式如下:

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

參考:
https://developer.android.com/guide/topics/graphics/overview.html
http://blog.csdn.net/guolin_blog/article/details/43536355

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