Android中常见的几种布局及事例

http://blog.csdn.net/hccblack/article/details/7051332

Android中常见的几种布局方式:线性布局(LinearLayout)、相对布局(RelativeLayout)、表格布局(Tablelayout)、嵌套布局(FrameLayout)以及帧布局

下面通过几个事例来解释一下这几种布局方式:

线性布局,显而易见,从字面上可以看出这周布局方式是在一条线上一样,可以是垂直的(vertical),也可以是水平的(horizontal),下面是一段事例的代码:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4. android:layout_height="fill_parent"  
  5. <!--垂直布局-->  
  6.     android:orientation="vertical" >  
  7.   
  8.     <TextView  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         <!--给name_text赋值-->  
  12.         android:text="@string/name_text"  
  13.          />  
  14.       
  15.     <EditText   
  16.         android:layout_width="fill_parent"  
  17.         android:layout_height="wrap_content"  
  18.         />  
  19.       
  20.     <Button   
  21.         android:layout_width="wrap_content"  
  22.         android:layout_height="wrap_content"  
  23.         android:text="@string/ok_text"  
  24.         />  
  25.     <Button   
  26.         android:layout_width="wrap_content"  
  27.         android:layout_height="wrap_content"  
  28.         android:text="@string/cancel_text"  
  29.         />  
  30. </LinearLayout>  

“Layout_width”是指该元素的宽度,可选值有三种:“fill_parent”、“wrap_content”、具体数字(单位为px)。其中“fill_parent”代表填满其父元素,对于顶级元素来说,其父元素就是整个手机屏幕(即在根节点出fill_parent代表的是全屏幕)。“wrap_content”代表该元素的大小仅包裹其自身内容,而数字则代表其占相应的px。

下面是虚拟机上运行的截图:

Android中常见的几种布局及事例_第1张图片

一般单纯的线性布局做出来的效果比较差,会用嵌套布局,后边嵌套布局会详解。


相对布局,就是利用相对位置布局,添加各个元素后,如果不加布局属性,会全部重叠在一起,下面的例子是一个梅花的形状,效果图是这样的,

Android中常见的几种布局及事例_第2张图片

它的原理就是,先把上边两个button的属性定义成“置顶”,左边的button用居左,右边的居右,中间的定义为在上边一层的下边和居中,下面的代码中会有详细注释,下边的两个button定义为在上一层的下边和分别居两边。

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6. <Button  
  7.         <!--给元素一个id-->  
  8.         android:id="@+id/one"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         <!--居右-->  
  12.         android:layout_alignParentRight="true"  
  13.         <!--置顶-->  
  14.         android:layout_alignParentTop="true"  
  15.         android:text="@string/btn" />  
  16.   
  17. <Button  
  18. <!--给元素一个id-->  
  19.         android:id="@+id/two"  
  20.         android:layout_width="wrap_content"  
  21.         android:layout_height="wrap_content"  
  22. <!--居左-->  
  23.         android:layout_alignParentLeft="true"  
  24. <!--置顶-->  
  25.         android:layout_alignParentTop="true"  
  26.         android:text="@string/btn" />  
  27.   
  28. <Button  
  29.         <!--给元素一个id-->  
  30.         android:id="@+id/three"  
  31.         android:layout_width="wrap_content"  
  32.         android:layout_height="wrap_content"  
  33.         <!--以id为two的元素为基,下移一层-->  
  34.         android:layout_below="@id/two"  
  35.         <!--居中-->  
  36.         android:layout_centerHorizontal="true"  
  37.         android:text="@string/btn" />  
  38.   
  39.     <Button  
  40.         android:layout_width="wrap_content"  
  41.         android:layout_height="wrap_content"  
  42.         <!--居右-->  
  43.         android:layout_alignParentRight="true"  
  44.         <!--以id为three的元素为基,下移一层-->         
  45.         android:layout_below="@id/three"  
  46.         android:text="@string/btn" />  
  47.   
  48.     <Button  
  49.         android:layout_width="wrap_content"  
  50.         android:layout_height="wrap_content"  
  51. <!--居左-->  
  52.         android:layout_alignParentLeft="true"  
  53. <!--以id为three的元素为基,下移一层-->  
  54.         android:layout_below="@id/three"  
  55.         android:text="@string/btn" />  
  56. </RelativeLayout>  

下面说一下表格布局,这个比较容易理解,里边的行是:<TableRow ></TableRow >可以在中间添加元素,下面一个示例:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4. android:layout_height="match_parent"      
  5. <!--等比例分-->   
  6. android:stretchColumns="*"  
  7.     >  
  8.   
  9.     <TableRow >  
  10.         <TextView   
  11.             android:layout_width="wrap_content"  
  12.             android:layout_height="wrap_content"  
  13.             android:text="@string/name"  
  14.               
  15.             />  
  16.         <TextView   
  17.             android:layout_width="wrap_content"  
  18.             android:layout_height="wrap_content"  
  19.             android:text="@string/sex"  
  20.             />  
  21.         <TextView   
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:text="@string/tel"  
  25.             />  
  26.     </TableRow>  
  27.     <TableRow >  
  28.         <TextView   
  29.             android:layout_width="wrap_content"  
  30.             android:layout_height="wrap_content"  
  31.             android:text="@string/namels"  
  32.             />  
  33.         <TextView   
  34.             android:layout_width="wrap_content"  
  35.             android:layout_height="wrap_content"  
  36.             android:text="@string/sexls"  
  37.             />  
  38.         <TextView   
  39.             android:layout_width="wrap_content"  
  40.             android:layout_height="wrap_content"  
  41.             android:text="@string/tells"  
  42.             />  
  43.     </TableRow>  
  44.     <TableRow >  
  45.         <TextView   
  46.             android:layout_width="wrap_content"  
  47.             android:layout_height="wrap_content"  
  48.             android:text="@string/nameww"  
  49.             />  
  50.         <TextView   
  51.             android:layout_width="wrap_content"  
  52.             android:layout_height="wrap_content"  
  53.             android:text="@string/sexww"  
  54.             />  
  55.         <TextView   
  56.             android:layout_width="wrap_content"  
  57.             android:layout_height="wrap_content"  
  58.             android:text="@string/telww"  
  59.             />  
  60.     </TableRow>  
  61. </TableLayout>  

效果图:

Android中常见的几种布局及事例_第3张图片

下面说一下嵌套布局,看下图,这是Android布局的图示,由图可以看出,可以多种布局方式互相包含,这就大大的增加了布局的灵活性。

Android中常见的几种布局及事例_第4张图片

下边是一个线性布局嵌套线性布局的示例,这是为了更好的实现效果:


[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4. android:layout_height="fill_parent"  
  5. <!--垂直布局-->  
  6.     android:orientation="vertical" >  
  7.   
  8.         <EditText   
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         />  
  12.     <!--注意,从这里开始嵌套,一直到这个标签的结束-->  
  13.     <LinearLayout  
  14.         android:layout_width="wrap_content"  
  15.         android:layout_height="fill_parent"  
  16.         <!--水平布局-->  
  17.         android:orientation="horizontal"  
  18.         android:layout_gravity="center"  
  19.         >  
  20.     <Button  
  21.         android:text="@string/enter"   
  22.         android:layout_width="wrap_content"  
  23.         android:layout_height="wrap_content"  
  24.   
  25.     />  
  26.     <Button  
  27.         android:text="@string/reset"   
  28.         android:layout_width="wrap_content"  
  29.         android:layout_height="wrap_content"  
  30.      />  
  31. </LinearLayout>  
  32.   
  33. </LinearLayout>  

效果图:

Android中常见的几种布局及事例_第5张图片

下面是一个线性布局嵌套相对布局的示例:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.       <TextView  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="@string/name_text"  
  11.          />  
  12.       
  13.      <EditText   
  14.         android:layout_width="fill_parent"  
  15.         android:layout_height="wrap_content"  
  16.         />  
  17.      <!--开始嵌套-->  
  18.      <RelativeLayout   
  19.          android:layout_width="fill_parent"  
  20.          android:layout_height="wrap_content"  
  21.          >  
  22.     <Button   
  23.         android:layout_width="wrap_content"  
  24.         android:layout_height="wrap_content"  
  25.         android:text="@string/cancel_text"  
  26.         android:id="@+id/cancel_button"  
  27.         android:layout_alignParentRight="true"  
  28.         />  
  29.       
  30.           <Button   
  31.         android:layout_width="wrap_content"  
  32.         android:layout_height="wrap_content"  
  33.         android:text="@string/ok_text"  
  34.         android:layout_toLeftOf="@id/cancel_button"  
  35.         />  
  36.                     
  37.      </RelativeLayout>  
  38. </LinearLayout>  

效果图:

Android中常见的几种布局及事例_第6张图片
	帧布局中的每一个组件都代表一个画面,默认以屏幕左上角作为(0,0)坐标,按组件

定义的先后顺序依次逐屏显示,后面出现的会覆盖前面的画面。用该布局可以实现动画效果。

下面是一个示例,实现一个文字颜色变化过程,实质上是几个图片之间的循环切换:

编写main.xml文件其内容如下:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout  
  3. xmlns:android="http://schemas.android.com/apk/res/android"  
  4. android:layout_width="wrap_content"  
  5. android:layout_height="wrap_content"  
  6. android:layout_gravity="center"  
  7. android:id="@+id/frame">  
  8. </FrameLayout>  

在该布局文件中定义一个id为frame的帧布局文件。在FramerLayoutTestActivity.java中编写java代码:

[java]  view plain copy
  1. package cn.class3g.activity;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.drawable.Drawable;  
  5. import android.os.Bundle;  
  6. import android.os.Handler;  
  7. import android.os.Message;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.FrameLayout;  
  11.   
  12.   
  13. public class FrameLayoutTestActivity extends Activity {  
  14.   
  15.     FrameLayout frame = null;  
  16.     private boolean flag = true;  
  17.   
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         this.setContentView(R.layout.main);  
  21.   
  22.         findViews();  
  23.         //创建一个Handler子类对象,要调用其他方法         
  24. final MyHandler myHandler = new MyHandler();  
  25.           
  26.         myHandler.sleep(10);  
  27.         //为fram设置点击事件,当其被点击时,在开始与暂停直接切换  
  28.   
  29.         frame.setOnClickListener(new OnClickListener() {  
  30.   
  31.             public void onClick(View v) {  
  32.                 flag = !flag;  
  33.                 myHandler.sleep(10);  
  34.             }  
  35.   
  36.         });  
  37.   
  38.     }  
  39.   
  40.     private void findViews() {  
  41.         frame = (FrameLayout) this.findViewById(R.id.frame);  
  42.     }  
  43. //由该类两个方法间的循环调用,实现界面不断更新。  
  44.     class MyHandler extends Handler {  
  45.   
  46.         int i = 0;  
  47.   
  48.         public void handleMessage(Message msg) {  
  49.             i++;  
  50.             show(i % 6);// 设置frame前景图片  
  51.             //调用sleep方法  
  52.             sleep(600);  
  53.   
  54.         }  
  55.   
  56.         public void sleep(long delayMillis) {  
  57.             //判断是否继续变换颜色  
  58.             if (flag) {  
  59.                 //实质上是调用了一次handleMessage  
  60.                 this.sendMessageDelayed(this.obtainMessage(10), delayMillis);  
  61.             }  
  62.         }  
  63.   
  64.     }  
  65.     //该方法是被调用以更新帧布局的前景图片  
  66.     void show(int id) {  
  67.         //获取6张图片  
  68.         Drawable[] pic = new Drawable[8];  
  69.         pic[0] = this.getResources().getDrawable(R.drawable.p1);  
  70.         pic[1] = this.getResources().getDrawable(R.drawable.p2);  
  71.         pic[2] = this.getResources().getDrawable(R.drawable.p3);  
  72.         pic[3] = this.getResources().getDrawable(R.drawable.p4);  
  73.         pic[4] = this.getResources().getDrawable(R.drawable.p5);  
  74.         pic[5] = this.getResources().getDrawable(R.drawable.p6);  
  75.   
  76.   
  77.         frame.setForeground(pic[id]);  
  78.     }  
  79. }  

效果图:

Android中常见的几种布局及事例_第7张图片 Android中常见的几种布局及事例_第8张图片

由于FrameLayout中后出现的UI控件会覆盖前面出现的UI控件,每次只能显示一个UI控

件,因此,我们可以通过在Activity中对每次显示的图片内容进行切换以实现动画效果。或许可以开启一条线程来控制切换,但在非主线程中不能更新UI界面,所以,使用了Android提供的消息通讯类Handler。该类可以实现非主线程和负责UI的主线程之间的通信,进而间接实现非主线程更新UI界面。由于sleep方法中的sendMessageDelayed(obtainMessage(0),delayMillis);本身会延迟发送一个消息,该消息会被框架传递给handleMessage事件。我们在handleMessage()方法中再次调用sleep()方法,

形成一个循环调用。在我们对界面进行点击之前,两个方法会一直循环调用。前景图片也会不断的切换,进而实现动画的效果。


你可能感兴趣的:(Android中常见的几种布局及事例)