现在的位置: 首页 > 综合 > 正文

【Android API指南】动画和图像(2) – 视图动画

2014年01月24日 ⁄ 综合 ⁄ 共 1972字 ⁄ 字号 评论关闭

你可以使用视图动画系统执行视图的补间动画。补间动画使用起点,终点,尺寸,旋转,和一些自定义值去计算动画。

一个补间动画可以执行一些简单视图对象转换(位置,大小,旋转,透明度),所以,如果你有一个TextView对象,你可以移动它,旋转它,放大或者缩小它。如果TextView有一个背景图像的话,也会跟着文本发生改变。animation packate提供了所有补间动画类。
一系列的动画指令定义了补间动画,可以用XML或者Android代码实现。推荐使用XML,因为它更加易读,可重复使用,可交换。下面的例子我们使用XML实现。
动画指令定义了你想实现的动画,动画可以是连续的,也可以是同时发生的,例如,你可以移动一个TextView从左边到右边,然后旋转180度,或者你可以一边移动一边旋转。每个动画都有一个指定参数(开始大小和结束大小,开始角度和结束角度,等),已经一些通用参数(开始时间和持续时间)。要实现动画同时改变,需要给定相同的开始时间,顺序播放的话,需要计算开始加上先前动画的持续时间。
动画的XML文件存放在res/anim/目录中,文件必须有一个单独的更元素:可以是<alpha>, <scale>, <translate>, <rotate>, 内插元素,或者是一个包含其他元素的<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%)。
你还可以指定一个插入器。android提供了一些插入器的子类。例如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);
你也可以选择使用Animation.setStartTime()来定义开始时间,使用View.setAnimation()来指定使用的动画。
提示:不管是移动位置还是改变大小,视图的范围不会自适应。所以,视图会被绘制超过它的范围,而不被截取。不过,如果动画超过了父视图的范围就会被截取。

抱歉!评论已关闭.