Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 動畫系列之自定義補間動畫

Android 動畫系列之自定義補間動畫

編輯:關於Android編程

前言

上一篇寫了補間動畫的使用,由於篇幅原因,就把自定義補間動畫單獨拿出來了。這一篇繼續寫補間動畫~

在上一篇中寫到了Android提供了Animation類作為補間動畫的抽象基類,並提供了四個子類:ScaleAnimation 、TranslateAnimation、AlphaAnimation、RotateAnimation分別實現了四種基本動畫形式:縮放改變、位置改變、透明度改變和旋轉改變。
但是我們在實際項目開發中,也有可能遇到更復雜的動畫形式。比如說:三維旋轉等。那麼這個時候Android自己提供的就不能滿足我們的需求了。我們需要自己來定義一個補間動畫。

其實自定義補間動畫並不難,我們只需要繼承Animation抽象類,繼承Animation類的關鍵是要重寫該抽象類的applyTransformation(float interpolatedTime, Transformation t)方法,該方法中的兩個參數說明如下:
* interpolatedTime:代表了動畫的時間進行比。不管動畫實際的持續時間如何,當動畫播放時,該參數總是自動從0變化到1。

Transformation :代表了補間動畫在不同時刻對圖形或組件的變形程度。
從上面的介紹可以看出,實現自定義補間動畫的重點就在於重寫applyTransformation方法時根據interpolatedTime時間來動態的計算動畫對圖形的變形程度

Transformation代表了對圖片或視圖的變形程度,該對象裡封裝了一個Matrix對象,對它所包裝的Matrix對象進行旋轉、位置、傾斜等變換時,Transformation將會控制所對於的圖片或者視圖進行相應的變換。

下面以一個自定義三位旋轉的補間動畫為例,演示下自定義補間動畫的使用。

使用

首先需要介紹一個類:Camera。這個Camera並非代表手機的攝像頭,而是一個空間變換工具,作用有點類似於Matrix,但是比Matrix更加強大。
Camera提供了如下常用方法:
* getMatrix(Matrix matrix):將Camera所做的變換應用到指定的Matrix上。
* rotateX(float deg):使目標組件沿X軸旋轉。
* rotateY(float deg):使目標組件沿Y軸旋轉。
* rotateZ(float deg):使目標組件沿Z軸旋轉。
* translate(float x, float y, float z):使目標組件在三維空間裡進行位移變換。
* applyToCanvas(Canvas canvas):把Camera所做的變換應用到Canvas上。

下面的程序裡利用Camera來自定義在三維空間的動畫,該程序的自定義動畫類代碼如下:

/**
 * 作者:周游
 * 時間:2016/06/05 13:03
 * 描述:自定義補間動畫演示(三維旋轉動畫)
 */
public class CustomTweenAnimation extends Animation {

    private float mCenterX;
    private float mCenterY;
    private int mDuration;

    private Camera mCamera = new Camera();

    public CustomTweenAnimation(float x, float y, int duration) {
        this.mCenterX = x;
        this.mCenterY = y;
        this.mDuration = duration;
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        // 設置動畫持續時間
        setDuration(mDuration);
        // 設置動畫結束後效果保留
        setFillAfter(true);
        // 設置勻速變換
        setInterpolator(new LinearInterpolator());
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        mCamera.save();
        // 根據interpolatedTime時間來控制x、y、z軸上的偏移
        mCamera.translate(100.0f - 100.0f * interpolatedTime, 150.0f * interpolatedTime - 150
                , 80.0f - 80.0f * interpolatedTime);
        // 設置根據interpolatedTime時間在x軸上旋轉不同角度
        mCamera.rotateX(360 * interpolatedTime);
        // 設置根據interpolatedTime時間在y軸上旋轉不同角度
        mCamera.rotateY(360 * interpolatedTime);
        // 獲取Transformation參數的Matrix對象
        Matrix matrix = t.getMatrix();
        // 將Camera所做的變換應用到Transformation的Matrix上
        mCamera.getMatrix(matrix);
        matrix.preTranslate(-mCenterX, -mCenterY);
        matrix.postTranslate(mCenterX, mCenterY);
        mCamera.restore();
    }
}

啟動動畫:

CustomTweenAnimation customTweenAnimation = new CustomTweenAnimation(50, 50, 5000);
mTextView.startAnimation(customTweenAnimation);

運行結果:
這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved