Android中可在XML文件中定义的绘图子类包括:
AnimationDrawable、BitmapDrawable、ClipDrawable、ColorDrawable、GradientDrawable、InsetDrawable、LayerDrawable、LevelDrawable、RotateDrawable、ScaleDrawable、StateListDrawable、TransitionDrawable,利用这些对象可以定义一些自己的绘图子类。
以TransitionDrawable为例,
<transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/icon"/> <item android:drawable="@drawable/icon1"/> </transition>
就定义了两个图片淡入淡出的对象。
Android中的动画有补间动画(Tween Animation)以及帧动画(Frame Animation)。
补间动画可以定义的效果有透明效果(Alpha)、尺度变换(Scale)、移动(Translate)、旋转(Rotate),可以定义其中的一种或者多种,多种动画的组合使用Set作为容器。
下面是多种效果组合的补间动画定义
<set android:shareInterpolator="false" xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromXScale="1.6" android:toXScale="0.6" android:fromYScale="1.6" android:toYScale="0.6" android:pivotX="50%" android:pivotY="50%" android:fillAfter="false" android:duration="3000"> </scale> <set android:interpolator="@android:anim/decelerate_interpolator"> <scale android:fromXScale="0.6" android:toXScale="1.2" android:fromYScale="0.6" android:toYScale="1.2" android:pivotX="50%" android:pivotY="50%" android:startOffset="3000" android:duration="5000"> </scale> <rotate android:fromDegrees="0" android:toDegrees="-45" android:pivotX="50%" android:pivotY="50%" android:startOffset="3000" android:duration="5000"> </rotate> <alpha android:fromAlpha="1.0" android:toAlpha="0.6" android:startOffset="3000" android:duration="5000"> </alpha> </set> </set>
帧动画是用来播放事先安排好的一组图像来产生动画效果,使用XML来定义,方便修改。
下面是一个帧动画定义的例子
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/gif1" android:duration="500"></item> <item android:drawable="@drawable/gif2" android:duration="500"></item> <item android:drawable="@drawable/gif3" android:duration="500"></item> <item android:drawable="@drawable/gif4" android:duration="500"></item> </animation-list>
在程序中的使用如下
imageView = (ImageView)findViewById(R.id.ImageView01); imageView.setBackgroundResource(R.anim.animationlist); animationListDrawable = (AnimationDrawable)imageView.getBackground();
帧动画的启动不能够在Oncreate方法中启动,因为此时AnimationDrawable还没有完全和Window接触,视图还没有显示。
如果希望一开始就启动动画,则在下面的事件中启动动画。
@Override public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasFocus); if(hasFocus){ animationListDrawable.start(); }else{ animationListDrawable.stop(); } }