苏州建站公司选苏州聚尚网络,网上开店指南,o2o网站建设机构,计算机专业学校全国排名Android动画系统包括View animation和Property animation#xff0c;也就是视图动画和属性动画#xff0c;属性动画有API限制#xff0c;必须在API 11以上使用#xff0c;不过有个开源项目NineOldAndroids#xff0c;实现了对API 11之前版本的支持。 视图动画相对于属…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是属性值所属的一个具体对象比如一个viewalpha是属性名称ObjectAnimator要求必须有属性名称对应到set和get方法如上面例子要求foo对应到类必须有setAlpha()和getAlpha()这两个方法。对于View来说设置view的alpha值会触发invalidate而重绘因此就看到了连续的动画效果。