我在网上找 Android动画的时候发现,很多都是我上一篇哪个样子的文章。很少有一帧一帧的动画。请大家不要忘记传统动画。
下面就给个具体的XML例子,来定义一帧一帧的动画:
上面的XML就定义了一个Frame Animation,其包含6帧动画,6帧动画中分别应用了drawable中的6张图片:ball1,ball2,.....ball6 每帧动画持续50毫秒。
然后我们将以上XML保存在res/anim/文件夹下,命名为simple_animation.xml,显示动画的代码:
-
<?
xml
version
="1.0"
encoding
="UTF-8"
?>
<
LinearLayout
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
android:orientation
="vertical"
xmlns:android
="http://schemas.android.com/apk/res/android"
>
<
ImageView
android:id
="@+id/imageView"
android:layout_width
="wrap_content"
android:layout_height
="wrap_content"
android:gravity
="center"
android:layout_centerHorizontal
="true"
/>
<
TextView
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="aaaaaaaaaaaaaaaaaaaaa"
/>
</
LinearLayout
>
Java 代码
public
class AlarmAlert
extends Activity
{
@Override
protected
void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
ImageView img=(ImageView)findViewById(R.id.imageView);
img.setBackgroundResource(R.anim.simple_animation);
MyAnimationRoutine mar=
new MyAnimationRoutine();
MyAnimationRoutine2 mar2=
new MyAnimationRoutine2();
Timer t=
new Timer(
false);
t.schedule(mar,100);
Timer t2=
new Timer(
false);
t2.schedule(mar2,5000);
}
class MyAnimationRoutine
extends TimerTask{
@Override
public
void run(){
ImageView img=(ImageView)findViewById(R.id.imageView);
AnimationDrawable frameAnimation=(AnimationDrawable)
img.getBackground();
frameAnimation.start();
}
}
class MyAnimationRoutine2
extends TimerTask{
@Override
public
void run()
{
ImageView img=(ImageView) findViewById(R.id.imageView);
AnimationDrawable frameAnimation=(AnimationDrawable)
img.getBackground();
frameAnimation.stop();
}
}
代码运行的结果6张图片按照顺序的播放一次.有一点需要强调的是:启动Frame Animation动画的不能在OnCreate()中,因为在OnCreate()进行内部控制,所以我建子类,开始和停止方法。不然OnCreate()中启动动画,就只能看到第一张图片。
下面,阅读Android SDK中对AnimationDrawable的介绍,有个简单的了解:
|
AnimationDrawable
|
| 获取、设置动画的属性 |
|
| int getDuration() |
获取动画的时长 |
| int getNumberOfFrames() |
获取动画的帧数 |
boolean isOneShot() Void setOneShot(boolean oneshot) |
获取oneshot属性 设置oneshot属性 |
void inflate(Resurce r,XmlPullParser p, AttributeSet attrs) |
|
| 增加、获取帧动画 |
| Drawable getFrame(int index) |
获取某帧的Drawable资源 |
| void addFrame(Drawable frame,int duration) |
为当前动画增加帧(资源,持续时长) |
| 动画控制 |
| void start() |
开始动画 |
| void run() |
外界不能直接掉调用,使用start()替代 |
| boolean isRunning() |
当前动画是否在运行 |
| void stop() |
停止当前动画 |
|
AnimationDrawable
|
| 获取、设置动画的属性 |
|
| int getDuration() |
获取动画的时长 |
| int getNumberOfFrames() |
获取动画的帧数 |
boolean isOneShot() Void setOneShot(boolean oneshot)
|
获取oneshot属性 设置oneshot属性 |
void inflate(Resurce r,XmlPullParser p, AttributeSet attrs) |
|
| 增加、获取帧动画 |
| Drawable getFrame(int index) |
获取某帧的Drawable资源 |
| void addFrame(Drawable frame,int duration) |
为当前动画增加帧(资源,持续时长) |
| 动画控制 |
| void start() |
开始动画 |
| void run() |
外界不能直接掉调用,使用start()替代 |
| boolean isRunning() |
当前动画是否在运行 |
| void stop() |
停止当前动画 |
本文转自luojinghappy 51CTO博客,原文链接:http://blog.51cto.com/luojinghappy/326048,如需转载请自行联系原作者