浅谈Android布局样式

来源:互联网 发布:ant打包java web项目 编辑:程序博客网 时间:2024/05/16 11:20

浅谈Android布局样式

初学android,感觉还是比较轻松的。当然,如果没有好好的去在自己的电脑上实现的话,估计也会搞得自己稀里糊涂的。下面是我在学习Android布局样式的一些总结(个人这样认为),当然,在其中也借鉴了其他的学习资料,现在与大家分享一下。学习中,我分别学习了Android的四种布局样式分别为:

1.LinearLayout(线性布局)

2.RelativeLayout (相对布局)

3.TableLayout (表格布局)

4.FrameLayout (帧布局)

下面逐一介绍一下:

1.LinearLayout(线性布局)

“ LinearLayout ”翻译成中文是“线性布局”,所谓线性布局就是在该标签下的所有子元素会根据其 orientation 属性的值来决定是按行或者是按列逐个显示。

示例main.xml布局文件如下:

view plain
  1. <?xml version="1.0"encoding ="utf-8"?>  
  2. <LinearLayout  
  3. xmlns:android "http://schemas.android.com/apk/res/android"  
  4. android:orientation"vertical"  
  5. android:layout_width"fill_parent"  
  6. android:layout_height"fill_parent"  
  7. >   
  8. <TextView  
  9. android:layout_width"fill_parent"  
  10. android:layout_height"wrap_content"  
  11. android:text ="@string/name_text"  
  12. />  
  13. < EditText  
  14. android:layout_width"fill_parent"  
  15. android:layout_height"wrap_content" />  
  16. < Button  
  17. android:layout_width"wrap_content"  
  18. android:layout_height"wrap_content"  
  19. android:text ="@string/cancle_button"  
  20. />  
  21. < Button  
  22. android:layout_width"wrap_content"  
  23. android:layout_height"wrap_content"  
  24. android:text ="@string/ok_button" />  
  25. </LinearLayout >  

其对应 strings.xml 内容如下:

view plain
  1. <?xml version="1.0"encoding = "utf-8" ?>  
  2. < resources>  
  3. < string name"hello" > Hello World, UIActivity! </ string >  
  4. < string name"app_name" > 用户界面 </ string >  
  5. < string name"name_text" > 请输入用户名 </ string >  
  6. < string name"ok_button" > 确定 </ string >  
  7. < string name"cancle_button" > 取消 </ string >  
  8. </ resources>  

运行后,如下图:


“ xmlns:android ”指定命名空间,顶级元素必须指定命名空间。而在该命名空间中的控件的属性如 layout_width ,要在属性前加上“android :”做前缀。

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

“ layout_height ”指定该元素的高度,可选参数值与“ layout_width ”的参数意义相同。

“ orientation ”指定子元素排列方式,其中指定为“ vertical ”则是子元素垂直排列,每个子元素会占独立的一行,如上图,而另一个可选值为“ horizontal ”代表子元素水平排列,即每个子元素会占独立的一列。示例 main.xml 布局文件如下。其对应的

strings.xml 内容不变。

view plain
  1. main .xml  
  2. <? xml version = "1.0" encoding ="utf-8" ?>  
  3. < LinearLayout  
  4. xmlns:android ="http://schemas.android.com/apk/res/android"  
  5. android:orientation = "horizontal"  
  6. android:layout_width = "fill_parent"  
  7. android:layout_height = "fill_parent"  
  8. >   
  9. < TextView  
  10. android:layout_width = "wrap_content"  
  11. android:layout_height = "fill_parent"  
  12. android:text = "@string/name_text"  
  13. />  
  14. < EditText  
  15. android:layout_width = "wrap_content"  
  16. android:layout_height = "wrap_content"/>  
  17. < Button  
  18. android:layout_width = "wrap_content"  
  19. android:layout_height = "wrap_content"  
  20. android:text = "@string/cancle_button"  
  21. />  
  22. < Button  
  23. android:layout_width = "wrap_content"  
  24. android:layout_height = "wrap_content"  
  25. android:text = "@string/ok_button" />  
  26. </ LinearLayout >  

运行后,如下图:


2.RelativeLayout (相对布局)

相对布局中的视图组件是按相互之间的相对位置来确定的, 并不是线性布局中的必须

按行或按列单个显示。示例布局文件如下:

main.xml

view plain
  1. <? xml version = "1.0"encoding = "utf-8" ?>  
  2. < RelativeLayout  
  3. xmlns:android ="http://schemas.android.com/apk/res/android"  
  4. android:layout_width ="fill_parent"  
  5. android:layout_height = "fill_parent"  
  6. >   
  7. < TextView  
  8. android:layout_width ="fill_parent"  
  9. android:layout_height ="wrap_content"  
  10. android:text ="@string/name_text"  
  11. android:id = "@+id/text" />  
  12. < EditText  
  13. android:layout_width ="fill_parent"  
  14. android:layout_height ="wrap_content"  
  15. android:layout_below = "@id/text"  
  16. android:id = "@+id/edit" />  
  17. < Button  
  18. android:layout_width ="wrap_content"  
  19. android:layout_height ="wrap_content"  
  20. android:text ="@string/cancle_button"  
  21. android:layout_alignParentRight ="true"  
  22. android:layout_below = "@id/edit"  
  23. android:id = "@+id/cancle" />  
  24. < Button  
  25. android:layout_width ="wrap_content"  
  26. android:layout_height ="wrap_content"  
  27. android:layout_toLeftOf ="@id/cancle"  
  28. android:layout_alignTop ="@id/cancle"  
  29. android:text ="@string/ok_button" />  
  30. </ RelativeLayout >  

说明:

android:layout_below="@id/text" :将该元素放到 id 为 text 的元素的下面

android:layout_toLeftOf="@id/ok" :放到 id 为 ok 的元素左边

android:layout_alignTop="@id/ok" :对齐 id 为 ok 的元素的顶部

还有很多关于相对位置的字段,希望大家能够自己去发现

界面效果如图:


案例二:梅花效果

问题:利用相对布局实现下面的效果


案例分析:

我们可以从途中看出,四周的方框的角都与中间的方框相连,而且呈现出X字样.试想,中间的是不是有什么特殊含义?

好,养我们做一个假设:假设中间的方框为相对对象,那么各个方框如何表示呢?拿左上角的方框为例,它的位置是:既中间方框的上面又是中间方框的左边.好,那么其他的是不是可以同样再这样表示呢?答案是肯定的.按照这个思路,我们试着把代码写出来:

main.xml

view plain
  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.   
  7.     <TextView  
  8.         android:id="@+id/center"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_centerInParent="true"  
  12.         android:background="@drawable/meihua"/>  
  13.   
  14.   
  15.     <TextView  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_above="@id/center"  
  19.         android:layout_toLeftOf="@id/center"  
  20.         android:background="@drawable/meihua"/>  
  21.   
  22.   
  23.     <TextView  
  24.         android:layout_width="wrap_content"  
  25.         android:layout_height="wrap_content"  
  26.         android:layout_above="@id/center"  
  27.         android:layout_toRightOf="@id/center"  
  28.         android:background="@drawable/meihua"/>  
  29.   
  30.   
  31.     <TextView  
  32.         android:layout_width="wrap_content"  
  33.         android:layout_height="wrap_content"  
  34.         android:layout_below="@id/center"  
  35.         android:layout_toLeftOf="@id/center"  
  36.         android:background="@drawable/meihua"/>  
  37.   
  38.   
  39.     <TextView  
  40.         android:layout_width="wrap_content"  
  41.         android:layout_height="wrap_content"  
  42.         android:layout_below="@id/center"  
  43.         android:layout_toRightOf="@id/center"  
  44.         android:background="@drawable/meihua"/>  
  45.   
  46.   
  47. </RelativeLayout>  

运行图为:


android:layout_centerInParent="true" 图片垂直水平居中

android:background="@drawable/meihua"将该元素的id放到background下,"meihua"是我拷入的图片文件


3.TableLayout (表格布局)

表格布局的风格跟 HTML 中的表格比较接近,只是所采用的标签不同。

□<TableLayout > 是顶级元素,采用的是表格布局

□ <TableRow> 定义一个行

□ <TextView > 定义一个单元格的内容

示例main.xml布局文件内容如下:

view plain
  1. <? xml version = "1.0"encoding = "utf-8" ?>  
  2. < TableLayout  
  3. xmlns:android = "http://schemas.android.com/apk/res/android  
  4. android:layout_width ="fill_parent"  
  5. android:layout_height ="fill_parent"  
  6. android:stretchColumns ="0,1,2,3"  
  7. >   
  8. < TableRow >  
  9. < TextView  
  10. android:text = "@string/name"  
  11. android:gravity = "center"  
  12. android:padding = "3dip" />  
  13. < TextView  
  14. android:text = "@string/gender"  
  15. android:gravity = "center"  
  16. android:padding = "3dip" />  
  17. < TextView  
  18. android:text = "@string/age"  
  19. android:gravity = "center"  
  20. android:padding = "3dip" />  
  21. < TextView  
  22. android:text = "@string/phonenum"  
  23. android:gravity = "center"  
  24. android:padding = "3dip" />  
  25. </ TableRow >  
  26. < TableRow >  
  27. < TextView  
  28. android:text = "@string/name1"  
  29. android:gravity = "center"  
  30. android:padding = "3dip" />  
  31. < TextView  
  32. android:text = "@string/gender1"  
  33. android:gravity = "center"  
  34. android:padding = "3dip" />  
  35. < TextView  
  36. android:text = "@string/age1"  
  37. android:gravity = "center"  
  38. android:padding = "3dip" />  
  39. < TextView  
  40. android:text ="@string/phonenum1"  
  41. android:gravity = "center"  
  42. android:padding = "3dip" />  
  43. </ TableRow >  
  44. < TableRow >  
  45. < TextView  
  46. android:text = "@string/name2"  
  47. android:gravity = "center"  
  48. android:padding = "3dip" />  
  49. < TextView  
  50. android:text = "@string/gender1"  
  51. android:gravity = "center"  
  52. android:padding = "3dip" />  
  53. < TextView  
  54. android:text = "@string/age2"  
  55. android:gravity = "center"  
  56. android:padding = "3dip" />  
  57. < TextView  
  58. android:text ="@string/phonenum2"  
  59. android:gravity = "center"  
  60. android:padding = "3dip" />  
  61. </ TableRow >  
  62. </ TableLayout >  

□ android:stretchColumns="0,1,2,3"

该属性指定每行都由第“ 0 、 1 、 2 、 3 ”列占满空白空间。

□ gravity 指定文字对齐方式,案例都设为居中对齐。

□ padding 指定视图与视图内容间的空隙,单位为像素。

对应的 strings.xml 文件内容如下:

view plain
  1. <? xml version = "1.0"encoding = "utf-8" ?>  
  2. < resources >  
  3. < string name = "name" > 姓名 </string >  
  4. < string name = "gender" > 性别 </string >  
  5. < string name = "age" > 年龄 </string >  
  6. < string name = "phonenum"> 电话 </ string >  
  7. < string name = "gender1" >男 </ string >  
  8. < string name = "gender2" >女 </ string >  
  9. < string name = "name1" > 张三 </string >  
  10. < string name = "age1" > 25</ string >  
  11. < string name = "phonenum1"> 1234567 </ string >  
  12. < string name = "name2" > 李四 </string >  
  13. < string name = "age2" > 24</ string >  
  14. < string name = "phonenum2"> 7654321 </ string >  
  15. </ resources >  

界面效果如下:


4.FrameLayout (帧布局)

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

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


编写的mail.xml文件:

view plain
  1. <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_gravity="center"  
  6.     android:id="@+id/frame"  
  7. >  
  8.   
  9.   
  10. </FrameLayout></span>  

在该布局文件中定义一个 id 为 frame 的帧布局文件。
编写 FreamTestActivity.java 类

view plain
  1. <span style="font-size:16px;">package cn.class3g;  
  2.   
  3.   
  4. import android.app.Activity;  
  5. import android.graphics.drawable.Drawable;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.FrameLayout;  
  12.   
  13.   
  14. public class FreamTestActivity extends Activity {  
  15.     FrameLayout frame = null;  
  16.     boolean flag = true;  
  17.   
  18.   
  19.     class MyHandler extends Handler {  
  20.         int i = 0;  
  21.   
  22.   
  23.         public void handleMessage(Message msg) {  
  24.             i++;  
  25.             show(i % 3);  
  26.             sleep(50);  
  27.         }  
  28.   
  29.   
  30.         public void sleep(long delayMillis) {  
  31.             if (flag) {  
  32.                 this.sendMessageDelayed(this.obtainMessage(0), delayMillis);  
  33.             }  
  34.         }  
  35.     }  
  36.   
  37.   
  38.     void show(int i) {  
  39.         Drawable a = getResources().getDrawable(R.drawable.a1);  
  40.         Drawable b = getResources().getDrawable(R.drawable.a2);  
  41.         Drawable c = getResources().getDrawable(R.drawable.a3);  
  42.   
  43.   
  44.         switch (i) {  
  45.         case 0:  
  46.             frame.setForeground(a);  
  47.             break;  
  48.         case 1:  
  49.             frame.setForeground(b);  
  50.             break;  
  51.         case 2:  
  52.             frame.setForeground(c);  
  53.             break;  
  54.         }  
  55.     }  
  56.   
  57.   
  58.     public void onCreate(Bundle savedInstanceState) {  
  59.         super.onCreate(savedInstanceState);  
  60.         setContentView(R.layout.main);  
  61.         frame = (FrameLayout) findViewById(R.id.frame);  
  62.         final MyHandler myHandler = new MyHandler();  
  63.         myHandler.sleep(50);  
  64.         frame.setOnClickListener(new OnClickListener() {  
  65.   
  66.   
  67.             public void onClick(View arg0) {  
  68.                 // TODO Auto-generated method stub  
  69.                 flag = !flag;  
  70.                 myHandler.sleep(10);  
  71.             }  
  72.         });  
  73.   
  74.   
  75.     }  
  76. }</span>  

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


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


好了,这就是我个人的一点收获,如果你在布局样式中有更多的收获,希望能与我分享,谢谢!