你可以使用视图动画系统(View Animation)去处理渐变动画(tweened animation,也称补间动画)。补间动画常用根据一些动画信息(如起始点、终点、大小、旋转和其他一些常见的动画因素)计算动画。
补间动画可以在一个View对象上处理一系列简单的变换(位置,大小,旋转和透明度)。因此,如果你有一个TextView对象,你可以移动,旋转,伸缩其字体。如果它还包含一个背景图像,该图像也会随着字体一起变动。animation package包提供了使用补间动画的所有类。
一系列动画指令可以通过XML或Android代码来定义补间动画。正如定义布局文件一样,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>
屏幕坐标(上例未使用)是(0,0),位于屏幕左上角,坐标值随着向下或向右移动而增加。
有些值,比如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的边界,则会被裁减。