插值器?估值器?傻傻分不清楚

前言

最近想学的东西有点多...(潜台词:一个也没学~哈哈)待我学成之后,再出来“装逼”...

今天整一篇“科普”向的文章,也是我自己一直傻傻分不清的内容:插值器、估值器。

正文

一、插值器Interpolator

什么是插值器?
根据时间流失的百分比 计算当前属性改变的百分比

使用场景:实现非线性运动的动画效果

非线性运动:动画改变的速率不是一成不变的,如加速 & 减速运动都属于非线性运动

动画是我们日常工作中不可缺少的一点。如果我们稍加注意就发发现默认的的动画都是线性的,而一旦需求有所变动,比如需要一个加速度效果的动画。此时插值器的作用就出现了。

TimeInterpolator

TimeInterpolator接口是属性动画中新增的,用于兼容Interpolator接口,因此以后如果自定义插值器直接使用TimeInterpolator就可以了。

TimeInterpolator接口就一个方法.其中方法中的input表示时间流逝的百分比, teturn意味着我们自己算法下的属性改变的百分比

public interface TimeInterpolator {
    float getInterpolation(float input);
}

系统内置的插值器如下:

作用 资源ID 对应的Java类
默认的匀速 @android:anim/linear_interpolator LinearInterpolator
逐渐加速 @android:anim/accelerate_interpolator AccelerateInterpolator
先加速再减速 @android:anim/accelerate_decelerate_interpolator AccelerateDecelerateInterpolator
先退后再加速前进 @android:anim/anticipate_interpolator AnticipateInterpolator
周期运动 @android:anim/cycle_interpolator CycleInterpolator
动画结束时抖动,类似皮球自由落体 DecelerateInterpolator
快速完成动画,超出再回到结束点 @android:anim/overshoot_interpolator OvershootInterpolator
开始的时候向后甩一点,然后向前 @android:anim/anticipate_overshoot_interpolator AnticipateOvershootInterpolator

自定义插值器

V4包中增加了LookupTableInterpolator、FastOutLinearInInterpolator、FastOutSlowInInterpolator、LinearOutSlowInInterpolator如果系统内置的插值器不能满足动画需求可以自定义插值器
自定义插值器

  • 本质:根据动画的进度(0%-100%)计算出当前属性值改变的百分比。以怎样的变化规律实现可以参考系统内置的插值器实现或者直接使用上面👆提到的网站生成
  • 具体使用:自定义插值器需要实现Interpolator / TimeInterpolator接口 & 复写getInterpolation();ttmain中EaseCubicInterpolator就是自定义插值器,相对比较简单
//弹性插值器
public class SpringInterpolator implements TimeInterpolator {
    private float factor;//参数因子
    public SpringInterpolator(float factor) {
        this.factor = factor;
    }
    // 复写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

什么是估值器:根据当前属性改变的百分比来计算改变后的属性值

插值器决定属性值随时间变化的规律;而具体变化属性数值则交给估值器去计算。

TypeEvaluator

一个允许自定义估值器的类接口,实现evaluator(),其中:

  • fractio参数:动画完成度,也就是插值器getInterpolation()的返回,代表当前属性值改变的百分比
  • startValue参数:动画的初始值
  • endValue参数:动画的结束值
public interface TypeEvaluator<T> {
    public T evaluate(float fraction, T startValue, T endValue);
}

系统内置的实现类

  • IntEvaluator Int类型估值器,返回int类型的属性改变
  • FloatEvaluator Float类型估值器,返回Float类型属性改变
  • ArgbEvaluator 颜色类型估值器,返回16进制颜色值

自定义估值器

本质:根据插值器计算出当前属性值改变的百分比 & 初始值 & 结束值 来计算此刻属性变化的具体值

自定义估值器很简单,这里举个匀速估值器的例子:动画进行了50%(初始值=100,结束值=200 ),那么匀速插值器计算出了当前属性值改变的百分比是50%,那么估值器则负责计算当前属性值 = 100 + (200-100)x50% = 150。

这里随便整段代码,大家感受一下就好了。如果需求上需要自定义估值器,方法实现需要自己根据业务去调整。

// 实现TypeEvaluator接口
public class PointEvaluator implements TypeEvaluator<Point> {
    // 复写evaluate()
    // 在evaluate()里写入对象动画过渡的逻辑
    @Override
    public Point evaluate(float fraction, Point startValue, Point endValue) {
        // 根据fraction来计算当前动画的x和y的值
        int x = (int) (startValue.x + fraction * (endValue.x - startValue.x));
        int y = (int) (startValue.y + fraction * (endValue.y - startValue.y));
        // 将计算后的坐标封装到一个新的Point对象中并返回
        return new Point(x, y);
    }
}

三、总结

插值器和估值器关系

属性动画是对属性做动画,属性要实现动画。

  • 1、首先由插值器根据时间流逝的百分比计算出当前属性值改变的百分比,然后由插值器将这个百分比返回。这个时候插值器的工作就完成了。

比如 插值器 返回的值是0.5,很显然我们要的不是0.5

  • 插值器算好属性变化百分比之后,由估值器根据当前属性改变的百分比来计算改变后的属性值,根据这个属性值,我们就可以对View设置当前的属性值了。

尾声

OK,关于插值器和估值器我想聊的就是这么多,很简单很简单的内容。就当日常查缺补漏,碎片时间下的一点点提升吧~~

我是一个应届生,最近和朋友们维护了一个公众号,内容是我们在从应届生过渡到开发这一路所踩过的坑,以及我们一步步学习的记录,如果感兴趣的朋友可以关注一下,一同加油~

个人公众号:咸鱼正翻身
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容