FrameLayout(帧布局)
前言
作为android六大布局中最为简单的布局之一,该布局直接在屏幕上开辟出了一块空白区域,
当我们往里面添加组件的时候,所有的组件都会放置于这块区域的左上角;
帧布局的大小由子控件中最大的子控件决定,
如果都组件都一样大的话,同一时刻就只能能看到最上面的那个组件了!
当然我们也可以为组件添加layout_gravity属性,从而制定组件的对其方式
帧布局在游戏开发方面用的比较多,等下后面会给大家演示一下比较有意思的两个实例
前景图像:
永远处于帧布局最顶的,直接面对用户的图像,,就是不会被覆盖的图片
常用属性:
android:foreground:设置该帧布局容器的前景图像
android:foregroundGravity:设置前景图像显示的位置
应用实例:
①最简单的实例:
属性很简单,接着演示下FrameLayout的基本用法
真的很简单,网上大部分的例子都是这个= =,
效果图:
代码如下:
[html]
view plain copy print ?
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/FrameLayout1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity"
- android:foreground="@drawable/logo"
- android:foregroundGravity="right|bottom">
-
- <TextView
- android:layout_width="200dp"
- android:layout_height="200dp"
- android:background="#FF6143" />
- <TextView
- android:layout_width="150dp"
- android:layout_height="150dp"
- android:background="#7BFE00" />
- <TextView
- android:layout_width="100dp"
- android:layout_height="100dp"
- android:background="#FFFF00" />
-
- FrameLayout>
代码解释:
如图,我们设置了三个图片块,而这些图片块仅仅是三个设置了不同背景颜色的TextView
TextView都出现在了左上角,为了避免覆盖,大小是依次递减的
在外层FrameLayout中设置了前景图像显示的图片,以及把它设置到了右下角
②跟随手指移动的萌妹子
效果图:
实现流程:
step 1:先将main.xml布局设置为空白的FrameLayout,为其设置一个图片背景
step 2:新建一个继承View类的MeziView自定义组件类,在构造方法中初始化view的初始坐标
step 3:重写onDraw()方法,实例化一个空的画笔类Paint
step 4:调用BitmapFactory.decodeResource()生成位图对象
step 5:调用canvas.drawBitmap()绘制妹子的位图对象
step 6:判断图片上是否回收,否则强制回收图片
step 7:在主Java代码中获取帧布局对象,并且实例化一个MeziView类
step 8:会实例化的mezi对象添加一个触摸事件的监听器,重写onTouch方法,改变mezi的X,Y坐标,调用invalidate()重绘方法
step 9: 将mezi对象添加到帧布局中
详细代码:
布局代码:
[html]
view plain copy print ?
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/mylayout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity"
- android:background="@drawable/back" >
-
- FrameLayout>
自定义的MeziView类
[java]
view plain copy print ?
- package com.jay.example.framelayoutdemo2;
-
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Paint;
- import android.view.View;
-
- public class MeziView extends View {
-
- public float bitmapX;
- public float bitmapY;
-
-
- public MeziView(Context context) {
- super(context);
-
- bitmapX = 0;
- bitmapY = 200;
- }
-
-
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- Paint paint = new Paint();
-
- Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.s_jump);
-
- canvas.drawBitmap(bitmap, bitmapX, bitmapY,paint);
-
- if(bitmap.isRecycled())
- {
- bitmap.recycle();
- }
-
- }
-
- }
主Activity类:
[java]
view plain copy print ?
- package com.jay.example.framelayoutdemo2;
-
- import android.os.Bundle;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.View.OnTouchListener;
- import android.widget.FrameLayout;
- import android.app.Activity;
-
-
- public class MainActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- FrameLayout frame = (FrameLayout) findViewById(R.id.mylayout);
- final MeziView mezi = new MeziView(MainActivity.this);
-
-
- mezi.setOnTouchListener(new OnTouchListener() {
-
- @Override
- public boolean onTouch(View view, MotionEvent event) {
-
- mezi.bitmapX = event.getX();
- mezi.bitmapY = event.getY();
-
- mezi.invalidate();
- return true;
- }
- });
-
- frame.addView(mezi);
-
- }
- }
代码解释:
步骤写的很详细,代码也不难,自己看看吧
就是自定义了一个View类,然后重写了一下重绘方法,接着在主Activity中为它添加了一个触摸事件
在触摸事件中重写onTouch方法获得点击坐标,调用invalidate()重绘方法;
最后添加到帧布局中而已
代码链接:
http://pan.baidu.com/s/1pJJfKgz
③跑动的萌妹子
效果图:
实现流程:
step 1:定义一个空的FrameLayout布局,将前景图像的位置设置为中央位置
step 2:在Activity中获取到该FrameLayout布局,新建一个Handler对象,重写handlerMessage()方法,调用图像更新的方法
step 3:自定义一个move()方法,通过switch动态设置前景图片显示的位图
step 4:在onCreate()方法中新建一个计时器对象Timer,重写run方法,每隔170毫秒向handler发送空信息
代码如下:
xml布局代码:
[html]
view plain copy print ?
- <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/myframe"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:foregroundGravity="center">
-
- FrameLayout>
MainActivity.java:
代码解释:
代码也不是很发杂,就是定义一个handler对象来刷新帧布局的前景图像
用Timer对来定时发送信息
i++; move(i % 8 ); //这里是因为有8个图片作为动画的素材
代码链接:
http://pan.baidu.com/s/1c0vL8PE
总结:
以上就是FrameLayout的详解,FrameLayout还是比较有趣的
帧动画就是一个比较常见的例子
如有遗漏,读者可以向我指出
O(∩_∩)O谢谢!