API指南 -- 动画和图像(3)-- 组件动画(View Animation)

来源:互联网 发布:复杂网络基础 编辑:程序博客网 时间:2024/06/05 20:49

你可以使用组件动画系统在View上设置补间动画。补间动画通过动画的起点,终点,尺寸,旋转以及其它信息来计算动画。

 

一个补间动画可以在一个View对象的内容(位置,大小,旋转,透明度)上执行一些简单的变换操作。所以,如果你有一个TextView对象,那么你可以移动,旋转,放大,或缩小文本。如果它还有背景图片的话,背景图片也会跟着文本一起变换。android.view.animation包下提供了补间动画所用到的所有类。

 

通过使用XML文件或者安卓编码,你可以定义一系列补间动画指令。与定义布局文件类似,推荐在XML文件中定义动画,因为与硬编码相比,它更宜读,宜用,宜交换。在下面的例子中,我们使用了XML。(如果想学习如何在代码中定义动画,请参考AnimationSet类和其它Animation类)。

 

动画指令定义了你想执行的变换操作,它们发生的时间,以及时长。变换可以是顺序的或者是同时的 ---- 比如,你可以让一个TextView的内容从左移到右,然后再旋转180度,或者你可以让移动和旋转同时进行。每种变换都需要设置特定的参数(大小变换的起始大小,终止大小,旋转的起始角度和终止角度等等),还有一些普通的参数(比如,开始时间和时长)。为了让变换同时进行,你可以给它们一个相同的开始时间;为了让它们顺序进行,计算开始时间时加上前一个动画的时长。

 

动画XML文件放在目录res/anim下面。这个文件只能含有一个根元素:可以是一个<alpha>,<scale>,<translate>,<rotate>,interpolator元素,或者<set>元素,用来包含其它元素的组合(当然也可以包含另一个<set>)。默认情况下,所有动画同时开始。为了让它们顺序进行,你可以如下所示,给它们指定一个startOffset属性。

 

下面的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,来决定如何随着时间来变换对象。安卓包含了几个Interpolator子类来指定不同的速度变换:比如,AccelerateInterpolator意味着变换开始时慢,然后加速。每一个Interpolator都可以在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对象。

 

注意:无论你的动画如果移动或缩放,动画作用的View对象的边界是不会改变的。虽然如此,动画仍然可以View的边界之外描画,而且不会发生裁剪。但是,如果动画越出了父对象的边界的话,裁剪就会发生。


0 0
原创粉丝点击