Android 布局Layout详解

时间:2021-08-24 15:47:59

 Android系统应用程序一般是由多个Activity组成,而这些Activity以视图的形式展现在我们面前, 视图都是由一个一个的组件构成的。组件就是我们常见的Button、TextEdit等等。那么我们平时看到的Android手机中那些漂亮的界面是怎么显示 出来的呢?这就要用到Android的布局管理器了,网上有人比喻的很好:布局好比是建筑里的框架,组件按照布局的要求依次排列,就组成了用于看见的漂亮界面了。

 在分析布局之前,我们首先看看控件:Android中任何可视化的控件都是从android.veiw.View继承而来的,系统提供了两种方法来设置视图:第一种也是我们最常用的的使用XML文件来配置View的相关属性,然后在程序启动时系统根据配置文件来创建相应的View视图。第二种是我们在代码中直接使用相应的类来创建视图。


      如何使用XML文件定义视图:

      每个Android项目的源码目录下都有个res/layout目录,这个目录就是用来存放布局文件的。布局文件一般以对应activity的名字命名,以 .xml 为后缀。在xml中为创建组件时,需要为组件指定id,如:android:id="@+id/名字"系统会自动在gen目录下创建相应的R资源类变量。 


     如何在代码中使用视图:   

      在代码中创建每个Activity时,一般是在onCreate()方法中,调用setContentView()来加载指定的xml布局文件,然后就可以通过findViewById()来获得在布局文件中创建的相应id的控件了,如Button等。如:

private Button btnSndMag;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);// 加载main.xml布局文件
btnSndMag = (Button)this.findViewById(R.id.btnSndMag); // 通过id找到对于的Button组件
....
}

下面来介绍Android系统中为我们提供的五大布局:LinearLayout(线性布局)、FrameLayout(单帧布局)、AbsoluteLayout(绝对布局)、TablelLayout(表格布局)、RelativeLayout(相对布局)。其中最常用的的是LinearLayout、TablelLayout和RelativeLayout。这些布局都可以嵌套使用。


(1)LinearLayout 线性布局

  线性布局是按照水平或垂直的顺序将子元素(可以是控件或布局)依次按照顺序排列,每一个元素都位于前面一个元素之后。线性布局分为两种:水平方向和垂直方向的布局。分别通过属性android:orientation="vertical" 和 android:orientation="horizontal"来设置。

 android:layout_weight 表示子元素占据的空间大小的比例,有人说这个值大小和占据空间成正比,有人说反比。我在实际应用中设置和网上资料显示的刚好相反,这个问题后面会专门写一篇文章来分析。现在我们只需要按照正比例来设置就可以。


(2)TableLayout 表格布局

  表格布局,适用于多行多列的布局格式,每个TableLayout是由多个TableRow组成,一个TableRow就表示TableLayout中的每一行,这一行可以由多个子元素组成。实际上TableLayout和TableRow都是LineLayout线性布局的子类。但是TableRow的参数android:orientation属性值固定为horizontal,且android:layout_width=MATCH_PARENT,android:layout_height=WRAP_CONTENT。所以TableRow实际是一个横向的线性布局,且所以子元素宽度和高度一致。

  注意:在TableLayout中,单元格可以为空,但是不能跨列,意思是只能不能有相邻的单元格为空。

            在TableLayout布局中,一列的宽度由该列中最宽的那个单元格指定,而该表格的宽度由父容器指定。可以为每一列设置以下属性:

            Shrinkable  表示该列的宽度可以进行收缩,以使表格能够适应父容器的大小

            Stretchable 表示该列的宽度可以进行拉伸,以使能够填满表格中的空闲空间

           Collapsed  表示该列会被隐藏

          TableLayout中的特有属性:

          android:collapseColumns

          android:shrinkColumns

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


(3)RelativeLayout 相对布局

   RelativeLayout继承于android.widget.ViewGroup,其按照子元素之间的位置关系完成布局的,作为Android系统五大布局中最灵活也是最常用的一种布局方式,非常适合于一些比较复杂的界面设计。

   注意:在引用其他子元素之前,引用的ID必须已经存在,否则将出现异常。

   常用的位置属性有:

android:layout_toLeftOf  // 该组件位于引用组件的左方
android:layout_toRightOf // 该组件位于引用组件的右方
android:layout_above // 该组件位于引用组件的上方
android:layout_below // 该组件位于引用组件的下方
android:layout_alignParentLeft // 该组件是否对齐父组件的左端
android:layout_alignParentRight // 该组件是否齐其父组件的右端
android:layout_alignParentTop // 该组件是否对齐父组件的顶部
android:layout_alignParentBottom // 该组件是否对齐父组件的底部
android:layout_centerInParent // 该组件是否相对于父组件居中
android:layout_centerHorizontal // 该组件是否横向居中
android:layout_centerVertical // 该组件是否垂直居中

(4)FrameLayout 框架布局

 将所有的子元素放在整个界面的左上角,后面的子元素直接覆盖前面的子元素,所以用的比较少。

(5) AbsoluteLayou 绝对布局

   绝对布局中将所有的子元素通过设置android:layout_x 和 android:layout_y属性,将子元素的坐标位置固定下来,即坐标(android:layout_x, android:layout_y) ,layout_x用来表示横坐标,layout_y用来表示纵坐标。 屏幕左上角为坐标(0,0),横向往右为正方,纵向往下为正方。实际应用中,这种布局用的比较少,因为Android终端一般机型比较多,各自的屏幕大小。分辨率等可能都不一样,如果用绝对布局,可能导致在有的终端上显示不全等。


常用的布局的属性有: 

1)layout_margin  用于设置控件边缘相对于父控件的边距 

android:layout_marginLeft  
android:layout_marginRight
android:layout_marginTop
android:layout_marginBottom

2) layout_padding  用于设置控件内容相对于控件边缘的边距 

android:layout_paddingLeft 
android:layout_paddingRight
android:layout_paddingTop
android:layout_paddingBottom

3) layout_width/height 用于设置控件的高度和宽度 

wrap_content 内容包裹,表示这个控件的里面文字大小填充 
fill_parent 跟随父窗口
match_parent

4) gravity  用于设置View组件里面内容的对齐方式 

top bottom left   right  center等 

5) android:layout_gravity   用于设置Container组件的对齐方式 

android:layout_alignTop     // 本元素的上边缘和某元素的的上边缘对齐 
android:layout_alignLeft // 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom // 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight // 本元素的右边缘和某元素的的右边缘对齐


众多布局属性如下:

第一类:属性值为true或false
android:layout_centerHrizontal 水平居中
android:layout_centerVertical  垂直居中
android:layout_centerInparent   相对于父元素完全居中
android:layout_alignParentBottom贴紧父元素的下边缘
android:layout_alignParentLeft  贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop   贴紧父元素的上边缘
android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物.


第二类:属性值必须为id的引用名“@id/id-name”
android:layout_below     在某元素的下方
android:layout_above     在某元素的的上方
android:layout_toLeftOf  在某元素的左边
android:layout_toRightOf 在某元素的右边
android:layout_alignTop  本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐

第三类:属性值为具体的像素值,如30dip,40px
android:layout_marginBottom      离某元素底边缘的距离
android:layout_marginLeft        离某元素左边缘的距离
android:layout_marginRight       离某元素右边缘的距离
android:layout_marginTop         离某元素上边缘的距离
EditText的android:hint 设置EditText为空时输入框内的提示信息。


android:gravity 
android:gravity属性是对该view内容的限定.比如一个button上面的text. 你可以设置该text在view的靠左,靠右等位置.以button为例,android:gravity="right"则button上面的文字靠右
android:layout_gravity
android:layout_gravity是用来设置该view相对与起父view的位置.比如一个button在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右


android:scaleType:
android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType/ android:scaleType值的意义区别:
CENTER/center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP/ centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
CENTER_INSIDE/ centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER/ fitCenter  把图片按比例扩大/缩小到View的宽度,居中显示
FIT_END/ fitEnd   把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
FIT_START/ fitStart  把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
FIT_XY/ fitXY  把图片不按比例扩大/缩小到View的大小显示
MATRIX/ matrix 用矩阵来绘制,动态缩小放大图片来显示。

**要注意一点,Drawable文件夹里面的图片命名是不能大写的。注:也不能用纯数字
----------------------------------------------------------------------------------------------------------------------


android:id
为控件指定相应的ID
android:text
指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
android:gravity
指定View组件的对齐方式,比如说居中,居右等位置这里指的是控件中的文本位置并不是控件本身
android:layout_gravity
指定Container组件的对齐方式.比如一个button在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右
android:textSize
指定控件当中字体的大小
android:background
指定该控件所使用的背景色,RGB命名法
android:width
指定控件的宽度
android:height
指定控件的高度
android:layout_width
指定Container组件的宽度
android:layout_height
指定Container组件的高度
android:layout_weight
View中很重要的属性,按比例划分空间
android:padding*
指定控件的内边距,也就是说控件当中的内容
android:sigleLine
如果设置为真的话,则控件的内容在同一行中进行显示
android:scaleType
是控制图片如何resized/moved来匹对ImageView的siz
android:layout_centerHrizontal
水平居中
android:layout_centerVertical
垂直居中
android:layout_centerInparent
相对于父元素完全居中
android:layout_alignParentBottom
贴紧父元素的下边缘
android:layout_alignParentLeft
贴紧父元素的左边缘
android:layout_alignParentRight
贴紧父元素的右边缘
android:layout_alignParentTop
贴紧父元素的上边缘
android:layout_alignWithParentIfMissing
如果对应的兄弟元素找不到的话就以父元素做参照物
android:layout_below
在某元素的下方
android:layout_above
在某元素的的上方
android:layout_toLeftOf
在某元素的左边
android:layout_toRightOf
在某元素的右边
android:layout_alignTop
本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft
本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom
本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight
本元素的右边缘和某元素的的右边缘对齐
android:layout_marginBottom
离某元素底边缘的距离
android:layout_marginLeft
离某元素左边缘的距离
android:layout_marginRight
离某元素右边缘的距离
android:layout_marginTop
离某元素上边缘的距离
android:paddingLeft
本元素内容离本元素右边缘的距离
android:paddingRight
本元素内容离本元素上边缘的距离
android:hint
设置EditText为空时输入框内的提示信息
android:LinearLayout
它确定了LinearLayout的方向,其值可以为vertical,表示垂直布局horizontal,表示水平布局
----------------------------------------------------------------------------------------------------------------------


android:interpolator
可能有很多人不理解它的用法,文档里说的也不太清楚,其实很简单,看下面:interpolator定义一个动画的变化率(therate of change)。这使得基本的动画效果(alpha,scale, translate, rotate)得以加速,减速,重复等。用通俗的一点的话理解就是:动画的进度使用Interpolator控制。interpolator定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator是基类,封装了所有Interpolator的共同方法,它只有一个方法,即getInterpolation (float input),该方法maps a point on the timeline to a multiplier tobe applied to the transformations of an animation。Android提供了几个Interpolator子类,实现了不同的速度曲线,如下:
AccelerateDecelerateInterpolator       在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
AccelerateInterpolator       在动画开始的地方速率改变比较慢,然后开始加速
CycleInterpolator       动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator       在动画开始的地方速率改变比较慢,然后开始减速
LinearInterpolator       在动画的以均匀的速率改变
对于LinearInterpolator,变化率是个常数,即f (x) = x.
public floatgetInterpolation(float input) {
returninput;
}
Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的Interpolator子类,实现抛物线、*落体等物理效果。