android学习笔记(13)android幀布局

android中贞布局由FrameLayout所代表,FrameLayout直接继承了 ViewGroup 组件。

帧布局容器为每个加入其中的组件创建一个空白的区域 (称为一帧),所有每个子组件占据一帧,这些帧都会根据 gravity属性执行自动对齐。也就是说,巾贞布局的效果有点类似 于AWT编程的CardLayout,都是把组件一个一个地叠加在一 起。与CardLayout的区别在于,CardLayout可以将下面的Card 移上来,但FrameLayout则没有提供相应的方法。

表2.6显示了 FmmeLayout常用的XML属性及相关方法说明。

表2.6 FrameLayout的常用XML属性及相关方法

XML属性                                   相关方法                                    说 明

android:foreground              setForcground(Drawablc)      设迓该帧布局容器的前联图像

android: foregroundGravity   setForegroundGravity(int)   定义绘制前眾阁像的gravity M性

下面示范了帧布局的用法,程序看到7个TextView叠加在一起,上面的TextView遮住 下面的TextView。下面是使用帧布局的贡面定义代码。

程序清单:codes\02\2.2\FrameLay〇utTest\res\layout\main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
<!-- 依次定义7个TextView,先定义的TextView位于底层
 后定义的TextView位于上层 -->
<TextView android:id="@+id/View01"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:width="210px"
 android:height="50px"
 android:background="#ff0000"
 />
<TextView android:id="@+id/View02"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:width="180px"
 android:height="50px"
 android:background="#dd0000"
 />
<TextView android:id="@+id/View03"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:width="150px"
 android:height="50px"
 android:background="#bb0000"
 />
<TextView android:id="@+id/View04"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:width="120px"
 android:height="50px"
 android:background="#990000"
 />
<TextView android:id="@+id/View05"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:width="90px"
 android:height="50px"
 android:background="#770000"
 />
<TextView android:id="@+id/View06"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:width="60px"
 android:height="50px"
 android:background="#550000"
 />
<TextView android:id="@+id/View07"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:width="30px"
 android:height="50px"
 android:background="#330000"
 />
</FrameLayout>

上面的界面布局定义使用FrameLayout布局,并向该布局容器中添加了 7个TextView,

这7个TextView的高度完全相同,而宽度则逐渐减少——这样可以保证最先添加的TextView不会被完全遮挡;而且我们设置了 7个TextView的背景色渐变。

实例:霓虹灯效果

如果考虑轮换改变上面帧布局中7个TextView的背景色,就会看到上面的颜色渐变条不断地变换,就像大街上的霓虹灯一样。下面的程序还是使用上面的FrameLayout布局管理器, 只是程序启动了一条线程来控制周期性地改变这7个TextView的背景色。下面是该主程序的 代码。

程序清单:codes\02\2.2\FrameLayoutTest\src\org\crazyit\framelayout\FrameLayoutTest.java

package org.crazyit.framelayout;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

/**
 * Description:
 * <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>
 * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee [email protected]
 * @version  1.0
 */
public class FrameLayoutTest extends Activity
{
 private int currentColor = 0;
 //定义一个颜色数组
 final int[] colors = new int[]
 {
  R.color.color7,
  R.color.color6,
  R.color.color5,
  R.color.color4,
  R.color.color3,
  R.color.color2,
  R.color.color1,
 };
 final int[] names = new int[]
 {
  R.id.View01,
  R.id.View02,
  R.id.View03,
  R.id.View04,
  R.id.View05,
  R.id.View06,
  R.id.View07
 };
 TextView[] views = new TextView[7];
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  for (int i = 0 ; i < 7 ; i++)
  {
   views[i] = (TextView)findViewById(names[i]);
  }
  final Handler handler = new Handler()
  {
   @Override
   public void handleMessage(Message msg)
   {
    //表明消息来自本程序所发送
    if(msg.what == 0x1122)
    {
     //依次改变7个TextView的背景色
     for(int i = 0 ; i < 7 - currentColor ; i++)
     {
      views[i].setBackgroundResource(colors[i + currentColor]);
     }
     for(int i = 7 - currentColor , j = 0 ; i < 7 ; i++ ,j++)
     {
      views[i].setBackgroundResource(colors[j]);
     }
    }
    super.handleMessage(msg);
   }
  };
  //定义一个线程周期性的改变currentColor变量值
  new Timer().schedule(new TimerTask()
  {
   @Override
   public void run()
   {
    currentColor++;
    if(currentColor >= 6)
    {
     currentColor = 0;
    }
    //发送一条消息通知系统改变7个TextView组件的背景色
    Message m = new Message();
    //给该消息定义一个标识
    m.what = 0x1122;
    handler.sendMessage(m);
   }
  }, 0 , 100);
 }
}

上面的程序中粗体字代码定义了一个每0.1秒执行一次的任务,该任务仅仅改变 currentColor变量的值,然后向Handler发送一条消息,通知它更新7个TextView的背景色。

可能会有读者提出疑问:为何不直接在nm〇方法里直接更新7个TextView的背景色呢? 这是因为Android的View和UI组件不是线程安全的,所以Android不允许幵发者启动线程 访问用户界面中UI组件。所以程序中额外定义了一个Handler来处理TextView背景色的更 新。

上面的程序中直接使用了 R.color.color7、R.color.color6、R.color.color5 等 整型常量来代表颜色,这也得益于Android的资源访问支持,本书后面会有关 于颜色资源的详细介绍。

简单地说,上面的程序通过任务调度控制了每间隔0.1秒轮换更新一次7个TextView的 背景色,这样看上去就像大街上的“霓虹灯”了。

原文地址:http://www.itmmd.com/201412/271.html

该文章由 萌萌的IT人 整理发布,转载须标明出处。

时间: 2024-10-18 04:23:02

android学习笔记(13)android幀布局的相关文章

Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

Android学习笔记_79_ Android 使用 搜索框

1.在资源文件夹下创建xml文件夹,并创建一个searchable.xml: <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/sms_search" android:hint="@st

Android学习笔记一 Android的构成

一个Android程序是由多个Activity松散构成通过Intnet对象相互调用每个Activity相对独立. R文件:自动生成,存储着程序集所包含的资源文件. src:包含程序中所有的Activity类文件. 新添加的Activity必须在AndroidManifest.xml中进行注册. values:该文件夹下的元素会在R文件中生成资源ID. Android学习笔记一 Android的构成

Android学习笔记(九)——布局和控件的自定义

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! View是 Android中一种最基本的 UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,因此,我们使用的各种控件其实就是在 View的基础之上又添加了各自特有的功能.而ViewGroup 则是一种特殊的 View,它可以包含很多的子 View和子 ViewGroup,是一个用于放置控件和布局的容器.系统默认的所有控件都是直接或间接继承自 View 的,所用的所有布局都是直接或间接继承自 Vie

Android学习笔记六:六大布局

六大界面布局方式包括: 线性布局(LinearLayout).帧布局(FrameLayout).表格布局(TableLayout).相对布局(RelativeLayout).绝对布局(AbsoluteLayout)和网格布局(GridLayout) . 1. LinearLayout线性布局 LinearLayout容器中的组件一个挨一个排列,通过控制android:orientation属性,可控制各组件是横向排列还是纵向排列. LinearLayout的常用XML属性及相关方法 XML属性

android学习笔记13——ExpandableListView

ExpandableListView==>可展开的列表组件 ==> ExpandableListView是ListView的子类,对其进行了扩展,其将应用中的列表项分为几组,每组中又包含多个列表项: ExpandableListView的用法和ListView非常像,只是其所显示的列表项应该由ExpandableListAdapter提供: ExpandableListView支持的额外属性: android:childDivider 指定各组内各子列表项之间的分隔条 android:chil

Android 学习笔记 2 Android开发环境的安装(Eclipse Bundle)

搭建eclipse开发环境,一般要经过 安装JDK.安装Eclipse.下载Android SDK.在Eclipse中安装ADT.在Eclipse中配置Android SDK.通过SDK Manager对Android SDK进行管理等几个比较麻烦的步骤. 后来Google推出了 adt-bundle 将ATD.SDK整合到Eclipse中,这样对于新手来说就免去了很多步骤,入门更容易了. 在此推荐一个网站 http://tools.android-studio.org/ 可以免去搬梯子去And

Android学习笔记之 android:collapseColumns ,android:shrinkColumns 和stretchColumns

摘自:http://blog.csdn.net/sjf0115/article/details/7213565/ TableLayout是一个使用复杂的布局,最简单的用法就仅仅是拖拉控件做出个界面,但实际上,会经常在代码里使用TableLayout,例如做出表格的效果.本文主要介绍TableLayout的基本使用方法. [java] view plain copy <?xml version="1.0" encoding="utf-8"?> <Ta

(android学习笔记)Android View

Android View类: 1.所有的Android组件均是View的子类. 2.所有的组件均可以进行两种配置,一是通过方法进行配置.二是通过XML进行配置. TextView类: 1.对于文本组件而言主要的目的是静态的显示一些文字,类似于标签的功能. 2.其是android.widget.TextView类,是android.view.View类的直接子类. 3.插入超链接的方法: 1)在XML文件中的TextView组件配置中写:android:autoLink="all" 会自