Android屬性動畫基礎(chǔ):TypeEvaluator

??本文簡單介紹一下TypeEvaluator裙戏,來了解一下它的用途乘凸。TypeEvaluator是一個接口,我們可以自定義該接口實例累榜,并通過ValueAnimator的setEvaluator(TypeEvaluator)方法來控制動畫的更新計算表達式营勤。如果您只是想利用屬性動畫操縱單一數(shù)值變化(如控制View的X或Y方向旋轉(zhuǎn)、X或Y平移等壹罚,或僅僅是操縱與對象無關(guān)的數(shù)值)葛作,那么你完全不必關(guān)心TypeEvaluator,通過插值器控制就好了猖凛,殺雞焉用牛刀啊赂蠢,牙簽足以。但是如果您要同時操縱對象的多個屬性怎么辦辨泳,比如您想模擬小球運動虱岂,要控制X和Y兩個方向的坐標(biāo),而且由于兩個方向的加速度不一樣導(dǎo)致X和Y坐標(biāo)的計算方式也不一樣菠红,難道您想通過動畫組合的方式來分別處理X第岖、Y嗎,您當(dāng)然可以這么做试溯,不過并不好蔑滓,此外如果還要求您記錄運動軌跡,這種X耍共、Y組合動畫就無能為力了烫饼。這種相對復(fù)雜的場景,TypeEvaluator就可以大展身手了试读,好了杠纵,先看一下源碼及api介紹

/**
 * Interface for use with the {@link ValueAnimator#setEvaluator(TypeEvaluator)} function. Evaluators
 * allow developers to create animations on arbitrary property types, by allowing them to supply
 * custom evaluators for types that are not automatically understood and used by the animation
 * system.
 *
 * @see ValueAnimator#setEvaluator(TypeEvaluator)
 */
public interface TypeEvaluator<T> {

    /**
     * This function returns the result of linearly interpolating the start and end values, with
     * <code>fraction</code> representing the proportion between the start and end values. The
     * calculation is a simple parametric calculation: <code>result = x0 + t * (x1 - x0)</code>,
     * where <code>x0</code> is <code>startValue</code>, <code>x1</code> is <code>endValue</code>,
     * and <code>t</code> is <code>fraction</code>.
     *
     * @param fraction   The fraction from the starting to the ending values
     * @param startValue The start value.
     * @param endValue   The end value.
     * @return A linear interpolation between the start and end values, given the
     *         <code>fraction</code> parameter.
     */
    public T evaluate(float fraction, T startValue, T endValue);
}

??這個接口代碼看起來是相當(dāng)簡單,就一個方法钩骇,通過接口描述比藻,我們可以知道铝量,TypeEvaluator能夠支持我們創(chuàng)建支持任意屬性類型的動畫。如果您有看過谷歌對屬性動畫的描述银亲,就該知道慢叨,屬性動畫能夠操縱任類型意屬性,如果操縱的是對象务蝠,系統(tǒng)只內(nèi)置了數(shù)值型計算方式拍谐,那么對象屬性如何更新計算?TypeEvaluator就是解決這個問題的馏段,當(dāng)然轩拨,您也可以使用TypeEvaluator來計算基礎(chǔ)數(shù)值型數(shù)據(jù),這不是不可以的院喜。evaluate方法就是更新計算方法亡蓉,通過該方法計算出來的屬性值來更新動畫,參數(shù)fraction是插值器getInterpolation方法計算出來的時間因子(請參考Android屬性動畫基礎(chǔ):你是否真的了解插值器(TimeInterpolator))喷舀;startValue和endValue分別表示每個動畫區(qū)間段的起始值和終點值砍濒。
??以我們之前說的模擬小球運動軌跡為示例,寫段簡單的使用方法(下一篇文章會給出完整示例及另一種模擬方式)

 // 描述小球運動軌跡坐標(biāo)
    private class Point {
        private float pointX;
        private float pointY;

        private Point(float pointX, float pointY) {
            this.pointX = pointX;
            this.pointY = pointY;
        }

        private float getPointX() {
            return pointX;
        }

        private float getPointY() {
            return pointY;
        }
    }

 // 模擬平拋運動軌跡的估值器
    private class MyTypeEvaluator implements TypeEvaluator<Point> {
        @Override
        public Point evaluate(float fraction, Point startValue, Point endValue) {
            float pointX = fraction * endValue.getPointX() + startValue.getPointX();
            float pointY = fraction * fraction * endValue.getPointY() + startValue.getPointY();
            Point point  = new Point(pointX, pointY);
            // ToDo 您可以在此記錄或做相應(yīng)操作
            return point硫麻;
        }
    }

    ValueAnimator animator = ValueAnimator.ofObject(new MyTypeEvaluator(), new Point(0, 0), new Point(300, 600)).setDuration(1000);
    animator.setInterpolator(new LinearInterpolator());
    animator .addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Point point = (Point) animation.getAnimatedValue();
               // ToDo 您也可以在此記錄或做相應(yīng)操作
            }
        });
    animator.start();

??這篇文章比較簡單爸邢,就到這,對于復(fù)雜屬性動畫庶香,請不要忘記TypeEvaluator

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甲棍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赶掖,更是在濱河造成了極大的恐慌感猛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奢赂,死亡現(xiàn)場離奇詭異陪白,居然都是意外死亡,警方通過查閱死者的電腦和手機膳灶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門咱士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轧钓,你說我怎么就攤上這事序厉。” “怎么了毕箍?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵弛房,是天一觀的道長。 經(jīng)常有香客問我而柑,道長文捶,這世上最難降的妖魔是什么荷逞? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮粹排,結(jié)果婚禮上种远,老公的妹妹穿的比我還像新娘。我一直安慰自己顽耳,他們只是感情好坠敷,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斧抱,像睡著了一般常拓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辉浦,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音茎辐,去河邊找鬼宪郊。 笑死,一個胖子當(dāng)著我的面吹牛拖陆,可吹牛的內(nèi)容都是我干的弛槐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼依啰,長吁一口氣:“原來是場噩夢啊……” “哼乎串!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起速警,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤叹誉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闷旧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體长豁,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年忙灼,在試婚紗的時候發(fā)現(xiàn)自己被綠了匠襟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡该园,死狀恐怖酸舍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情里初,我是刑警寧澤啃勉,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站青瀑,受9級特大地震影響璧亮,放射性物質(zhì)發(fā)生泄漏萧诫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一枝嘶、第九天 我趴在偏房一處隱蔽的房頂上張望帘饶。 院中可真熱鬧,春花似錦群扶、人聲如沸及刻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缴饭。三九已至,卻和暖如春骆莹,著一層夾襖步出監(jiān)牢的瞬間颗搂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工幕垦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丢氢,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓先改,卻偏偏與公主長得像疚察,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仇奶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345