Android动画学习Demo(3) 关于Property Animation的TimeInpolator和TypeEvaluator

基于语义分割的实时建图:HDMap动态更新 基于语义分割的实时建图:HDMap动态更新​ ,人工智能,计算机视觉,大模型,AI,本文围绕基于语义分割的实时建图技术在HDMap动态更新中的应用展开,介绍了语义分割基础、HDMap概述、相关实时建图技术、动态更新关键技术、系统性能评估指标、实际应用案例、面临的挑战与解决方案及未来发展趋势。阐述了该技术如何利用传感器数据和语义分割算法,解决传统HDMap构建与更新的弊端,分析了其在精度、实时性、鲁棒性等方面的表现,以及在自动驾驶和智能交通中的应用,还探讨了现存问题及未来优化方向。 阅读详情

Property Animation中最重要,最基础的一个类就是ValueAnimator了。Property Animation利用ValueAnimator来跟踪记录对象属性已经变化了多长时间及当前这个时间点的值。

而在ValueAnimator中,又封装了两个类:

1)TimeInterpolator,也称插值器,是来计算当前动画运动的一个跟时间有关系的比例因子。

2)TypeEvaluator,这个就是利用TimeInterpolator计算出来的因子来算出当前动画运行到的位置。

这样讲太抽象了,我们还是先用自然语言来描述一下整个动画的过程吧。

动画的原理,其实就是一帧帧的画面顺着时间顺序,在我们眼中形成视觉残留的效果。所以在动画中,时间的概念是很重要的,只有时间的变化,才能形成动画效果。

0)动画准备开始,我们在这里设置了一个动画的时长(duration),如果不设置的话,动画的时长就是300毫秒,每个画面显示的时间是10ms。同时也设置了某个属性值在这个时间段中变化的起始值start和结束值end,意思就是说,在duration时间中,属性值要从start 变化到 end。

1)动画开始了,过了 t 时间,ValueAnimator会根据 t / duration 算出一个时间消逝的比例因子(elapsed fraction),意思就是说,现在时间到 t了,我们假设总的时间的duration就是3t吧,那就是现在已经过了1/3时间了,那这个属性值也应该要变化到1/3了。

2)动画继续,现在到了2t了,那么现在动画时间已经过了2/3了,那么这个属性值是不是已经变化到2/3了呢。

3)现在到了3t了,动画结束了,属性值就已经从start变成end值了。

那么现在问题来了,如果都是这样算的话,那动画不就一直是很匀速的了吗?是的,如果用的是LinearInterpolator的话。

TimeInterpolator

TimeInterpolator就是用来改变我们这个动画速度的这样一个类了。为什么叫插值器呢?我理解就是,本来动画踩着时间点,一步一步走的挺好的,它硬生生在中间的插了些值进去,或者抽了一些值出去,让整条路变得不好走了,前面变然变上坡了,走起来就慢了,本来过去 t 时间之后,动画的画面也应该在1/3的位置了,但是路不好走,它就走不到1/3,而可能只走了1/4了,而后面是下坡,一激动,步伐就快了许多,又赶上去了,但是不管中间的路怎么变化,时间点一到,一定是刚刚好落在最终的位置上的。
Android中提供的Interpolator主要有九个:
1)AccelerateDecelerateInterpolator:先加速再减速。
2)AccelerateInterpolator:一直加速。
3)AnticipateInterpolator:先往后一下,再嗖的一声一往无前。
4)AnticipateOvershootInterpolator:先往后一下,再一直往前超过终点,再往回收一下。
5)BounceInterpolator:最后像个小球弹几下。
6)CycleInterpolator:重复几次,感觉就是环形进度条那种,具体我还没试过。
7)DecelerateInterpolator:一直减速。
8)LinearInterpolator:线性,这个就是我们上面讲到的很均匀的了。
9)OvershootInterpolator:到了终点之后,超过一点,再往回走。有个参数可以定义,超过的力度。

这些Interpolator都是实现了TimeInterpolator接口的类,它们只需要实现一个方法:getInterpolation (float input),将这个input根据自己的需求重新计算这个比例

第一步:当到了某时间t之后,ValueAnimator会算出某个比例 fraction = t / duration,而Interpolator会接收这个比例fraction,再调用其getInterpolation方法将这个比例因子重新计算一下,返回一个新的比例因子,比如LinearInterpolator实现的方法就是什么都不变,如下:
public float getInterpolation(float input) {
    return input;
}
而 AccelerateDecelerateInterpolator 则会利用余弦函数的对称性变化计算这个比例因子,如下:
public float getInterpolation(float input) {
    return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}

如上所述,通过第一步 Interpolator 的插值,我们会得到一个比例因子,接下来就是要用到我们的TypeEvaluator了。

TypeEvaluator

第二步:TypeEvaluator会接受第一步中算出来的比例因子,然后算出当前的属性的值,将其返回给ValuaAnimator,由ValueAnimator去设置对应属性的值。
比如,我自己写了一个BezierTypeEvaluator,根据时间的变化来让一个按钮沿着贝塞尔曲线移动,如下:
class BezierEvaluator implements TypeEvaluator<PointF>{

		@Override
		public PointF evaluate(float fraction, PointF startValue,
				PointF endValue) {
			final float t = fraction;
			float oneMinusT = 1.0f - t;
			PointF point = new PointF();
			
			PointF point0 = (PointF)startValue;
			
			PointF point1 = new PointF();
			point1.set(width, 0);
			
			PointF point2 = new PointF();
			point2.set(0, height);
			
			PointF point3 = (PointF)endValue;
			
			point.x = oneMinusT * oneMinusT * oneMinusT * (point0.x) 
					+ 3 * oneMinusT * oneMinusT * t * (point1.x)
					+ 3 * oneMinusT * t * t * (point2.x)
					+ t * t * t * (point3.x);
			
			point.y = oneMinusT * oneMinusT * oneMinusT * (point0.y) 
					+ 3 * oneMinusT * oneMinusT * t * (point1.y)
					+ 3 * oneMinusT * t * t * (point2.y)
					+ t * t * t * (point3.y);			
			return point;
		}	
	}

自定义TypeEvaluator,我们必须实现其evaluate方法,目的就是计算出目前的对象对应属性的值,而它会接收三个参数,一个是上文中通过interpolator算出的比例,还有我们在创建动画时设置的起始值和结束值。

ValueAnimator.AnimatorUpdateListener

既然我们已经算出了在 t 时刻,对象的某个属性的值,那么我们要把这个值重新设置到对象中,才能够起作用啊。所以ValueAnimator也提供了一个内部的Listener接口,其只有一个方法,就是获取TypeEvaluator计算出来的值,并设置给对应的属性,比如我们Demo中的代码:
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {			
			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				PointF pointF = (PointF)animation.getAnimatedValue();
				button.setX(pointF.x);
				button.setY(pointF.y);
			}
		});

我们在这里改变Button的X坐标和Y坐标,从而改变其具体的位置。至于validate,然后引起重新绘制的过程,对于这些基本的属性,ValueAnimator已经帮我们实现了。
下面,我们看看效果图,然后再总结一下ValueAnimator的实现机制。


总的来说,就是三步:
1)将时间的消逝 t 和时长 duration 的比例fraction,传给interpolator 算出一个新的fractionNew。
2)将这个fractionNew传给TypeEvaluator,算出对应属性的当前值animatedValue。
3)根据animatedValue,在AnimatorUpdateListener中更新属性的值。

说到这里,那为什么我们上一篇里面都是用ObjectAnimator呢,为什么它不用AnimatorUpdateListener去更新值呢?
那是因为我们在创建ObjectAnimator的时候,已经将对应的属性名称propertyName都先告诉它了,ObjectAnimator会根据这个propertyName去找它的set方法,从而去更新值,而这也是为什么ObjectAnimator的对象一定要有对应属性的get/set方法的原因。这是它的方便之处,但同时也是它的局限之处。

如果一个系统定义的对象的某个属性没有对应的get/set方法的时候,那我们怎么办呢?
1)最简单的,就是去添加get/set方法,如果我们有权限的话,但很多时候我们没有。
2)给它添加一个包装类,引入一个get/set方法去设置本来的属性,来间接改变其值。
3)就是利用ValueAnimator,自己去实现其变动的逻辑了。


嗯,这一篇文章大概就是这样了,大家如果有兴趣了解Property Animation的应用的话,可以看一下

最后还是要提醒一下,Property Animation是3.0以后才支持的,如果大家想在3.0之前去应用这些属性的话,可以去下载jake wharton的nineoldandroids包,基本上都可以直接将方法套上,不过据我实验,还是有某些方法,比如 PropertyValuesHolder就会有些bug出现的。我把这个包也放在这里吧,

rtpengine 项目 阅读详情

相关推荐

centos7安装db2 version11.1

centos7安装db2 version11.1

AKA石头 1065

Android动画TimeInterpolator(插值器)和TypeEvaluator(估值器)分析

Android动画TimeInterpolator(插值器)和TypeEvaluator(估值器)简单分析。

旧路 1万+

Red Hat Enterprise Linux 9.2

安装Red Hat Enterprise Linux 9.2

zhurobert的博客 943

Android开发中属性动画(ObjectAnimator)中 插值器(Time Interpolator )详解

在 Android开发中,为了保持良好的交互体验,我们经常会用到动画来提升用户体验,而动画中属性动画用的最多。 虽然动画可以让界面看起来不是那么粗糙,但是很多时候仅仅只是匀速运动的动画可能不足以描述一些我们想呈现给用户的界面,比如模拟一个下落的小球,我们知道下落的小球并不是以匀速运动的,而是加速下落的,如果要实现这样一个效果,我们可能就需要用到 Time Interpolator 。 其实 A...

ToBeTheOnlyOne的博客 6441

青龙面板实战:用快手极速版脚本日赚XX元的核心参数解析

本文深入解析了青龙面板运行快手极速版脚本的核心参数配置,旨在帮助进阶用户提升收益稳定性。重点剖析了设备标识符(did)的获取原理、多账号Cookie的精准拼接规则,以及如何通过科学设置定时任务频率来量化并优化收益,实现细水长流的稳定收益。

weixin_29310605的博客 1075

ABAP代码检查(Code Review)

1、SLIN 扩展程序检查 也可通过(SE38工具栏->检查-扩展程序检查) 进入 2、ATC 检查 通过<SE38菜单栏-检查-ABAP测试主控室> 或事物代码SCI, 支持自定义检查变式 SCI可以配置检查变式满足特殊需求,配置对象集用于批量检查 3、通过ABAP测试主控室实现统一管理,定期检查作业和监控功能(事务代码ATC) 参考 SLIN...

u012232542的博客 6069

Android属性动画(三) TimeInterpolator(插值器)

OK,继续学习属性动画,本篇文章是属性动画系列的第三篇文章了,今天来学习一下属性动画中的TimeInterpolator,如果你对属性动画还不太熟悉,可以点击下面的链接学习一下前两篇文章的知识:《Android属性动画(一) 初识基本用法》《Android属性动画(二) ValueAnimator的实际应用 & 自定义TypeEvaluator》1.介绍先说说Interpolator,在Androi

YangLe 2313

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了如何使用FModel工具从UE5游戏的.pak文件中提取3D模型,并提供了Dumper-7的避坑指南。内容涵盖FModel工具链配置、UE5特有的unversioned properties问题解决方案、Dumper-7实战流程以及模型后处理技巧,帮助开发者高效获取游戏资产。

weixin_30872499的博客 422

Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation

Property Animation中最重要,最基础的一个类就是ValueAnimator了。Property Animation利用ValueAnimator来跟踪记录对象属性已经变化了多长时间及当前这个时间点的值。 而在ValueAnimator中,又封装了两个类: 1)TimeInterpolator,也称插值器,是来计算当前动画运动的一个跟时间有关系的比例因子。 2)TypeEval...

xiaoheliushuiya 333

scDeepCluster_pytorch代码解读与文章理解

论文:Clustering single-cell RNA-seq data with a。

qq_34179307的博客 915

VS Code下载安装与使用教程

VSCode下载安装与使用教程

weixin_46713695的博客 4万+

模拟自然动画的精髓——TimeInterpolator与TypeEvaluator

在今天的文章开始之前,有个忙想请大家帮一下,希望在京东、淘宝、当当、亚马逊购买了我的书《Android群英传:神兵利器》的朋友们,帮忙去网店上给个简短的评价,举手之劳,还是多谢大家啦~~ 本文绘图软件 www.desmos.com/calculator 通过属性动画,我们可以模拟各种属性的动画效果,但对于这些属性来说,动画变化的速率和范围,是实现一个更加『真实、自然』的动画的基础,这两件事情...

weixin_33921089的博客 227

授时中心被攻击?Windows 11 电脑时间不准?手把手教您如何更换国内稳定高速的时间服务器(时间服务器整理)

近期授时中心被攻击,时间同步重要性凸显。Windows 11 默认服务器在国内常遇网络问题。本文教你轻松修改时间服务器,选择更稳定、快速的国内优质服务器,彻底解决电脑时间不准的烦恼,让你的系统时间永远精准如一!🚀

XiaoqiangClub的博客 1086

Android动画学习Demo(3) 关于Property Animation的TimeInpolator和TypeEvaluatorhttp://blog.youkuaiyun.com/linmiansheng

原文地址:http://blog.youkuaiyun.com/linmiansheng/article/details/18763987#comments Property Animation中最重要,最基础的一个类就是ValueAnimator了。Property Animation利用ValueAnimator来跟踪记录对象属性已经变化了多长时间及当前这个时间点的值。 而在ValueAn

chenxu6 554

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android动画(三):Interpolator和Evaluator

Interpolator和Evaluator

kayyoo的博客 1531

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 时间插值器,Android属性动画基础:你是否真的了解插值器(TimeInterpolator)

插值器和估值器是我们可以改变动画更新值的两个切入点,通过自定义插值器和估值器,我们可以随意改变动画更新时值的计算方式以满足我们特定的需求。本文简单介绍属性动画插值器(TimeInterpolator)。在读此文前,如果您还不了解属性动画执行流程,建议您先看一下这篇文章,简单了解一下:Android属性动画基础之流程解析首先,看一下TimeInterpolator源码:/*** A time int...

weixin_33315608的博客 585

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android动画之Interpolator(插值器)

介绍 什么是Interpolator? 通俗易懂的说,Interpolator负责控制动画变化的速率,使得基本的动画效果能够以匀速、加速、减速、抛物线速率等各种速率变化。 动画是开发者给定开始和结束的“关键帧”,其变化的“中间帧”是有系统计算决定然后播放出来。因此,动画的每一帧都将在开始和结束之间的特定时间显示。此时动画时间被转换为时间索引,则动画时间轴上的每个点都可以转换成0...

M-Ellen的博客 5万+

android动画(一)Interpolator

一:简介 interpolator可以翻译成插值器。 Android中interpolator最底层的接口如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Fu.H.L 626

13.4 GAS与攻击

利用GAS进行攻击,伤害计算,以及效果的整合。

xcinkey的博客 1976

ABP .net core API 默认输出格式更改 去掉T

【代码】ABP .net core API 默认输出格式更改 去掉T。

weixin_43560960的博客 222

android 用贝塞尔曲线做曲线动作

先看看公式,熟悉熟悉。 如果不了解android属性动画,网上找找资料很多的。 首先我们建一个emmmm,一个实体类,保存坐标以及图片(png背景透明) 有图片,所以就用bitmap public class Point { private float x; private float y; private Bitmap mBitmap; pub...

Krisez的博客 403

4.7 技能任务 - Ability Tasks

GAS,Gameplay Ability中的核心功能节点 —— Ability Task技能任务。

xcinkey的博客 1247

Android实现 曲线路径动画

本文参考 https://www.jianshu.com/p/fea4d1f6512a 概述 近期碰到曲线动画的实现问题,写本文记录下。 动画类似“剑与远征”游戏的金币动画,动画路径如下图: 思路 通过贝塞尔曲线计算出x和y的位置(各个点的位置需要自己微调) (此部分内容参考此文:https://www.jianshu.com/p/fea4d1f6512a) 通过ValueAnimator...

许佳佳的博客 5377

android曲线位移动画,Bezier曲线在Android动画中的应用

Android动画的开发中,为了达到更加酷炫的效果,常常需要自定义运动轨迹,或者绘制花式复杂的曲线,这正是Bezier曲线大显神通的地方,本文将带你了解Bezier曲线在Android开发中的一些应用。1. Bezier曲线简介贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点...

weixin_39737240的博客 470

android曲线位移动画,Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation...

Property Animation中最重要,最基础的一个类就是ValueAnimator了。Property Animation利用ValueAnimator来跟踪记录对象属性已经变化了多长时间及当前这个时间点的值。android而在ValueAnimator中,又封装了两个类:ide1)TimeInterpolator,也称插值器,是来计算当前动画运动的一个跟时间有关系的比例因子。函数2)Ty...

weixin_36289211的博客 455

UE4-GAS-AbilityTask

AbilityTask说是:游戏可玩性只能在一帧中执行。这并不允许太多的灵活性或它自己的灵活性。为了完成随时间推移而发生的动作,或者需要在稍后的某个时间点对委派做出反应,我们使用称为能力任务的潜在动作。 GAS自带的AbilityTask: ● 角色骨骼根运动 ● 播放动画蒙太奇 ● Attribute属性更改响应 ● GE更改响应 ● input输入响应 ● 更多.. 记住同一时间运行AbilityTask上限数量是1000个。在RTS这样的游戏里面有成千上万个角色要注意一下这个问题.

存在感极其低下的弟弟 1362
上一篇: Android动画学习Demo(2) 关于Property Animation的用法及总结
下一篇: 2D平面中关于矩阵(Matrix)跟图形变换的讲解
linmiansheng
博客等级 码龄20年 507粉丝 111原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值