android動畫入門

    android動畫有四種:Frame(逐幀)動畫,Tween(補間)動畫,Layout(佈局)動畫,Property(屬性)動畫。Frame動畫跟放電影一樣,依次播放靜態圖片。補間動畫就是開發只需要指定開始,結束的關鍵幀,而動畫變化的“中間幀”由系統計算並補齊。佈局動畫是在每次佈局發生變化的時候系統調用的一個預加載動畫效果,使用layout動畫可以讓佈局的變化過度看起來更自然(不常使用)。屬性動畫,這個是在Android 3.0中才引進的,它可以直接更改我們對象的屬性。本文只介紹前面兩種,後面兩種以後再寫博文單獨介紹。
    逐幀動畫
    定義如下(在anim目錄下定義一個xml文件):
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/flower1" android:duration="1000"/>
    <item android:drawable="@drawable/flower2" android:duration="1000" />
</animation-list>

    android:oneshot控制動畫是否重複播放,如果爲true就不重複。    

具體用法如下:    

1、在xml佈局中設置ImageView的背景爲動畫(anim/xx.xml) 或者用代碼:myView.setBackgroundResource(+R.anim.xx);(注意R前面的"+"號,如果沒有可能會報錯)    

2.AnimationDrawable anima = (AnimationDrawable)imageView.getBackground();    

3.anima.start(); //stop()是停止    

補間動畫    

android使用Animation抽象類來定義動畫,他有下面幾個子類:TranslateAnimation AlphaAnimation  RotateAnimation ScaleAnimation。    只要爲補間動畫定義了三個必要的信息,android就會根據開始幀,結束幀,持續時間計算出中間還需要補入多少幀,並計算所有補入幀的圖形。爲了計算動畫期間需要補入多少幀以及具體什麼時間補幀,android引入了Interpolator配合補間動畫,用來控制動畫速度,這樣就可以使動畫以勻速,變速,拋物線速度等速度進行展示。    

Interpolator是一個接口,常見的有如下幾個實現類,分別實現不同的動畫變換速度。    AccelerateInterpolator :開始較慢,後面加速。    AccelerateDecelerateInterpolator ;開始和結束較慢,中間加速。    CycleInterpolator  :變換速度按正玄曲線。    DecelerateInterpolator 開始較快,然後開始減速。    LinearInterpolator :動畫勻速變換。    一般都會使用資源文件來定義補間動畫,這些定義可以寫在資源文件中的android:interpolator屬性裏面,就像下面這樣:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">
    <scale android:fromXScale="1.0"
        android:toXScale="0.01"
        android:fromYScale="1.0"
        android:toYScale="0.01"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="true"
        android:duration="3000" />
    <alpha android:fromAlpha="1.0"
        android:toAlpha="0.05"
        android:duration="3000" />

    <rotate android:fromDegrees="0"
        android:toDegrees="1800"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="3000" />
</set>
    補間動畫的大致用法如下:
    1、在資源文件中定義補間動畫;

    2、加載動畫 Animation anim = AnimationUtils.loadAnimation(this, R.anim.xxx);

    animation.setFillAfter(true);

    或者在代碼裏面寫: 

    TranslateAnimation anim = new TranslateAnimation(curX,nextX,curY,nextY);

    anim.setDuration(time);
    3、開啓動畫 imgview.startAnimation(anim);

    自定義補間動畫
    自定義補間動畫可以實現3D的效果,需要繼承Animation並重寫applyTransformation(float interpolatedTime, Transformation t)方法,這個兩個參數說明如下:
    interpolatedTime:代表了動畫的時間進行比,值的範圍是0~1.
    Transformation:代表不同時刻對動畫的變形程度,裏面包裝了Matrix(用getMatrix()即可得到),因此可以進行旋轉,縮放,移動等操作。
    爲了對圖像或視圖進行三維空間變換還需要使用到Camera類,作用類似於Matrix,但更加強大,其提供瞭如下常用的方法:
    save():
    restore():
    getMatrix(Matrix matrix):將Camera所做的變換應用到matrix上
    camera.translate(float x, float y, float z):在三維空間進行位移變換
    rotateX(float deg):沿着x軸旋轉
    rotateY(float deg):
    rotateZ(float deg):
    applyToCanvas(Canvas canvas):將Camera所做的變換應用到canvas上
    android三維座標系統如下圖:

實現自定義補間動畫的關鍵調用如下:
1、在繼承Animation的類中
    public MyAnimation(int x,int y,int d)
    {
        cX =x;
        cY = y;
        duration = d;
    }
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(duration);
        setFillAfter(true); //設置動畫結束後效果保留
        setInterpolator(new LinearInterpolator());
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        camera.save();
        camera.translate(100 - 100 * interpolatedTime, 150 * interpolatedTime - 150, 80 - 80 * interpolatedTime);
        camera.rotateX(720 * interpolatedTime);
        camera.rotateZ(720 * interpolatedTime);
        Matrix matrix = t.getMatrix();
        camera.getMatrix(matrix);
        matrix.preTranslate(-cX, -cY);
        matrix.postTranslate(cX, cY);        
        camera.restore();
    }
2、在MainActivity中啓動該動畫即可
    listView.setAnimation(new MyAnimation(screenWidth / 2, screenHeight / 2, 7000));

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