Android应用开发之FrameLayout (帧布局)+小鸟飞翔案例

帧布局中的每一个组件都代表一个画面,默认以屏幕左上角作为( 0,0 )坐标,按组件定义的先后顺序依次逐屏显示 , 后面出现的会覆盖前面的画面 。 用该布局可以实现动画效果 。

接下来,我们用三幅图片实现一只小鸟飞翔的动画效果。三张图片如下:


编写的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() 方法 ,形成一个循环调用 。 在我们对界面进行点击之前 , 两个方法会一直循环调用 。 前景图片也会不断的切换,进而实现动画的效果。


点击图片之后,小鸟停止飞翔。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值