`

View Animation

阅读更多

View Animation

你能使用view动画系统在Views上实现补间动画。补间动画使用例如开始点、结束点、尺寸、选择和动画的其他常见信息来计算动画。

 

补间动画能在View对象的内容上执行一系列简单的转换(位置、大小、选择和透明度)。因此,如果你有一个TextView对象,你能移动、选择、放大或者缩小该文本。如果你有一个背景图片,该背景图片也会随着该文本转换和改变。animation package包提供了实现补间动画需要用的所有类。

 

通过动画指令指令序列来定义补间动画,使用XML或者Android代码来实现动画。像定义一个布局一样,我们推荐使用XML文件来实现补间动画,因为,相比于硬编码实现,XML文件实现更易读、可复用和可热插拔。下面的例子里,我们使用XML。(如果想了解如何在app里通过代码实现动画,而不是XML文件,参见AnimatonSet类和其他的Animation的子类)

 

动画指令定义了你想要发生的View转换,什么时候发生,持续多长时间等。动画可以是顺序的或者同步的。例如,你能让一个TexView里的文本内容从左边移动到右边,然后旋转180度,或者你能让文本移动的同时旋转。每种转换接受一些参数用于指定该转换(对于大小改变时开始时的大小、结束时的大小,而对于旋转动画,则开始时的角度和结束时的角度,等等)。还包括一些其他的通用的参数(例如:开始时间和持续时长)。为了让多种转换同时发生,指定相同的开始时间;如果为了顺序播放动画,通过开始时间加上个转换的持续时间来计算该动画的开始时间。

 

该动画的XML文件位于你的android工程的res/anim/目录下。该文件必须只能有一个根元素:该根元素只能是<appha>、<scale>、<translate>、<rotate>,内插器元素,或者<set>元素。<set>元素持有这些元素组(可能会包含另一个<set>元素)。默认地,所有的动画指令是同时播放的。为了使得它们顺序播放,你必须指定startOffset属性,如下示例所示。

 

下面的例子来自于ApiDemos里,用于定义一个拉伸动画,同时对该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,能通过相对于它自身或者相对于父View来指定。请确保使用满足你需求的合适的格式("50"表示相对于父布局的50%,"50%"表示相对于自身的50%)。

 

你能通过指定插值器来决定动画期间的转换值。Android提供了一些插值器用来指定特定的各种各样的加速曲线。例如,AccelerateInterpolator表示开始时慢,然后加速。对应有一个属性值来描述加速度,在XML里指定。

 

下面的代码了使用res/anim/目录下的hyperspace_jump.xml文件,然后将该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的边界不会自动的调整来适应该改变。甚至View可能仍然在View的边界外绘制,而不会被修剪。然而,如果View动画超过了父View的边界View将被裁剪。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics