Android Property Animation

与iOS相比Android中的动画稍逊一筹。在iOS中,View属性的改变在大多数时间会自动触发相应的动画,比如view位置的移动,view透明度的变化等,都会通过动画的形式展现出来,这样很容易带给用户很好的体验,使用户感觉到系统的行为是流畅而且连贯的;但是在Android系统中,无论是OS自带的app,还是第三方的app,很少有表现流畅的动画,界面之间的的切换往往不能给人连贯的感觉,而是瞬间内容的改变,比如Expandable List View的Group展开,完全没有动画效果,不得不说确实很不友好。

产生这种不同的原因可以说有几个方面:

首先,从系统机制来看,iOS将动画融入到了系统的各个方面,当我们对iOS中View的属性改变时,很多动画就会被自动触发;而Android如果想有动画效果,就必须由开发人员实现。

再者,在使用iOS的过程中,用户已经习惯了各种友好的动画,作为一名开发者,在开发中会自然而然的将动画考虑在内,开发者主观上就将动画作为判断app质量的一个方面;而在Android中,带有友好动画的app很少,因此大部分开发者也就没有重视动画效果(开发者果真都是懒惰的啊)。

第三,iOS中提供的动画框架对于开发者非常友好,Core Animation除了具有强大的功能,有好的接口和文档使开发者用起来得心应手;Android虽然也提供了多种不同的动画机制,但是很多看起来简单并且普遍的动画,比如ExpandableListView 中Group展开的动画,实现起来确实比较麻烦。

不过用户友好的、有意义的动画已经包含在google提出的Material Design中,下一代的Android L应该在动画方面会有很大的改善,但是app由于需要兼容不同版本的Android,想要完全改变android app在动画方面的表现还需要不短的时间。

Android中其实也提供了多种的动画机制,包括View Animation,Drawable Animation 和 Property Animation。其中,property animation提供给我们最灵活的接口,可以实现任何自定义的属性的动画,在指定了动画的时间和插值方式后,系统接口会自动在每一帧为我们产生对应的属性值,从而实现动画效果。基本的property animation流程如下:



本文利用Property Animation实现以下动画链接


与Property Animation相关的类主要为ValueAnimatorObjectAnimator,与动画类配合使用的还有Animator.AnimatorListenerValueAnimator.AnimatorUpdateListener。Animator类是我们可以使用的动画类,包含了动画所需的元素:动画时间,差值方法,属性的起始值和终止值等;对应的Listener类,则提供了我们监听动画过程的接口,本例的动画代码结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//this method will start the animation, animator is instance of ValueAnimator class
public void startAnimation()
{

this.animator = ValueAnimator.ofFloat(0, 1.0f);
this.animator.setDuration(duration);
this.animator.addUpdateListener(this);
this.animator.start();
}
//this callback will be called for every frame of the animation
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// TODO Auto-generated method stub
//here we will redrawn the viewers according to the
//aniamtion.getAnimatedValue();
}



我们指定了animation的初始值0和最终值1,在duration的时间内,系统会自动利用线性差值(默认),产生每一帧的animation对应的值,并且利用property animation框架,我们无须自己处理帧率,系统默认以每10ms的间隔来生成每一帧。

我们可以看到,很简单的代码就形成了不错的动画,可以说Android提供的接口还是不错的,作为一名Programmer,有时候主动性强一些往往可以使软件质量获得不错的提升。

期待Android L带来的改变,但是个人真的非常不喜欢Android L中的软键盘,为什么Home键要用一个’圈’???