布局简介之线性布局

时间:2021-08-12 20:45:51

   为了让组件在不同手机屏幕上都能运行良好——不同手机屏幕的分辨率、尺寸并不完全相同,如果让程序手动控制每个组件的大小、位置,将给编程带来巨大困难,为了解决这个问题,Android提供了布局管理器。布局管理器可以根据运行平台来调整组件的大小,程序员执照选择合适的布局管理器,而安卓的布局管理器本身就是一个UI组件,所有的布局管理器都是ViewGroup的子类。

布局管理器分为线性布局(LinearLayout)、相对布局(RelativeLayout)、绝对布局(AbsoluteLayout)、帧布局(FrameLayout)、表格布局(TableLayout

 

线性布局

线性布局中的控件是一个挨着一个排列起来的,通过设置android:orientation:属性控制是横向排列还是竖向排列。线性布局的不会换行,当组件排列到头后剩下的组件将不会被显示出来。

属性:android:divider 相关方法setDividerDrawable(Drawable)设置垂直布局时两个按钮 之间的分割条

android:gravity 相关方法setGravity(int)设置布局管理器内部的组件之间的对齐方式

Android:orientation 相关方法 setOrientation(int)设置布局管理器内组件的排列方式,可 以为horizontalvertical

android:weightSum

 

该布局管理器中的组件的属性:android:layout_gravity 指定的是该元素在该布局管理 器中的对齐方式。该属性只能应用于同级的子元素的处理,若子元素都是组件或都是容 器才可以起作用,

Android:layout_weight 指定该子元素在LinearLayout中所占的权重,可以与元素管理器 的weightSum共同使用,并设置width=0dp此时按照计算式计算

<LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="horizontal"
       android:layout_marginTop="10dp"
       android:weightSum="3">


       <!-- 销售 -->
       <LinearLayout
           android:id="@+id/s_layout"
           android:layout_width="0dp"
           android:layout_height="wrap_content"
           android:padding="10dip"
           android:layout_weight="1"
           android:background="@drawable/item_bg"
           android:gravity="center"
           android:orientation="vertical"
           >

           <ImageView
               android:id="@+id/s_imageview"
               android:layout_width="wrap_content"
               android:layout_height="80dip"
               android:scaleType="fitCenter" 
               android:src="@drawable/main1"/>

           <TextView
               android:id="@+id/s_textview"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_marginTop="5dip"
               android:textColor="#404040"
               android:textSize="@dimen/text_size" 
               android:text="@string/xs"/>
       </LinearLayout>

 



Gravitylayout_gravity使用例子:

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

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:gravity="bottom|center_horizontal"

     >

    <LinearLayout 

    android:layout_width="400dp"

    android:layout_height="300dp"

    android:orientation="horizontal"

    >

        <Button

            android:layout_width="100dp"

            android:layout_height="wrap_content"

            android:text="111"

            android:layout_gravity="bottom|center_horizontal"/>

        <Button

            android:layout_width="100dp"

            android:layout_height="wrap_content"

            android:layout_gravity="bottom|center_horizontal"

            android:text="222"/>        

    </LinearLayout>

</LinearLayout>

 

深入理解如何使用weight

定义weight总和的最大值如果未指定该值,以所有子视图的layout_weight属性的累加值作为总和的最大值。

若设置了weightSum则就相当于将容器按照weightSum比例划分了,每个控件的权重就是器所占的比例数。

使用(即按比例分配)

(1)未使用weightSum实现平均分配,线性布局中的所有控件的权重值相同

<LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal">

        <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

        <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

</LinearLayout>

 

(2)未使用weightSum实现平均分配,线性布局中的所有控件的权重值相同

    <LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal">

        <Button

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

        <Button

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

</LinearLayout>

上面这两个例子实现的效果相同,而针对第二个例子可以这样理解,权重和是2,假设线性布局的总长是100,则每个控件的长度是0dp+100/2*1

(3)未使用weightSum按比例分配match_parent

 

<LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal">

        <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="2"/>

        <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>

</LinearLayout>

上面的两个控件所占的比例分别是三分之一和三分之二,而所占比例越大实际分配的控件越小

(4)未使用weightSum按比例分配 0dp

 

<LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal">

        <Button

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="2"

             />

        <Button

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"/>    

</LinearLayout>

此时则按照计算式进行分配假设100是布局管理器的长度分别是0dp+100/3*2 和 0dp+100/3*1

(5)设置weightSum但小于权重和 长度是match_parent

<LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal"

    android:weightSum="2">

        <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="2"

            android:text="2222"

             />

        <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="1111"

             />        

    </LinearLayout>

效果:

 

(6)设置weightSum但小于权重和 长度是0dp

 

<LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal"

    android:weightSum="2">

        <Button

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="2"

            android:text="2222"

             />

        <Button

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="1111"

             />        

</LinearLayout>

 

(7)当weightSum的值与权重和相同时就相当于没有设置weightSum的效果。

(8)当weightSum的值大于权重和时

 

<LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal"

    android:weightSum="4">

        <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="2"

            android:text="2222"

             />

        <Button

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="1111"

             />        

</LinearLayout>

 

(9)当weightSum值大于权重和时 0dp

 

<LinearLayout 

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:orientation="horizontal"

    android:weightSum="4">

        <Button

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="2"

            android:text="2222"

             />

        <Button

            android:layout_width="0dp"

            android:layout_height="wrap_content"

            android:layout_weight="1"

            android:text="1111"

             />        

    </LinearLayout>

通过上面的效果可以看出设置长度为0dp时,会根据比例的计算式分配长度。