视图动画
你可以在View控件上使用视图动画实现补间动画。补间动画通过使用诸如起点,终点,大小,旋转角度来运行动画。
补间动画可以让View对象中的内容实现一系列简单的变换(变换位置、大小、旋转角度和透明度)。比如,你有一个TextView对象,你可以让它的文本移动,旋转,缩放。如果这个TextView有背景图片的话,它将随文本一起变换。animation package包提供了所有的补间动画的类。
补间动画可以通过xml或者代码来声明。如定义布局一样,补间动画更推荐使用xml资源文件来声明,因为它比硬编码的方式更易读,易复用,易改变。下面的例子我们使用xml来实现。
动画声明了你想实现的变换以及变换的时间。补间动画的变换可以有序或同时进行,比如,你可以让一个TextView的文本内容从左往右移动,然后再旋转180度或者边移动边旋转。每次变换都是跟随着特定设置的参数(如起始大小和结束大小的变化,起始角度和结束角度的变化等)以及一些常见的参数(如起始时间,动画的时长)来变化的。如要要实现补间动画的同时播放,需要给每个动画设置相同的开始时间;如果要有序的播放,就需要计算好每个动画的开始时间以及每个动画的播放时长。
xml文件的动画需要放在Android项目中的res/anim目录下。文件必须有指定的根节点:根节点可以是<alpha>,<scale>,<translate>,<ratate>,插值器节点或者包含前面所有节点的<set>节点。所有动画默认是同时进行的。为了让动画有序的执行,你必须如下面所示指定startOffset属性的值。
<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>
某些值(如pivotX)可以相对于对象自身或相对于父对象指定。所以需要确保使用正确的格式(“50”表示相对于父对象的50%或者”50%”表示相对于对象自身50%)。
你可以通过分配一个Interpolator(插值器)来让动画的转变跟随着时间变化规律来转变。
Android包含了数种不同速度曲率的子类插值器,如加速插值器 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。
Note:不管动画如何移动或者调整大小,包含动画的View控件的边界都不会自动调整来容纳动画结束时的状态。即使如此,View也不会裁剪动画结束时超出边界所绘制的内容。但是,如果动画结束时所绘制的内容超过了View的父视图,则会出现裁剪。
原文链接:https://developer.android.google.cn/guide/topics/graphics/view-animation.html