• 7.1 Android View动画框架" level="2">7.1 Android View动画框架
    • 7.1.1 透明度动画" level="3">7.1.1 透明度动画
    • 7.1.2 旋转动画" level="3">7.1.2 旋转动画
    • 7.1.3 位移动画" level="3">7.1.3 位移动画
    • 7.1.4 缩放动画" level="3">7.1.4 缩放动画
    • 7.1.5 动画集合" level="3">7.1.5 动画集合

    7.1 Android View动画框架" class="reference-link">7.1 Android View动画框架

    Animation框架定义了透明度、旋转、缩放和位移几种常见的动画,而且控制的是整个View,实现原理是每次绘制视图时View所在的ViewGroup中的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧。如果动画没有完成,就继续调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。

    视图动画使用简单,效果丰富,它提供了AlphaAnimation、RotateAnimation、TranslateAni- mation、ScaleAnimation四种动画方式,并提供了AnimationSet动画集合,混合使用多种动画。在Android 3.0之前,视图动画一家独大,但随着Android 3.0之后属性动画框架的推出,它的风光就大不如前了。相比属性动画,视图动画的一个非常大的缺陷就是不具备交互性,当某个元素发生视图动画后,其响应事件的位置还依然在动画前的地方,所以视图动画只能做普通的动画效果,避免交互的发生。但是它的优点也非常明显,即效率比较高且使用方便。

    视图动画使用非常简单,不仅可以通过XML文件来描述一个动画过程,同样也可以使用代码来控制整个动画过程。

    下面这个实例就列举了一些简单的视图动画使用方法。

    7.1.1 透明度动画" class="reference-link">7.1.1 透明度动画

    为视图增加透明度的变换动画。

    1. AlphaAnimation aa = new AlphaAnimation(0, 1);
    2. aa.setDuration(1000);
    3. view.startAnimation(aa);

    7.1.2 旋转动画" class="reference-link">7.1.2 旋转动画

    为视图增加旋转的变换动画。

    1. RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);
    2. ra.setDuration(1000);
    3. view.startAnimation(ra);

    其参数分别为旋转的起始角度和旋转中心点的坐标,当然,可以通过设置参数来控制旋转动画的参考系,代码如下所示(这里设置旋转参考系为自身中心点)。

    1. RotateAnimation ra = new RotateAnimation(0, 360,
    2. RotateAnimation.RELATIVE_TO_SELF, 0.5F,
    3. RotateAnimation.RELATIVE_TO_SELF, 0.5F);

    7.1.3 位移动画" class="reference-link">7.1.3 位移动画

    为视图移动时增加位移动画。

    1. TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300);
    2. ta.setDuration(1000);
    3. view.startAnimation(ta);

    7.1.4 缩放动画" class="reference-link">7.1.4 缩放动画

    为视图的缩放增加动画效果。

    1. ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2);
    2. sa.setDuration(1000);
    3. view.startAnimation(sa);

    与旋转动画一样,缩放动画也可以设置缩放的中心点,代码如下所示(这里的参数效果与前面设置的选择中心为自身中心效果相同)。

    1. ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1,
    2. Animation.RELATIVE_TO_SELF, 0.5F,
    3. Animation.RELATIVE_TO_SELF, 0.5F);
    4. sa.setDuration(1000);
    5. view.startAnimation(sa);

    7.1.5 动画集合" class="reference-link">7.1.5 动画集合

    通过AnimationSet,可以将动画以组合的形式展现出来:

    1. AnimationSet as = new AnimationSet(true);
    2. as.setDuration(1000);
    3.  
    4. AlphaAnimation aa = new AlphaAnimation(0, 1);
    5. aa.setDuration(1000);
    6. as.addAnimation(aa);
    7.  
    8. TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 200);
    9. ta.setDuration(1000);
    10. as.addAnimation(ta);
    11.  
    12. view.startAnimation(as);

    程序运行效果如图7.1所示。

    7.1 Android View动画框架 - 图1 图7.1 视图动画

    通过这个小的实例,可以非常方便地了解各种视图动画的使用方法。由于书本的限制,这里无法展示动画执行的效果,请读者实际运行一下该程序,自然能非常清楚地掌握视图动画的使用。

    对于动画事件,Android也提供了对应的监听回调,要添加相应的监听方法,代码如下所示。

    1. animation.setAnimationListener(new Animation.AnimationListener() {
    2. @Override
    3. public void onAnimationStart(Animation animation) {
    4. }
    5.  
    6. @Override
    7. public void onAnimationEnd(Animation animation) {
    8. }
    9.  
    10. @Override
    11. public void onAnimationRepeat(Animation animation) {
    12. }
    13. });

    通过这个监听回调,可以获取到动画的开始、结束和重复事件,并针对相应的事件做出不同的处理。

    通过前面的实例,可以发现视图动画的效果比较局限,而在这样一个对UI、交互需求越来越高的年代,视图动画注定会被更丰富的效果所取代。