插值器與估值器

2021-09-24 14:39:49 字數 3275 閱讀 4811

先來了解以下動畫的定義:

android中的動畫也遵循這個原理,只不過它的每一幀都是通過插值器與估值器動態計算出乙個矩陣,然後應用到控制項上得到的。

在計算的過程中,插值器負責計算動畫執行的百分比,估值器負責根據百分比來計算屬性值

舉個例子:

valueanimator valueanimator = valueanimator.

ofint(1

,100);

valueanimator.

setduration

(1000

);

這裡,我們以 valueanimator 舉例,做乙個值動畫,讓 1 在 1000ms 內勻速變到 100。

假設這個動畫有11幀,那麼在第一幀的時候,是保持原來的位置不動,隨著時間的流逝,在過了100ms之後,來到了第2幀,這個時候插值器就派上用場了。根據勻速執行的計算,在 100ms 的時候,動畫應該執行了 10%,所以會出現乙個時間 t 與動畫值的函式:

f(t) = t / duration * 100

記住這個函式,後面的東西都是圍繞它來的

讓我們看看線性插值器的**,來對比一下:

android.view.animation.linearinterpolator#getinterpolation

public

float

getinterpolation

(float input)

// 轉換成函式就是 f(x) = x,這個f(x) 相當於上面函式的 t / duration

// 也就是說,這裡只是計算了動畫執行的百分比,還沒有計算到動畫的具體值

這裡的 input 引數,表示的是時間的流逝百分比,它返回的是動畫執行的百分比

這與上面的 f(t) 函式的意義是一樣的,只不過 f(t) 的引數是 t, 而 getinterpolation 的引數是 t/duration。

回想一下,剛接觸函式的時候,f(x) = x 這個函式,就是一條直線,所以這個插值器叫線性插值器。

我們再來看看加速插值器的**:

android.view.animation.accelerateinterpolator#getinterpolation

public

float

getinterpolation

(float input)

else

}

這裡我們只考慮 mfactor == 1.0f 的情況,所以有這樣的乙個函式 f(x) = x * x 。

那麼這個函式是什麼意思呢?首先,輸入範圍是 【0,1】,經過函式變換之後,還是【0,1】。這個是很重要的,雖然你可以返回大於1或者小於0的值,但是大於1的會被當成最後一幀處理,小於0的作為第一幀處理。具體請看 android.animation.keyframeset#getvalue 這個方法。

再回想一下 f(x) = x * x 這個函式的影象,在【0,1】的範圍,它的斜率是從低到高的,所以表現出來的就是乙個加速行為。想不通的可以這樣想,在前面的 【0, 0.5】 的範圍內,f(x) 的值從0只增加到了0.25,而在後面的【0.5,1】的範圍內,f(x) 的值從 0.25 增加到了 1,所以是增加的速度越來越快。

那麼,這裡我們自定義乙個插值器:

public

float

getinterpolation

(float input)

猜猜,它會是乙個什麼樣的行為?其實就是乙個反向的線性插值器,比如,從 1 到 100,這個插值器會從 100 變到 1。

再看估值器,一般的我們很少會自定義估值器,除非有特殊的需要,比如計算顏色,顏色的演算法不像數值的計算,按照百分比乘一下就完事了,因為顏色涉及到 rgb 3個值,所以需要將 rgb 分開來計算。

我們還是看看自帶的幾個估值器的**。

先看簡單的 int 估值器,這個我們也能寫出來,動畫的百分比知道了,需要變化的範圍我們也知道,用百分比乘以變化範圍再加上起始值就ok了。

android.animation.intevaluator#evaluate

public integer evaluate

(float fraction, integer startvalue, integer endvalue)

}

嗯,和我們想的一摸一樣,下乙個。

看看 argb 的估值器:

android.animation.argbevaluator#evaluate

public object evaluate

(float fraction, object startvalue, object endvalue)

嗯,看上去**很多,但是我們這裡取 r 來分析,g、b 是一樣的。

// 拿到起始顏色值的16-24位

float startr =

((startint >>16)

&0xff)/

255.0f

;// 拿到終止顏色值的16-24位

float endr =

((endint >>16)

&0xff)/

255.0f

;// 將起始顏色與終止顏色轉化為線性的,便於用百分比計算

startr =

(float

) math.

pow(startr,

2.2)

;endr =

(float

) math.

pow(endr,

2.2)

;// 這裡我們就很熟悉了,與 int 是一樣的

float r = startr + fraction *

(endr - startr)

;// 再將線性的轉回 rgb

r =(

float

) math.

pow(r,

1.0/

2.2)

*255.0f

;

這樣一看,是不是條理很清晰。

總結一下:

動畫之插值器和估值器

根據時間流逝的百分比計算出當前屬性值改變的百分比 用於勻速動畫 動畫兩頭慢,中間快 動畫越來越慢 還有其他系統內建插值器 cycleinterpolator 週期運動 bounceinterpolator 最後階段彈球效果 overshootinterpolator 快速完成動畫,超出再回到結束樣式...

Android 屬性動畫跟插值器估值器

屬性動畫是android api11之後加入的。其建立過程同樣分為 動態建立跟xml靜態建立。主要有三類 valueanimator,objectanimator,animatorset。以動態建立為例,xml中建立跟tween動畫類似。唯一區別是使用animatorinflater.loadani...

動畫中的插值器和估值器

timeinterpolator 時間插值器,它的作用是根據時間流逝的百分比來計算出當前屬性值改變的百分比。系統預置的有linearinterpolator 線性插值器,勻速動畫 acceleratedecelerateinterpolator 加速減速插值器,動畫兩頭慢中間快 decelerate...