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

2023-10-31 13:40

本文主要是介绍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()@Overridepublic 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()里写入对象动画过渡的逻辑@Overridepublic 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 ,拉你入技术交流群。

喜欢就点个「在看」吧 ▽

这篇关于Android短文:理解插值器和估值器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/315751

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超