Android之属性动画初步
中间值的计算涉及到两个方面,一个是插值器函数,也就是对应的Interpolator,表示程度随时间的变化情况,比如匀速、加速,或者先加速后减速等;另一个是中间值的计算函数,对应到TypeEvaluator,这是一个接口,里面有evaluate(float fraction, T startValue, T endValue)方法需要实现,对一般的值计算方法都是startValue + fraction * (endValue - startValue),也有特殊的比如颜色值,用一个int表示了argb,计算的时候就要先分解计算再合成,但对于每个分量的计算任然遵守上面的规则,具体可以看ArgbEvaluator的源文件。
ValueAnimator除了上面的默认值类型,还支持自定义类型Object,对于自定义类型,使用者需要实现该类型对应的TypeEvaluator,如下
发布日期:2021-06-29 14:01:26
浏览次数:2
分类:技术文章
本文共 2044 字,大约阅读时间需要 6 分钟。
Android动画系统包括View animation和Property animation,也就是视图动画和属性动画,属性动画有API限制,必须在API 11以上使用,不过有个开源项目NineOldAndroids,实现了对API 11之前版本的支持。 视图动画相对于属性动画来说简单一些,只能对view做移动、旋转、缩放等处理。举例来说做View移动的效果,视图发生时改变View在屏幕上的绘制位置,但与这个View相关的属性值却不会改变,所以会发现响应点击事件还在原来的位置上,也就是看上去变了,实际上根还在原来的地方;而属性动画改变的是实际的属性值,也就是View位置发生变化了,他的相关属性值也确实发生了改变。而且属性动画可以改变已有的属性类型,还可以改变自定义的类型,也就是说属性动画是一种广义的动画系统,用于表现一种连续变化的过程,而不仅仅是视图上的物理变化。属性动画
属性动画主要涉及Animator、TimeInterpolator、TypeEvaluaor这三个概念。如果把属性动画看作一台机器,那么Animator就是其中的发动机。它定义了属性动画最基本的操作,ValueAnimator是它的子类,实现了动画发生的具体计算过程。值得注意的是,ValueAnimator只负责动画过程中属性值得计算,具体得到这个变化的值如何处理ValueAnimator并不关心,所以需要使用者主动去获取计算好的属性值。ValueAnimator提供了三种默认支持的值类型,int、float和表示颜色的argb型。例如:
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f); animation.setDuration(1000); animation.start();要得到动画发生过程中的值需要给ValueAnimator设置一个监听器ValueAnimator.AnimatorUpdateListener。
animation.addUpdateListener(new AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animator) { Float value = (Float) animator.getAnimatedValue(); } })这样就可以得到整个动画过程产生的中间值。
中间值的计算涉及到两个方面,一个是插值器函数,也就是对应的Interpolator,表示程度随时间的变化情况,比如匀速、加速,或者先加速后减速等;另一个是中间值的计算函数,对应到TypeEvaluator,这是一个接口,里面有evaluate(float fraction, T startValue, T endValue)方法需要实现,对一般的值计算方法都是startValue + fraction * (endValue - startValue),也有特殊的比如颜色值,用一个int表示了argb,计算的时候就要先分解计算再合成,但对于每个分量的计算任然遵守上面的规则,具体可以看ArgbEvaluator的源文件。
ValueAnimator除了上面的默认值类型,还支持自定义类型Object,对于自定义类型,使用者需要实现该类型对应的TypeEvaluator,如下
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue); animation.setDuration(1000); animation.start();属性动画要对View起作用需要将每次改变的属性值设置到相应的View上,上面提到ValuAnimator只负责中间值的计算,而没有后面这个值的设置过程,为了更方便地运用,ObjectAnimator这个类诞生了,它继承了ValueAnimator,并在内部实现了设置到View属性上的逻辑。
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f); anim.setDuration(1000); anim.start();其中foo是属性值所属的一个具体对象,比如一个view,alpha是属性名称,ObjectAnimator要求必须有属性名称对应到set和get方法,如上面例子要求foo对应到类必须有setAlpha()和getAlpha()这两个方法。对于View来说设置view的alpha值会触发invalidate而重绘,因此就看到了连续的动画效果。
转载地址:https://chenyu.blog.csdn.net/article/details/50477357 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月04日 11时45分16秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PID系统稳定性与零极点的关系
2019-04-29
什么?电路板上还要喷漆?
2019-04-29
读博读废了是种什么样的体验?
2019-04-29
2020年,技术圈十大“翻车”事件!
2019-04-29
C语言状态机编程思想
2019-04-29
为什么很多电器设备都要使用单片机?
2019-04-29
在中国做操作系统研发 20 年是种什么体验?
2019-04-29
PCB走线角度为90度到底行不行?
2019-04-29
这个 17 岁的黑客天才,破解了第一代 iPhone!
2019-04-29
在STM32价格疯长下,哪些国产32可以替代?
2019-04-29
半导体芯片原厂涨价及调价声明新增了这些!
2019-04-29
为什么你学C++这么难?
2019-04-29
无人机破巡检难题,秒变电网卫士
2019-04-29
五年,我成为了一名嵌入式工程师。
2019-04-29
2020年电赛题目,命题专家们怎么看?
2019-04-29
PCB元器件摆放不可忽略的10个技巧
2019-04-29
掌握AI核心技术没有秘籍,能自己创造就是王道
2019-04-29
大学老师的月薪多少?实话实说:4万多一点……
2019-04-29
2020年电赛题目,命题专家权威解析!
2019-04-29
如何掌握“所有”的程序语言?没错,就是所有!
2019-04-29