您的位置:首页 > 移动开发 > Android开发

Android 布局Layout详解

2014-05-08 23:58 239 查看
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子类,实现抛物线、自由落体等物理效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: