前言
最近想學(xué)的東西有點(diǎn)多...(潛臺詞:一個(gè)也沒學(xué)~哈哈)待我學(xué)成之后扶关,再出來“裝逼”...
今天整一篇“科普”向的文章,也是我自己一直傻傻分不清的內(nèi)容:插值器数冬、估值器节槐。
正文
一、插值器Interpolator
什么是插值器拐纱?
根據(jù)時(shí)間流失的百分比 計(jì)算當(dāng)前屬性改變的百分比铜异。
使用場景:實(shí)現(xiàn)非線性運(yùn)動(dòng)的動(dòng)畫效果
非線性運(yùn)動(dòng):動(dòng)畫改變的速率不是一成不變的,如加速 & 減速運(yùn)動(dòng)都屬于非線性運(yùn)動(dòng)
動(dòng)畫是我們?nèi)粘9ぷ髦胁豢扇鄙俚囊稽c(diǎn)秸架。如果我們稍加注意就發(fā)發(fā)現(xiàn)默認(rèn)的的動(dòng)畫都是線性的揍庄,而一旦需求有所變動(dòng),比如需要一個(gè)加速度效果的動(dòng)畫东抹。此時(shí)插值器的作用就出現(xiàn)了蚂子。
TimeInterpolator
TimeInterpolator接口是屬性動(dòng)畫中新增的沃测,用于兼容Interpolator接口,因此以后如果自定義插值器直接使用TimeInterpolator就可以了食茎。
TimeInterpolator接口就一個(gè)方法.其中方法中的input表示時(shí)間流逝的百分比, teturn意味著我們自己算法下的屬性改變的百分比蒂破。
public interface TimeInterpolator {
float getInterpolation(float input);
}
系統(tǒng)內(nèi)置的插值器如下:
作用 | 資源ID | 對應(yīng)的Java類 |
---|---|---|
默認(rèn)的勻速 | @android:anim/linear_interpolator | LinearInterpolator |
逐漸加速 | @android:anim/accelerate_interpolator | AccelerateInterpolator |
先加速再減速 | @android:anim/accelerate_decelerate_interpolator | AccelerateDecelerateInterpolator |
先退后再加速前進(jìn) | @android:anim/anticipate_interpolator | AnticipateInterpolator |
周期運(yùn)動(dòng) | @android:anim/cycle_interpolator | CycleInterpolator |
動(dòng)畫結(jié)束時(shí)抖動(dòng),類似皮球自由落體 | DecelerateInterpolator | |
快速完成動(dòng)畫别渔,超出再回到結(jié)束點(diǎn) | @android:anim/overshoot_interpolator | OvershootInterpolator |
開始的時(shí)候向后甩一點(diǎn)附迷,然后向前 | @android:anim/anticipate_overshoot_interpolator | AnticipateOvershootInterpolator |
自定義插值器
V4包中增加了LookupTableInterpolator、FastOutLinearInInterpolator钠糊、FastOutSlowInInterpolator挟秤、LinearOutSlowInInterpolator如果系統(tǒng)內(nèi)置的插值器不能滿足動(dòng)畫需求可以自定義插值器
自定義插值器
- 本質(zhì):根據(jù)動(dòng)畫的進(jìn)度(0%-100%)計(jì)算出當(dāng)前屬性值改變的百分比。以怎樣的變化規(guī)律實(shí)現(xiàn)可以參考系統(tǒng)內(nèi)置的插值器實(shí)現(xiàn)或者直接使用上面??提到的網(wǎng)站生成
- 具體使用:自定義插值器需要實(shí)現(xiàn)Interpolator / TimeInterpolator接口 & 復(fù)寫getInterpolation()抄伍;ttmain中EaseCubicInterpolator就是自定義插值器艘刚,相對比較簡單
//彈性插值器
public class SpringInterpolator implements TimeInterpolator {
private float factor;//參數(shù)因子
public SpringInterpolator(float factor) {
this.factor = factor;
}
// 復(fù)寫getInterpolation()
@Override
public float getInterpolation(float input) {
return (float) (Math.pow(2, -10 * input)
* Math.sin((input - factor / 4)
* (2 * Math.PI) / factor) + 1);
}
}
二、估值器Evaluator
什么是估值器:根據(jù)當(dāng)前屬性改變的百分比來計(jì)算改變后的屬性值截珍。
插值器決定屬性值隨時(shí)間變化的規(guī)律攀甚;而具體變化屬性數(shù)值則交給估值器去計(jì)算。
TypeEvaluator
一個(gè)允許自定義估值器的類接口岗喉,實(shí)現(xiàn)evaluator()
秋度,其中:
- fractio參數(shù):動(dòng)畫完成度,也就是插值器
getInterpolation()
的返回,代表當(dāng)前屬性值改變的百分比 - startValue參數(shù):動(dòng)畫的初始值
- endValue參數(shù):動(dòng)畫的結(jié)束值
public interface TypeEvaluator<T> {
public T evaluate(float fraction, T startValue, T endValue);
}
系統(tǒng)內(nèi)置的實(shí)現(xiàn)類
- IntEvaluator Int類型估值器,返回int類型的屬性改變
- FloatEvaluator Float類型估值器钱床,返回Float類型屬性改變
- ArgbEvaluator 顏色類型估值器荚斯,返回16進(jìn)制顏色值
自定義估值器
本質(zhì):根據(jù)插值器計(jì)算出當(dāng)前屬性值改變的百分比 & 初始值 & 結(jié)束值 來計(jì)算此刻屬性變化的具體值;
自定義估值器很簡單查牌,這里舉個(gè)勻速估值器的例子:動(dòng)畫進(jìn)行了50%(初始值=100事期,結(jié)束值=200 ),那么勻速插值器計(jì)算出了當(dāng)前屬性值改變的百分比是50%纸颜,那么估值器則負(fù)責(zé)計(jì)算當(dāng)前屬性值 = 100 + (200-100)x50% = 150兽泣。
這里隨便整段代碼,大家感受一下就好了胁孙。如果需求上需要自定義估值器唠倦,方法實(shí)現(xiàn)需要自己根據(jù)業(yè)務(wù)去調(diào)整。
// 實(shí)現(xiàn)TypeEvaluator接口
public class PointEvaluator implements TypeEvaluator<Point> {
// 復(fù)寫evaluate()
// 在evaluate()里寫入對象動(dòng)畫過渡的邏輯
@Override
public Point evaluate(float fraction, Point startValue, Point endValue) {
// 根據(jù)fraction來計(jì)算當(dāng)前動(dòng)畫的x和y的值
int x = (int) (startValue.x + fraction * (endValue.x - startValue.x));
int y = (int) (startValue.y + fraction * (endValue.y - startValue.y));
// 將計(jì)算后的坐標(biāo)封裝到一個(gè)新的Point對象中并返回
return new Point(x, y);
}
}
三涮较、總結(jié)
插值器和估值器關(guān)系
屬性動(dòng)畫是對屬性做動(dòng)畫稠鼻,屬性要實(shí)現(xiàn)動(dòng)畫。
- 1狂票、首先由插值器根據(jù)時(shí)間流逝的百分比計(jì)算出當(dāng)前屬性值改變的百分比枷餐,然后由插值器將這個(gè)百分比返回。這個(gè)時(shí)候插值器的工作就完成了。
比如 插值器 返回的值是0.5毛肋,很顯然我們要的不是0.5
- 插值器算好屬性變化百分比之后,由估值器根據(jù)當(dāng)前屬性改變的百分比來計(jì)算改變后的屬性值屋剑,根據(jù)這個(gè)屬性值润匙,我們就可以對View設(shè)置當(dāng)前的屬性值了。
尾聲
OK唉匾,關(guān)于插值器和估值器我想聊的就是這么多孕讳,很簡單很簡單的內(nèi)容。就當(dāng)日常查缺補(bǔ)漏巍膘,碎片時(shí)間下的一點(diǎn)點(diǎn)提升吧~~