android 動畫分析

2021-08-31 04:53:23 字數 3326 閱讀 8518

主要思路

tween 動畫通過對 view 的內容完成一系列的圖形變換 (包括平移、縮放、旋轉、改變透明度)來實現動畫效果。

具體來講,預先定義一組指令,這些指令指定了圖形變換的型別、觸發時間、持續時間。這些指令可以是以 xml 檔案方式定義,也可以是以源**方式定義。程式沿著時間線執行這些指令就可以實現動畫效果。

動畫的進度使用 interpolator 控制,android 提供了幾個 interpolator 子類,實現了不同的速度曲線,如linearinterpolator 實現了勻速效果、 accelerateinterpolator 實現了加速效果、decelerateinterpolator 實現了減速效果等。還可以定義自己的 interpolator 子類,實現拋物線、自由落體等物理效果。

動畫的執行模式有兩種:

獨佔模式,即程式主線程進入乙個迴圈,根據動畫指令不斷重新整理螢幕,直到動畫結束;

中斷模式,即有單獨乙個執行緒對時間計數,每隔一定的時間向主線程發通知,主線程接到通知後更新螢幕;

圖形變換通過仿射矩陣實現。圖形變換是圖形學中的基本知識。簡單來說就是,每種變換都是一次矩陣運算。在 android 中,canvas 類中包含當前矩陣,當呼叫 canvas.drawbitmap (bmp, x, y, paint) 繪製時,android 會先把 bmp 做一次矩陣運算,然後將運算的結果顯示在 canvas 上。這樣,程式設計人員只需不斷修改 canvas 的矩陣並重新整理螢幕,view 裡的物件就會不停的做圖形變換,動畫就形成了。

在 android 中提供了 animation 、 interpolator、transformation 等類具體實現 tween 動畫,下面逐一分析。

animation 類及其子類

animation 類及其子類是動畫的核心模組,它實現了各種動畫效果,如平移、縮放、旋轉、改變透明度等。

tween 動畫的每一楨都根據 interpolator 對 view 的內容做一次圖形變換,因此 animation 的核心工作是做變換(transformation)。

aniamtion 是基類,他記錄了動畫的通用屬性和方法。主要的屬性包括動畫持續時間、重複次數、interpolator 等。動畫裡最重要的方法是 gettransformation (currenttime, outtransformation),該方法根據當前間 (currenttime) 和 interpolator,計算當前的變換,在 outtransformation 中返回。

translateanimation、rotateanimation、alphaanimation 等是 animation 的子類,分別實現了平移、旋轉、改變 alpha 值等動畫。

不同的動畫具有不同的屬性,如 rotateanimation 的屬性是起始角度、終止角度和旋轉點座標, translateanimation 的屬性是起始位置和終止位置。alphaanimation 的屬性是起始 alpha 值和終止 alpha 值。

animation 類及其子類的類圖如下所示:

android類及其子類

interpolator 類及其子類

interpolator 定義了動畫的變化速度,可以實現勻速、正加速、負加速、無規則變加速等;

linearinerpolator、accelerateinterpolator, decelerateinterpolator, acceleratedecelerateinterpolator,cycleinterpolator 是 interpolator 的子類,分別實現了勻速、加速、減速、變速、迴圈等效果。

對於 linearinterpolator ,變化率是個常數,即 f (x) = x.

public float getinterpolation(float input)

對於 accelerateinterpolator,開始變化很慢,然後逐漸變快,即 f(x) = x*x 或者 f(x) = pow(x, 2*mfactor).

public float getinterpolation(float input) else

}對於 acceleratedecelerateinterpolator,變化率開始和結束都很慢,但中間很快,即 f(x) = (cos ((x+1)*pi) / 2.0f) + 0.5f.

public float getinterpolation(float input)

interpolator 類及其子類的類圖如下所示:

interpolator 類及其子類

transformation 類

transformation 記錄了仿射矩陣 matrix,動畫每觸發一次,會對原來的矩陣做一次運算, view 的 bitmap 與這個矩陣相乘就可實現相應的操作(旋轉、平移、縮放等)。

transformation 類封裝了矩陣和 alpha 值,它有兩個重要的成員,一是 mmatrix,二是 malpha。

transformation 類圖如下所示:

transformation 類圖

如何在 view 中實現動畫

從邏輯上講,實現動畫需要如下幾步:

view 建立動畫物件,設定動畫屬性,呼叫 invalidate 重新整理螢幕,啟動動畫;

invalidate 方法觸發了 ondraw 函式;

在 ondraw 函式中:

呼叫動畫的 gettransformation 方法,得到當前時間點的矩陣

將該矩陣設定成 canvas 的當前矩陣

呼叫 canvas 的 drawbitmap 方法,繪製螢幕。

判斷 gettransformation 的返回值,若為真,呼叫 invalidate 方法,重新整理螢幕進入下一楨;若為假,說明動畫完成。

整個流程可用乙個序列圖表示:

tween 動畫序列圖

使用樣例

下面的**是乙個 view,系統建立 view 時會呼叫 oncreate 方法,該方法定義了乙個 translateaniamtion,指定了移動起點和終點,動畫持續時間為 1s,最後呼叫 startanimation 將該動畫儲存在 view 的成員 mcurrentanianmtion 中並啟動動畫。

注意,在 view 中需要定義成員變數 mcurrentanimation 和 mtransformation ,分別記錄當前的動畫和變換。另外需要定義成員函式 startanimation 啟動動畫。

class myview extends view

}public void startanimation(animation animation)

ondraw (canvas canvas)

else

else }}

void oncreate ()

}

android 魔法泡泡動畫分析(附原始碼)

來看貼圖 原圖魔法效果 透明的有些看不清 ps之後加了背景色並放大後的效果 在螢幕中的效果 左上很小的那個,其他都是背景圖 中間很小的那個就是 先看動畫實現 explosion.xml explosion意思是爆發 android oneshot true package com.ray.bubbl...

Fragment過度動畫分析一

sliding fragment 介紹 該案例為傳統的fragment增加了個性化的補間動畫,其效果是原有fragment向螢幕內做一定的下沉,新的fragment顯示在最上層,產生層疊效果的多個fragments。首先新增乙個fragment,並設定顯示內容已做區別,案例中顯示了一張,接著設定單擊...

iOS類似探探交友滑動動畫分析

之前分析過探探交友軟體中掃瞄動畫,今天來展示分析一下探探左右滑動的動畫。看一下效果圖。額.貌似偏題了。那麼這個動畫功能效果,分為三部分。1 有左右拖動,到一定位置移除介面的動畫效果,2 有按底部按鈕,按扇形的軌跡移除介面的動畫效果,3 在對最上面的進行操作時,後面的一張會有放大效果的動畫。對於左右拖...