视图动画(View Animation)

你能够使用视图动画系统来执行View对象上的补间动画。补间动画是用诸如开始点、结束点、尺寸、旋转以及一些其他的动画特性来计算的动画。

补间动画能够在View对象的内容上执行一个简单的变换系列(位置、尺寸、旋转和透明度)。因此,如果有一个TextView对象,就能够移动、旋转、放大或缩小文本。如果该TextView对象有一个背景图片,那么这个背景图片会跟文本一起变换。animation包提供了补间动画中所使用的所有的类。

动画指令序列定义了补间动画,这些指令既可以用XML来定义,也可以用Android代码来定义。跟布局定义一样,推荐使用XML来定义动画,因为它更加可读、可重用、并且比应编码的动画更加可插拔。在下面的例子中,我们使用XML。(要学习更多的有关在应用程序代码中定义动画的知识,请阅读AnimationSet类和其他的Animation子类。)

动画指令定义了你想要的动画变换,以及动画发生的时机和动画的播放的时长。动画变换能够是顺序的或并发的,例如:有一个从左向右移动的TextView对象的内容,然后旋转180度,或者在文本移动的同时旋转。每种变换都需要一组参数来指定所要的变换(针对尺寸变换的开始尺寸和结束尺寸、针对旋转的开始角度和结束角度等等),以及一组共同的参数(例如,开始时间和持续时长)。如果要是让几种变换同时发生,就要给它们设置相同的开始时间;如果要让它们顺序播放,就要用开始时间加上前面动画变换的时长来计算下一个动画播放的开始时间。

动画XML文件要定义在你的Android工程的res/anim/目录中。这个文件必须要有一个单独的根元素:这个元素既可以是一个单独的<alpha><scal><translate><rotate>的插值元素,也可以是拥有这些元素(包括<set>元素)组合的<set>元素。默认情况下,所有的动画指令都是并发的。要让它们顺序的发生,就必须像下面的示例所示的那样,指定startOffset属性。

下面的XML来自于APIDemo中的一个用于拉伸,然后同时旋转的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>

在左上角屏幕的坐标(在上面的这个例子中没有使用)是(0,0),并且向右下角逐渐增加。

有一些值,如pivotX,能够相对于对象自己或它的父容器来指定。对于想要的值必须使用正确的格式(50是指相对它的父容器的左上角的50%,50%则是指相对于它自己的左上角的50%)。

通过分配一个Interpolator对象,能够决定如何随着时间的推移来进行一个动画的变换。Android包括了几种Interpolator子类,它们能够指定各种速度的曲线,例如:AccelerateInterpolator会告诉系统执行一个开始慢,然后逐渐加速的变换。每种变换都会有一个属性值被应用于XML中。

保存在工程的res/anim/目录中的hyperspace_jump.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语法、可用的标签和属性的更多信息,请看“动画资源”

注意:不管你的动画如何移动或调整尺寸,拥有动画的View对象的边界都不会自动的调整来适应变化,即使动画超出了View对象的边界也不会被裁剪,但是如果动画超出了它的父容器的的边界,那么它将会被裁剪。

Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1