帥氣的屬性動畫賞析(Property Animation)

權利聲明:轉載請註明出處http://blog.csdn.net/hello_chillax/article/details/44992787

今天我們來學習Android中的一個比較好玩的動畫效果:Property Animation、でわ、はじめましょう。

一,初めに:動畫的分類
Android動畫分類:View Animation,Drawable Animation,Property Animation。

各自能實現的效果:View Animation比較簡單,能且只能實現View的基本動畫效果,如translation(移動),alpha(淡入淡出),rotate(旋轉),scale(縮放)。如果你想實現其他的特效的話,就應該考慮使用Property Animation了。

二、次に:Property Animation的簡單使用。

1.ObjectAnimator.

.提供了ofInt、ofFloat、ofObject,這幾個方法都是設置動畫作用的元素、作用的屬性、動畫開始、結束、以及中間的任意個屬性值。
下面我們通過一個Demo來細緻地講一下ObjectAnimator。
首先我們新建一個工程,在main.xml中寫一個Button。在main函數中寫下如下代碼

我們實現這樣一個動畫:點擊Button,讓Button向右下角移動一段距離:於是我們有一下四種實現方法。

//實現方法一:animation動畫只是有了動畫效果,控件本身的位置並未移動
        TranslateAnimation animationX=new TranslateAnimation(0, 500, 0, 0);
        TranslateAnimation animationY=new TranslateAnimation(0,0,0,500);
        AnimationSet set=new AnimationSet(false);
        set.addAnimation(animationX);
        set.addAnimation(animationY);
        set.setDuration(3000);
        set.setFillAfter(true);
        button.startAnimation(set);
//實現方法二:   這種方法實際上已經改變了控件的位置!!!
        ObjectAnimator.ofFloat(button, "translationX", 0F,500F).setDuration(3000).start();
        ObjectAnimator.ofFloat(button, "translationY", 0F,500F).setDuration(3000).start();
//第三種實現方法: 用PropertyValuesHolder實現動畫(比 方法二效率更高)
        PropertyValuesHolder holder1=PropertyValuesHolder.ofFloat("translationX", 0,500);
        PropertyValuesHolder holder2=PropertyValuesHolder.ofFloat("translationY", 0,500);
        ObjectAnimator.ofPropertyValuesHolder(button, holder1,holder2).setDuration(3000).start();
//第四種實現方法:用AnimatorSet實現動畫效果,自定義動畫執行順序
        ObjectAnimator animator1=ObjectAnimator.ofFloat(button, "translationX", 0F,500F);
        ObjectAnimator animator2=ObjectAnimator.ofFloat(button, "translationY", 0F,500F);
        AnimatorSet set=new AnimatorSet();
        set.playTogether(animator1,animator2);//同時播放
//      set.playSequentially(animator1,animator2);//順序播放
//      set.play(animator1).with(animator2);//同時播放
//      set.play(animator2).after(animator1);//讓animator2在animator1後面播放
        set.setDuration(3000);
        set.start();

怎麼樣,我們不僅實現了動畫,而且用簡短的代碼實現了四種方式。

下面我們來看一下對動畫事件的監聽:
我們讓Button移動結束後調用一個Toast,show出“animator over”的 字樣.
我們選用方法4來添加監聽效果,其他的類似:
添加如下代碼:

set.addListener(new AnimatorListener() {

            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                Toast.makeText(MainActivity.this, "animator over", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }
        });

當然,如果你感覺這個監聽器代碼太多,不想實現那麼多的方法,你可以用下面這個方法:

set.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
            Toast.makeText(MainActivity.this, "animator over", Toast.LENGTH_SHORT).show();
            }
        });

是不是簡潔多了。。

2.ValueAnimator
下面我們來進入另一個重要的animator。首先,讓我們先看一下它和ObjectAnimator的關係:

public final class ObjectAnimator extends ValueAnimator {
    private static final boolean DBG = false;

    // The target object on which the property exists, set in the constructor
   。。。。。。。

顯然,ObjectAnimator繼承自ValueAnimator,即,ObjectAnimator包裝了ValueAnimator;

注意:ValueAnimator本身並不能實現任何動畫,它其實是一個產生動畫變化的變化值,
下面我們來實現一個功能:讓button的text從0隨着動畫的進度增加到100的效果:添加如下代碼:

ValueAnimator animator=ValueAnimator.ofInt(0,100);
        animator.setDuration(3000);
        animator.addUpdateListener(new AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Integer integer=(Integer) animation.getAnimatedValue();
                button.setText(""+integer);
            }
        });
        animator.start();

ok,就這樣了

3.Layout Animation
過渡的類型一共有四種:

LayoutTransition.APPEARING 當一個View在ViewGroup中出現時,對此View設置的動畫

LayoutTransition.CHANGE_APPEARING 當一個View在ViewGroup中出現時,對此View對其他View位置造成影響,對其他View設置的動畫

LayoutTransition.DISAPPEARING 當一個View在ViewGroup中消失時,對此View設置的動畫

LayoutTransition.CHANGE_DISAPPEARING 當一個View在ViewGroup中消失時,對此View對其他View位置造成影響,對其他View設置的動畫

LayoutTransition.CHANGE 不是由於View出現或消失造成對其他View位置造成影響,然後對其他View設置的動畫。

注意動畫到底設置在誰身上,此View還是其他View。

最後,Demo下載地址:http://download.csdn.net/detail/nsgsbs/8525995

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章