您可以使用视图动画系统在视图上执行补间动画。 Tween动画使用诸如动画的起始点,终点,大小,旋转以及其他常见方面的信息来计算动画。
补间动画可以对View对象的内容执行一系列简单的转换(位置,大小,旋转和透明度)。 所以,如果你有一个TextView对象,你可以移动,旋转,增长或收缩文本。 如果它有一个背景图像,背景图像将与文本一起变换。 动画包提供了补间动画中使用的所有类。
一系列动画指令定义了由XML或Android代码定义的补间动画。 与定义布局一样,建议使用XML文件,因为它比硬编码动画更可读,可重用和可交换。 在下面的例子中,我们使用XML。 (要了解有关在应用程序代码中定义动画的更多信息,而不是XML,请参阅AnimationSet类和其他Animation子类。)
动画指令定义您想要发生的转换,何时发生,以及应用所需的时间。 转换可以是顺序的或同时的 - 例如,您可以使TextView的内容从左到右移动,然后旋转180度,或者您可以同时移动文本并旋转。 每个变换都需要一组特定于该变换的参数(起始大小和大小变化的起始大小,起始角度和旋转结束角度等等)以及一组常用参数(例如开始时间和持续时间)。 要同时进行几次转换,给他们相同的开始时间; 要使它们连续,计算开始时间加上一次变换的持续时间。
动画XML文件属于您的Android项目的res / anim /目录。 该文件必须具有单个根元素:它将是包含这些元素的组的单个<alpha>,<scale>,<translate>,<rotate>,interpolator元素或<set>元素(可能包括另一个元素<set>)。 默认情况下,所有动画指令同时应用。 要使它们顺序发生,您必须指定startOffset属性,如下面的示例所示。
来自ApiDemos之一的以下XML用于拉伸,然后同时旋转和旋转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中应用的属性值。
将此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语法,可用标签和属性的更多信息,请参阅动画资源。
注意:无论您的动画如何移动或调整大小,保存动画的视图的边界将不会自动调整以适应。 即使如此,动画仍将被绘制超出其视图的边界,不会被剪辑。 但是,如果动画超过父视图的边界,则会发生裁剪。