当前位置: 首页 > news >正文

Android短文:理解插值器和估值器

前言

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

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

正文

一、插值器Interpolator

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

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

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

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

TimeInterpolator

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

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

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

系统内置的插值器如下:

作用资源ID对应的Java类
默认的匀速@android:anim/linear_interpolatorLinearInterpolator
逐渐加速@android:anim/accelerate_interpolatorAccelerateInterpolator
先加速再减速@android:anim/acceleratedecelerateinterpolatorAccelerateDecelerateInterpolator
先退后再加速前进@android:anim/anticipate_interpolatorAnticipateInterpolator
周期运动@android:anim/cycle_interpolatorCycleInterpolator
动画结束时抖动,类似皮球自由落体DecelerateInterpolator
快速完成动画,超出再回到结束点@android:anim/overshoot_interpolatorOvershootInterpolator
开始的时候向后甩一点,然后向前@android:anim/anticipateovershootinterpolatorAnticipateOvershootInterpolator

自定义插值器

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


技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

喜欢就点个「在看」吧 ▽

相关文章:

  • 用户调研:音视频方面的书籍,哪些内容才是你需要的?
  • 职场PUA到底有多可怕?
  • Fragment 的过去、现在和将来
  • 数字图像处理领域中常见的几种色彩模式
  • Android VSYNC (Choreographer)与UI刷新原理分析
  • Android 实现 图片 转 字符画 效果
  • Android 实现 视频 转 字符画效果
  • 在 iOS 上用 Shader 实现 图片 转 字符画 效果~~
  • 【每周一记-003】~~~
  • Android Canvas 绘制小黄人
  • OpenGL ES 之 LUT(滤镜基准图)
  • Android开发第5年做了一个产品,被黄晓明,angelbabay,黄渤等一线明星转发后,我.........
  • FFmpeg 获取 视频首帧 转 封面图Bitmap
  • Java 与 JNI 互传数据的那些事
  • 使用libyuv对YUV数据进行缩放,旋转,镜像,裁剪等操作
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Angular6错误 Service: No provider for Renderer2
  • CSS相对定位
  • ES2017异步函数现已正式可用
  • Java IO学习笔记一
  • JavaScript-Array类型
  • JavaScript实现分页效果
  • java小心机(3)| 浅析finalize()
  • MySQL用户中的%到底包不包括localhost?
  • Travix是如何部署应用程序到Kubernetes上的
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 一道闭包题引发的思考
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 移动端高清、多屏适配方案
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • # 安徽锐锋科技IDMS系统简介
  • #1014 : Trie树
  • (06)Hive——正则表达式
  • (10)ATF MMU转换表
  • (4)(4.6) Triducer
  • (6)STL算法之转换
  • (Ruby)Ubuntu12.04安装Rails环境
  • (动态规划)5. 最长回文子串 java解决
  • (六)vue-router+UI组件库
  • (循环依赖问题)学习spring的第九天
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)iOS字体
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)母版页和相对路径
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET命名规范和开发约定
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [<死锁专题>]
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [2669]2-2 Time类的定义
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [AX]AX2012 AIF(四):文档服务应用实例