第2章 View动画与Drawable动画
2.1 View动画
你可以使用View的动画系统,在View上执行的补间动画。补间动画进行,如起点,终点,大小,旋转,动画的其他普通法方面的计算。补间动画可以执行一系列简单的View对象的内容转换(位置,大小,旋转,透明度)。所以,如果你有一个TextView的对象,你可以移动,旋转,放大,或缩小文本。如果它有一个背景图片,背景图片将随着文字变形。animation这个包(package)中提供了所有用于补间动画类。定义补间动画所指定的序列可以通过XML或Android代码来定义。推荐使用XML文件来定义一个布局,因为它更具可读性,可重复使用,易修改。在下面的例子中,我们使用XML来定义动画。动画可以指定你想要发生的时间,持续时间,连续或同时播放等。例如,你有一个TextView从左至右移动,然后旋转180度,或者你有一个TextView从左至右移动,并同时旋转。
动画的XML文件定义在res/anim/文件夹下。该文件必须有一个根元素:<set>
从下面的XML的ApiDemos之一它是用于拉伸,然后同时缩放和旋转视图对象。如代码清单1-1所示:
<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>
代码清单1-1
屏幕坐标(在这个例子中不使用)(0,0)在左上角,并增加向下和右侧。
一些值,如pivotX,可以指定对象本身或相对于父控件。你想要的东西一定要使用正确的格式(“50”为50%是有区别的, 50%表示相对对象本身)。
你可以决定如何随着时间的推移应用分配一个加速器(Interpolator)。Android包括几个加速器子类指定不同的速度曲线:例如,AccelerateInterpolator的讲述一个开始减缓和加快转型。每个人都有一个属性值,可以在XML应用。此XML保存在项目res/anim/目录下的hyperspace_jump.xml,下面的代码将引用它,并将其应用于从布局到ImageView的对象。如代码清单1-2所示:
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); spaceshipImage.startAnimation(hyperspaceJumpAnimation);
代码清单1-2
2.2 Drawable动画
Drawable动画你可以理解为是帧动画,一般业内我们也叫它帧动画。它让你加载一个系列drawable资源来创建一个动画。就像翻书一样。AnimationDrawable类是帧动画的基础。其实帧动画使用起来很简单。你可以在XML文件中定义你想要的动画序列。如按照下面的格式即可,参考下面代码清单1-3所示:
<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>
代码清单1-3
这个帧动画只有三帧。并且设置了oneshot=“true”,表示只执行一次,然后会停在最后一帧。当然你设置为false他就会循环运行了。一般我们放在res/anim/目录下,当然有些人也喜欢放在res/drawable/目录下,这都是可以的。这个XML文件会被当成View的background属性来播放。以下代码清单1-4就是一个例子:
AnimationDrawable rocketAnimation; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image); rocketImage.setBackgroundResource(R.drawable.rocket_thrust); rocketAnimation = (AnimationDrawable) rocketImage.getBackground(); } public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { rocketAnimation.start(); return true; } return super.onTouchEvent(event); }
代码清单1-4
请注意,动画的.start()方法放在onCreate()中是无效的。如果你想要程序自动后就立即播放,你可以考虑重写onWindowFocusChanged() 方法,并把rocketAnimation.start()放在其中即可。