android那些事--屬性動畫04TypeEvaluator的使用

通過對ValueAnimatorObjectAnimator的使用,了解到在獲取動畫對象時只需要傳入起始和結束值系統(tǒng)就會自動完成值的平滑過渡,這個平滑過渡的完成就是靠TypeEvaluator這個類.還是一樣先看一下這個接口的介紹.

理論介紹

這里寫圖片描述

再看下android源碼中FloatEvaluatorIntEvaluator這兩個子類是如何實現的.

這個是FloatEvaluator

public class FloatEvaluator implements TypeEvaluator<Number> {

    /**
     * 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 * (v1 - v0)</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; should be of type <code>float</code> or
     *                   <code>Float</code>
     * @param endValue   The end value; should be of type <code>float</code> or <code>Float</code>
     * @return A linear interpolation between the start and end values, given the
     *         <code>fraction</code> parameter.
     */
     
    public Float evaluate(float fraction, Number startValue, Number endValue) {
        float startFloat = startValue.floatValue();
        return startFloat + fraction * (endValue.floatValue() - startFloat);
    }
}

這個是IntEvaluator

public class IntEvaluator implements TypeEvaluator<Integer> {

    /**
     * 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 * (v1 - v0)</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; should be of type <code>int</code> or
     *                   <code>Integer</code>
     * @param endValue   The end value; should be of type <code>int</code> or <code>Integer</code>
     * @return A linear interpolation between the start and end values, given the
     *         <code>fraction</code> parameter.
     */
     
    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        int startInt = startValue;
        return (int)(startInt + fraction * (endValue - startInt));
    }
}

可以看出這是兩個非常實在的類,哈哈.

用結束值減去初始值,算出它們之間的差值朽们,然后乘以fraction這個系數怀读,再加上初始值,那么就得到當前動畫的值了

實際使用

簡單需求:自定義一個View,在View中有一個Point對象用于管理坐標,然后在onDraw()方法中根據Point坐標進行繪制.

分析:我們已經知道數據的平滑過渡是怎么產生的了,那么如果可以對Point對象進行平滑過渡則自定義View就可以實現需要的動畫效果.

  1. 自定義一個Evaluator,完成Point平滑的過渡
  2. 在自定義View中啟動Point的動畫,得到不斷更新的Point對象
  3. 更新新的Point對象重新對View進行繪制

自定義的Evaluator類

public class PointEvaluator implements TypeEvaluator<Point> {
    @Override
    public Point evaluate(float fraction, Point startValue, Point endValue) {
        float resultX = startValue.getX() + fraction * (endValue.getX() - startValue.getX());
        float resultY = startValue.getY() + fraction * (endValue.getY() - startValue.getX());
        return new Point(resultX, resultY);
    }
}

Point對象輔助性完成

public class Point {
    private float x;
    private float y;

    public Point(float x, float y) {
        this.x = x;
        this.y = y;
    }

    public float getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public float getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

最終的自定義的View

public class MyView extends View {

    private Paint mPaint;
    private Point mPoint;

    public MyView(Context context) {
        super(context);
        init();
    }
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(Color.BLUE);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mPoint == null) {
            mPoint = new Point(50, 50);
            drawCircle(canvas);
            startAnimation();
        } else {
            drawCircle(canvas);
        }
    }
    private void drawCircle(Canvas canvas) {
        canvas.drawCircle(mPoint.getX(), mPoint.getY(), 50, mPaint);
    }

    private void startAnimation() {
        Point startPoint = new Point(50, 50);
        Point endPoint = new Point(getWidth() - 50, getHeight() - 50);

        ValueAnimator animator = ValueAnimator
                .ofObject(new PointEvaluator(), startPoint, endPoint);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {

                mPoint = ((Point) animation.getAnimatedValue());
                LogUtil.i(mPoint.getX()+"------"+mPoint.getY());
                invalidate();
            }
        });
        animator.setDuration(5000);
        animator.start();
    }
}
這里寫圖片描述
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子伙菜,更是在濱河造成了極大的恐慌获洲,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機蚊锹,發(fā)現死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稚瘾,“玉大人牡昆,你說我怎么就攤上這事√罚” “怎么了丢烘?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長些椒。 經常有香客問我播瞳,道長,這世上最難降的妖魔是什么免糕? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任赢乓,我火速辦了婚禮,結果婚禮上石窑,老公的妹妹穿的比我還像新娘牌芋。我一直安慰自己,他們只是感情好尼斧,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布姜贡。 她就那樣靜靜地躺著,像睡著了一般棺棵。 火紅的嫁衣襯著肌膚如雪楼咳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天烛恤,我揣著相機與錄音母怜,去河邊找鬼。 笑死缚柏,一個胖子當著我的面吹牛苹熏,可吹牛的內容都是我干的。 我是一名探鬼主播币喧,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼轨域,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杀餐?” 一聲冷哼從身側響起干发,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎史翘,沒想到半個月后枉长,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡琼讽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年必峰,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钻蹬。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吼蚁,死狀恐怖,靈堂內的尸體忽然破棺而出问欠,到底是詐尸還是另有隱情桂敛,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布溅潜,位于F島的核電站术唬,受9級特大地震影響,放射性物質發(fā)生泄漏滚澜。R本人自食惡果不足惜粗仓,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望设捐。 院中可真熱鬧借浊,春花似錦、人聲如沸萝招。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽槐沼。三九已至曙蒸,卻和暖如春捌治,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纽窟。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工肖油, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臂港。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓森枪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親审孽。 傳聞我的和親對象是個殘疾皇子县袱,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容

  • 前言 屬性動畫的使用 是 Android 開發(fā)中常用的知識 本文將獻上一份全面 & 詳細的屬性動畫學習指南,將詳細...
    Carson帶你學安卓閱讀 141,094評論 51 505
  • 夢想佑力,對我兒時而言式散,只是紙上談兵。那個時候搓萧,只知道說杂数,做好像并沒有那么得強烈。否則高考也不會失敗瘸洛。但自從高考失...
    z青城閱讀 1,759評論 0 0
  • 01.帶未婚工程師出走 第一回說到揍移,姐姐知道前姐夫出軌之事,決然轉身反肋!出走臨渙那伐!帶著年幼的孩子,還帶著一個人石蔗,一個...
    眉飛色舞07閱讀 356評論 10 7
  • 人只有死到臨頭养距,才覺的活著是多么好诉探,人也只有饑餓透頂,才知道有吃就是福棍厌!10來天沒吃飯吃菜是一種什么感覺肾胯,...
    左邊邢老師模型閱讀 462評論 0 1
  • 是不是只要努力就一定成功?不是耘纱,努力的人多了去了敬肚,還不是有那么多人幫別人打工∈觯靠天賦嗎艳馒?不完全是,有天賦的人多了员寇,...
    群星咖啡館閱讀 84評論 0 0