Android之属性动画初步

本文探讨了Android属性动画的基本概念,重点介绍了ValueAnimator如何支持不同类型的值,包括int、float和argb颜色。通过对这些基础知识的了解,开发者可以更好地掌握Android动效的实现。
摘要由CSDN通过智能技术生成
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而重绘,因此就看到了连续的动画效果。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值