Android之属性动画初步
发布日期: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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android之DrawText详解
下一篇:Android 之View绘图原理总结

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月04日 11时45分16秒