接下来,我们用三幅图片实现一只小鸟飞翔的动画效果。三张图片如下:
编写的mail.xml文件:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:id="@+id/frame" > </FrameLayout>
在该布局文件中定义一个 id 为 frame 的帧布局文件。
编写 FreamTestActivity.java 类
package cn.class3g; import android.app.Activity; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.FrameLayout; public class FreamTestActivity extends Activity { FrameLayout frame = null; boolean flag = true; class MyHandler extends Handler { int i = 0; public void handleMessage(Message msg) { i++; show(i % 3); sleep(50); } public void sleep(long delayMillis) { if (flag) { this.sendMessageDelayed(this.obtainMessage(0), delayMillis); } } } void show(int i) { Drawable a = getResources().getDrawable(R.drawable.a1); Drawable b = getResources().getDrawable(R.drawable.a2); Drawable c = getResources().getDrawable(R.drawable.a3); switch (i) { case 0: frame.setForeground(a); break; case 1: frame.setForeground(b); break; case 2: frame.setForeground(c); break; } } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); frame = (FrameLayout) findViewById(R.id.frame); final MyHandler myHandler = new MyHandler(); myHandler.sleep(50); frame.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub flag = !flag; myHandler.sleep(10); } }); } }
说明:
由于 FrameLayout 中后出现的 UI 控件会覆盖前面出现的 UI 控件,每次只能显示一个 UI 控件,因此,我们可以通过在 Activity 中对每次显示的图片内容进行切换以实现动画效果 。 或许你会想到开启一条线程来控制切换 , 但在非主线程中不能更新 UI 界面 , 所以 , 我们使用了Android 提供的消息通讯类 Handler 。该类可以实现非主线程和负责 UI 的主线程之间的通信 ,进而间接实现非主线程更新 UI 界面。由于 sleep 方法中的sendMessageDelayed(obtainMessage(0), delayMillis); 本身会延迟发送一个消息 , 该消息
会被框架传递给 handleMessage 事件 。 我们在 handleMessage() 方法中再次调用 sleep() 方法 ,形成一个循环调用 。 在我们对界面进行点击之前 , 两个方法会一直循环调用 。 前景图片也会不断的切换,进而实现动画的效果。
点击图片之后,小鸟停止飞翔。