Android视图动画(View Animation)

樊宏义
2023-12-01

    你可以使用视图动画系统(View Animation)去处理渐变动画(tweened animation,也称补间动画)。补间动画常用根据一些动画信息(如起始点、终点、大小、旋转和其他一些常见的动画因素)计算动画。

    补间动画可以在一个View对象上处理一系列简单的变换(位置,大小,旋转和透明度)。因此,如果你有一个TextView对象,你可以移动,旋转,伸缩其字体。如果它还包含一个背景图像,该图像也会随着字体一起变动。animation package包提供了使用补间动画的所有类。

     一系列动画指令可以通过XMLAndroid代码来定义补间动画。正如定义布局文件一样,XML文件也是我们所推荐的,因为它比硬编码更具有易读性、复用性和交换性。在下面的例子中,我们使用了XML文件。(为了更多的了解动画在应用程序代码中的定义,而不是在XML中,请查阅AnimationSet类和其他Animation子类)

    动画指定定义了你想要的转换以及转换时间。转换可以顺序进行也可以同时进行——比如将TextView的内容从左边移到右边,然后翻转180度;你也可以让其移动和翻转同时进行。每一个变换都指定了一套变换参数(为大小变化指定开始大小和结束大小,为翻转变换指定了开始角度和结束角度等)和一套常用参数(开始时间,周期等)。为了让许多变换同时发生,赋予他们相同的开始时间(start time);为了让变换顺序进行,根据各变换的周期计算各自的开始时间。

    动画的XML文件保存在Android工程的res/anim/文件夹下。XML文件必须有一个单一的根元素:<alpha><scale><translate><rotate>,插值器(interpolator)元素,或者包含一个元素组的<set>元素(其中<set>元素内部又可以包含<set>元素)。默认的,所有的动画变换过程都是同时进行的。为了让它们顺序进行,必须指定startOffset属性,如下面例子。

下面例子用于使一个View对象先缩放,再同时缩放和旋转。

<set android:shareInterpolator="false">    

    <scale      

        android:interpolator="@android:anim/accelerate_decelerate_interpolator"   

        android:fromXScale="1.0"        

        android:toXScale="1.4"        

        android:fromYScale="1.0"        

        android:toYScale="0.6"        

        android:pivotX="50%"        

        android:pivotY="50%"        

        android:fillAfter="false"        

        android:duration="700" />    

    <set android:interpolator= "@android:anim/decelerate_interpolator">    

          <scale           

               android:fromXScale="1.4"      

               android:toXScale="0.0"          

               android:fromYScale="0.6"           

               android:toYScale="0.0"          

               android:pivotX="50%"           

               android:pivotY="50%"          

               android:startOffset="700"           

               android:duration="400"           

               android:fillBefore="false" />      

          <rotate           

               android:fromDegrees="0"          

               android:toDegrees="-45"           

               android:toYScale="0.0"          

               android:pivotX="50%"           

               android:pivotY="50%"           

               android:startOffset="700"      

               android:duration="400" />    

      </set>

</set>

    屏幕坐标(上例未使用)(00),位于屏幕左上角,坐标值随着向下或向右移动而增加。

    有些值,比如prvotX,既可以指定为相对于对象本身,也可指定为相对于其父类而言。要确定你想要的格式(“50”表示相对于父类的50%”50%”表示相对于自身的”50%”)

    你可以通过设定插值器(Interpolator)来决定变换过程怎么随着时间而变化。Android包括多种Interpolator子类用来指定不同的时间曲线:比如,AccelerateInterpolator表示一个变换加速度进行(先慢后快)。每一种插值器都有一个属性值,可用于XML中。

    将上面的XML命名为hyperspace_jump.xml保存在工程的res/anim/文件夹中,下面代码将引用该XML到一个ImageView对象上。

         ImageView spaceshipImage =  (ImageView) findViewById(R.id.spaceshipImage);

        Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation( this, R.anim.hyperspace_jump);

        spaceshipImage.startAnimation(hyperspaceJumpAnimation);

    作为startAnimation()的替代品,你也可以使用Animation.setStartTime()为你的动画设定一个开始时间,然后使用View.setAnimation()将该动画与你的View联系起来。

关于XML中语法、标记和属性的更多信息,可以查看Animation Resources

注意:不管动画怎样移动或调整大小,对应该动画视图的边界都不会自动地去调整适应。尽管如此,动画依然会超过View边界进行绘制,而不会被裁减。但是,如果动画显示超过了父View的边界,则会被裁减。

 类似资料: