当前位置: 代码迷 >> Android >> android学习笔记(13)android幀格局
  详细解决方案

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

热度:9   发布时间:2016-04-28 03:08:08.0
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人 整理发布,转载须标明出处。

  相关解决方案