前言:

       Android应用的UI是由层级的视图对象组成的。视图层次起始于一个布局容器。每个视图代表着屏幕上的一块组成。每个视图通过属性来设定自身在屏幕上显现的形态。可以说Android的视图就是由布局容器、容器中的子视图、视图的各种属性串联而成。今天在B哥的指导下 我们对组成视图的各个因素一 一加以探究。

1、Android中视图的表现形式:

       Android使用XML布局与Java代码共同定义视图(用户界面)。你可以使用Java代码来制定所有的视图布局。但在绝大多数情况下是使用XML。使用XML能最大限度的利用Android的自动资源选择特性。在此我们先只介绍以XML形式定义出来的视图

       Android中的每个界面,都会由很多元素组成。比如一个图片、一段文字等等。我们将这些元素按照我们的意愿,并且在Android系统认可的规则下,排布出我们想要的界面。而提供这些规则的。会是一个容器,这种容器我们通常称之为一个布局。组成页面的各个元素,我们都要将之放入到布局容器中,而有时布局本身也是页面组成的一部分,它也是页面的组成元素(这里指的是布局间的嵌套)。Android提供了5种布局容器供我们使用,每一种布局都有自己的规则。我们将界面元素放入某种布局之后。在该布局中的所有元素都要遵循该布局所设定的规则(线性、相对、表格等等),在后面的内容里我们将一 一加以介绍。

       这里我们还要澄清一个概念,这就是我们所提到的元素。大家在这里可以把元素理解成界面的一个部分,即界面是一个一个元素组成的。元素可以是一个布局、一个系统控件、还可以是一个我们自定义的控件。

       如果一个元素(这时一般情况下 这个元素会是一个布局)可以含有、容纳,其他元素。那么我们就可以称之为一个父元素,而被它含有的元素,则称之为它的子元素。一个页面元素。可以同时既是父元素也是子元素(它被别的元素包含、同时它自己也含有另外的元素),这种情况一般出现在布局的嵌套中。页面上的每个元素,都会通过自己的属性来控制自己和子元素的位置、形态等等。所以我们接下来要给大家引入属性的概念。

2、Android中的视图属性:

       为了控制每个元素在页面上的展示。Android提供了种类繁多的元素属性。这些属性决定了每个元素的展现形态。不同的属性设置、组合。造就了元素的千变万化。而各个元素又组成了我们的界面。  视图属性--->组成Android视图基因组的最小单位。在XML中进行属性的设置必须要遵循以下形式:Android:属性名 = “属性值”;

3、重要应用属性

       这里我们选择几种所有元素都会遇到且很容易混淆的属性加以介绍。

²  高和宽

        每视图的高和宽 通过layout_width和layout_height两个属性设定,可以是精确值(XXXdp),可以是象征值match_parent\fill_parent(充满父元素)、wrap_content(占用足够用的父元素空间);一般来说match_parent和wrap_content要比精确值灵活得多,其优点主要体现在象征值可以适配任何屏幕尺寸。 

注意:match_parent和fill_parent都是充满父元素。在Android 2.2开始fill_parent改名为match_parent。fill_parent仍允许向下兼容,如果考虑版本兼容问题,建议使用fill_parent。

²  padding和margin

        两者都是距离属性,区别在于margin定义的是元素与元素之间的距离,padding指的是元素里的内部内容与元素边界的距离。margin对外,padding对内。

 

²  gravity与layout_gravity

       layout_gravity表示的是子元素在父元素中的位置,在这里一定要注意,是位置而不是距离,layout_gravity的值是上下左右的象征值而不是以尺寸单位定义的精确值。换言之是指子元素在父元素中的顶部、底部、中部等等。而gravity是以父元素为视角。来定义自己的子元素,在自身中的位置。二者定义的都是子元素在父元素中的位置,区别就是layout_gravity是子元素需要定义的属性,gravity是父元素需要定义的属性。例如要将一个子元素放置在其父元素的顶部,我们有两种方法可以选择,一是定义子元素的layout_gravity属性设置为top;二是将父元素的gravity属性设置为top;

       在开发中更倾向于使用layout_gravity属性,以子元素为视角只控制自身,这样更加灵活。因为如果要设置父元素的gravity属性,那么其所有子元素都会根据gravity的设定,全部放置在其内部的指定位置;

 

建议:根据实际开发的经验来看,要想灵活的控制视图的位置,我们需要先以gravity与layout_gravity设置其方位,再以padding和margin gravity调整、微调具体距离,来达到我们想要的效果;

²  Android布局的尺寸单位

       Android绝大多数情况下采用了一种特殊的尺寸单位。即dp(density-independent),翻译作 与密度无关像素  简称(写作)dp。1dp=1/160英寸dp这个单位的意义在于逻辑长度单位随着密度变化,对应的像素数量也变化,即你可以根据看到的实际大小,在应用中设置对应的dp值,而使得不同的设备上看起来一样大,从而达到屏幕适配的效果

        Android中使用的尺寸单位有很多,例如 px、sp、pt等等。但是使用dp作为尺寸单位是Android处理不同屏幕尺寸和分辨率的一种方式,这是其他尺寸单位所不具备的。初学者只需要明白指定UI元素大小的时候你应该使用dp作为单位。

Android常见长度单位对照表:

单位名称

名称解释

px

是屏幕的像素点

in

英寸, 屏幕的物理尺寸, 每英寸等于 2.54 厘米。

mm

毫米

pt

磅,1/72 英寸

dp

逻辑长度单位,在 160 dpi 屏幕上,1dp=1px=1/160英寸。随着密度变化,对应的像素数量也变化,但并没有直接的变化比例。

sp

与dp类似,但是可以根据用户的字体大小首选项进行缩放

 

4、Android中的布局

²  FrameLayout

FrameLayout是五大布局中最简单的一个布局,在这个布局中,整个界面被当成一块空白备用区域,所有的子元素都不能被放置到指定的位置,换言之这个容器(布局)没有可以精确放置子元素到指定位置的方法,它会将它的子元素统统放于这块自身区域的左上角(可以通过gravity属性来移动子元素的位置象征值),并且后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分和全部遮挡,所以FrameLayout是一个以层次划分操作的布局,在XML中具体表现是,先定义(下文代码中的a1)的子元素会被放置在布局的最底层,接下来是a2->a4,以用户的视角来说,他会在界面上最先看到是与他“距离最近”的a4。

      

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

   

        android:id="@+id/a1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:src="@drawable/g"

    />

   

        android:id="@+id/a2"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="s1"

        android:background="#FF0000"

        android:textColor="#000000" 

        android:textSize="18dip" 

    />

   

         android:id="@+id/a3"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:src="@drawable/image"

        android:layout_gravity="bottom"

    />

    <TextView

         android:id="@+id/a4"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="s2"

        android:layout_gravity="bottom"

    />

 

²  TableLayout

       TableLayout是展示表格格式数据的Layout(容器),以行和列的形式对其内部的子元素进行管理,每一行为一个TableRow对象,或任意一种的子元素。当一行为一个TableRow元素时,可在TableRow下继续添加子元素,默认情况下,每个子元素占据一列。当一行为一个非TableRow元素时,该元素自己独占一行。如下图:

 

       TableLayout的行数由开发人员直接指定,即有多少个TableRow对象(或其他页面元素),就有多少行。

        TableLayout的列数等于含有最多子元素的TableRow的列数。如一个 TableLayout中有4个TableRow,第一个TableRow含2个子元素,第二个TableRow含3个,第三个TableRow含4个,那么该TableLayout的列数为4.  如上图所示 该TableLayout的列数为4 因为最上面的TableRow含有4个子元素,而底下的TableRow含有3个子元素.

 

TableLayout的重要属性应用。

1、TableLayout的子元素不能指定宽度即layout_width属性是无效的,具体在我们的图中就是S1、S2、S3,此三个元素是不能被设定layout_width属性的,这个是由TableLayout来处理并设置的,但是他们的子元素是可以随意设定layout_width的。

 

2、全局属性(列属性),此类属性是TableLayout本身根据需要,设定的属性。

stretchColumns:设置可伸展的列。该列可以向行方向(横向)伸展,最多可占据一整行。

shrinkColumns:设置可收缩的列。当该列子元素的内容太多,已经挤满所在行,那么该子元素的内容将往列方(纵向)向显示。

collapseColumns :设置要隐藏的列。

说明:列可以同时具备stretchColumns及shrinkColumns属性,若此,那么当该列的内容N多时,将“多行”显示其内容。(这里不是真正的多行,而是系统根据需要自动调节该行的layout_height)

 

举例:

"http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:collapseColumns="2"

    android:shrinkColumns="1"

    android:stretchColumns="0" >

 

    (第0行)