- 帧动画
加载一系列的图片资源来创建动画。
缺点:加载多图耗费内存。
(1)在目录res/drawable/
创建动画资源文件。
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>
oneshot设置为true表示只循环一次,并停留在最后一帧。false动画将循环展示。
(2)设置为View的背景并播放。
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
注意start方法不能在Activity的onCreate方法中调用,因为动画图片还没有完全附在窗口上。想立即播放动画,可在onWindowFocusChanged()中调用,它在Android将窗口变成焦点时回调。
- View(视图)动画
定义起始,中止状态渐变完成动画效果。可在资源文件和代码中定义动画,在资源文件中可读性更强。
(1)在目录
创建动画资源文件。res/anim/
<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>
startOffset 属性设定执行的顺序。
某些值,如pivotX,可以相对于对象本身或相对于父对象来指定。“50”相对于父对象的50%,或者“50%”相对于自身的“50%”。
interpolator 插值器:确定如何随时间变化应用变换。
(2)使用动画。
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
缺:不具有交互性,某个元素发生View动画后,其响应事件的位置依然在动画进行前的地方,只能做普通的动画效果,要避免设计交互操作。
优:使用方便,效率比较高。
- 属性动画
Android3.0之后推出的动画框架。动画计算过程:
使用工厂方法创建ValueAnimator
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();
这段代码对对象没有实际影响,因为ValueAnimator 不直接操作对象属性。需要设定动画事件监听获取新的计算值来刷新。
ObjectAnimator继承自ValueAnimator ,不用实现ValueAnimator.AnimatorUpdateListener,会自动更新动画属性。
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);
anim.setDuration(1000);
anim.start();
用AnimatorSet编排多个动画
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();
before在谁之前,with和谁一起,after在谁之后。
- 插值器Interpolator
插值器是动画修改器,影响动画中的变化率,动画效果可以加速、减速、重复、弹跳等。
LinearInterpolator
线性插值器,其变化率是固定的
AccelerateInterpolator
加速插值器,其变化速率开始缓慢,然后加速
DecelerateInterpolator
减速插值器
AccelerateDecelerateInterpolator
加速减速插值器,其变化速率开始和结束缓慢但中间加速。
CycleInterpolator
循环插值器,为指定的循环次数重复动画。变化率遵循正弦模式。
OvershootInterpolator
超过插值器,其变化向前超过最终值,然后回来
AnticipateInterpolator
预插值器,其变化开始向后,然后飞快地返回最终值
AnticipateOvershootInterpolator
向后向前插值器,其变化开始向后,然后向前和超过目标值,最后返回到最终值。
BounceInterpolator
边界插值器,其变化在末端反弹