当前位置:   article > 正文

Android基础:Android布局

android布局

布局

        安卓布局其实和HTML里的盒子模型类型,也存在padding,margin等。
在这里插入图片描述

Android七大基本布局

  1. 线性布局:LinearLayout
  2. 相对布局:RelativeLayout
  3. 表格布局:TableLayout
  4. 层(帧)布局:FrameLayout
  5. 绝对布局:AbsoluteLayout
  6. 网格布局:GridLayout
  7. 约束布局:ConstraintLayout

        布局用的最多的是线性布局和相对布局。其中表格布局是线性布局的子类,而因为适配的原因,绝对布局几乎是很少见的。

通用属性

属性描述
layout_width
layout_height
padding内边距
margin外边距
visibilityvisible:显示;
invisible:不现实但是占用空间;
gone:不显示也不占用空间
focusable是否可以获取焦点
enabled是否启用该控件
background背景色,16进制值
id唯一标识符(id必须唯一),用于定位该控件

        其中padding和margin可以分别控制单独上下左右,比如paddingTop,paddingLeft, marginRight等。

线性布局LinearLayout

        线性布局是一种非常实用的布局。线性布局具有水平方向垂直方向的两种布局方式。是通过属性“android:orientation”控制布局方向(默认水平方向)

常见属性

布局方向
属性描述
orientation(重要)设置线性布局方向。
horizontal:水平方向
vertical:竖直方向
布局相对位置
属性描述
gravity控制该组件所包含的子元素的对齐方式,可以多个组合,如(left|bottom)。写在父组件里,控制子组件。
layout_gravity控制子组件在父组件中的位置。写在子组件上,控制自己在父组件中的位置。

gravity:
在这里插入图片描述

layout_gravity:
在这里插入图片描述
        如果两个都设置,那么按后者效果来。
在这里插入图片描述

布局权重设置
属性描述
layout_weight设置了布局方向,以 剩余空间 为基准,该控件所占权重。
weightSum定义了weight 总和的最大值(单独设置没效果)。

        这边最关键的词是剩余空间,他指的是在布局方向上,除去所有组件自身所占空间和margin所占空间之后,剩余的值。以水平方向布局为例:水平方向总宽度为700dp,并且有组件A和B,组件A设置layout_width=200dp;layout_margin=50dp; 组件B设置layout_width=100dp;那么水平方向剩余空间为:700-50-200-50-100=300dp。该属性的主要作用可以用来做适配 。
在这里插入图片描述

        这时,我们将剩余空间(300dp)分为3份(weightSum=3),组件A占2份(layout_weight=2),组件B占1份(layout_weight=1)。
在这里插入图片描述        此时,我们不难发现,该水平方向空间占比依次为:marginLeft:50dp ---- 组件A:400dp(200dp+200dp) ---- marginRight:50dp ---- 组件B:200dp(100dp+100dp)。

        注意:weightSum是可以不设置的。如果weightSum没有设置,Android会根据子组件所设置的layout_weight计算出weightSum的值。

分割线(不常用)
属性描述
divider为LinearLayout设置分割线所使用的的图片。
showDividers设置分割线所在位置,值为:none, middle, begining, end。
dividerPadding设置分割线的Padding。

相对布局RelativeLayout

        如果当需要嵌套多层的 LinearLayout,界面就会变得尤为复杂,复杂的界面势必会带来UI Render的效率(渲染速度)降低等问题,而且如果在listview或者GridView上的 item,效率会更低,另外太多层LinearLayout嵌套会占用更多的系统资源,还有可能引发stackoverflow等问题,这时,RelativeLayout就能很好的解决,它仅仅只需要一层就可以完成.而在现实业务需求中,我们常用的方式是:RelativeLayout + LinearLayout的weight属性搭配使用。

常见属性

基本属性
属性描述
gravity控制该组件所包含的子元素的对齐方式,可以多个组合,如(left
ignoreGravity设置该组件是否受gravity影响,如果设置为true,则不受gravity影响。
根据父容器定位
属性描述
layout_alignParentLeft控制该组件左对齐。
layout_alignParentRight控制该组件右对齐。
layout_alignParentTop控制该组件顶部对齐。
layout_alignParentBottom控制该组件底部对齐。

在这里插入图片描述

属性描述
layout_centerHorizontal控制该组件水平居中。
layout_centerVertical控制该组件垂直居中。
layout_centerInParent控制该组件处于中间位置。

在这里插入图片描述

根据兄弟组件定位
属性描述
layout_toLeftOf控制该组件在兄弟组件的左侧。
layout_toRightOf控制该组件在兄弟组件的右侧。
layout_above控制该组件在兄弟组件的上方。
layout_below控制该组件在兄弟组件的下方。
layout_alignTop控制该组件在兄弟组件的上边界。
layout_alignBottom控制该组件在兄弟组件的下边界。
layout_alignLeft控制该组件在兄弟组件的左边界。
layout_alignRight控制该组件在兄弟组件的右边界。

        注意:这里是通过ID去获取兄弟组件的。
在这里插入图片描述
        下面四个组件主要是设置对齐,当比如某个组件比较长或者比较短,设置对齐后可以使得长度一样长。
在这里插入图片描述
在这里插入图片描述

表格布局TableLayout

        在TableLayout中,一个TableRow则为一行。后面我们更多用GridLayout代替TableLayout

常见属性

属性描述
collapseColumns设置需要被隐藏的列的序号
shrinkColumns设置允许被收缩的列的列序号
layout_column设置跳过n个
layout_span设置合并n个单元格

        上述三个属性的序列号都是从0开始算的,比如collapseColumns= “1”,对应的是第二列!当然也可以设置多个,如果需要设置多个,可以用逗号分隔(collapseColumns=“1,2”),如果设置为collapseColumns="*",则所有列都生效

<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    tools:context=".MainActivity">


    <TableRow android:background="@color/cardview_dark_background">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="@color/black"
            android:text="属性"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="@color/black"
            android:text="描述"/>
    </TableRow>
    <TableRow >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="@color/black"
            android:text="collapseColumns"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="@color/black"
            android:text="设置需要被隐藏的列的序号"/>
    </TableRow>
    <TableRow >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="@color/black"
            android:text="shrinkColumns"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="@color/black"
            android:text="设置允许被收缩的列的列序号"/>
    </TableRow>
    <TableRow >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="@color/black"
            android:text="stretchColumns"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16dp"
            android:textColor="@color/black"
            android:text="设置运行被拉伸的列的列序号"/>
    </TableRow>

</TableLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

在这里插入图片描述

帧布局FrameLayout

        FrameLayout(帧布局)可以说是七大布局中最为简单的一个布局,这个布局直接在屏幕上开辟出一块空白的区域,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角,而这种布局方式却没有任何的定位方式,所以它应用的场景并不多;帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时刻就只能看到最上面的那个组件!后续添加的控件会覆盖前一个!

常见属性

属性描述
foreground设置改帧布局容器的前景图像
foregroundGravity设置前景图像显示的位置

        帧布局用的不是很多,在这里不详细介绍了,感兴趣的可以看:帧布局。

网格布局GridLayout

        网格布局是Android 4.0以后引入的一个新的布局,可以很方便的设置N行N列。

常见属性

属性描述
orientation设置线性布局方向。
horizontal:水平方向
vertical:竖直方向
layout_gravity控制子组件在父组件中的位置。写在子组件上,控制自己在父组件中的位置。
rowCount设置网格布局行数
columnCount设置网格布局列数
layout_row设置组件位于第N行
layout_column设置组件位于第N列
rowSpan设置组件纵向横跨N行
columnSpan设置组件横向向横跨N行

        网格布局用的不是很多,在这里不详细介绍了,感兴趣的可以看:网格布局。

约束布局ConstraintLayout(重要)

        约束布局是一个比较好用的布局,他是一个ViewGroup,他可以直接Design上直接拖动设置,也可以写代码去实现。约束布局需要X和Y轴都至少设置一个约束才能控制布局。他的出现主要是为了解决布局嵌套过多的问题。

基线对齐

	   // 开始于某个指定组件的开始
       app:layout_constraintStart_toStartOf
       // 开始于某个指定组件的结束
       app:layout_constraintStart_toEndOf
       // 结束于某个指定组件的开始
       app:layout_constraintEnd_toStartOf
       // 结束于某个指定组件的结束
       app:layout_constraintEnd_toEndOf
       
       app:layout_constraintTop_toTopOf
       app:layout_constraintTop_toBottomOf
	   app:layout_constraintBottom_toTopOf
       app:layout_constraintBottom_toBottomOf
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

        这些是约束布局的重要基线对齐约束,他是以你指定的组件为基础去实现约束,这里因为考虑各国的使用习惯,就用start,end代替了left和right。

角度对齐

app:layout_constraintCircle=""         目标控件id
app:layout_constraintCircleAngle=""    对于目标的角度(0-360)
app:layout_constraintCircleRadius=""   到目标中心的距离
 
  • 1
  • 2
  • 3
  • 4

百分比偏移

app:layout_constraintHorizontal_bias=""   水平偏移 取值范围是0-1的小数
app:layout_constraintVertical_bias=""     垂直偏移 取值范围是0-1的小数
  • 1
  • 2

        控件A在父布局水平方向偏移0.24指的是24%

控件内边距、外边距

<!--  外边距  -->
android:layout_margin="0dp"
android:layout_marginStart="0dp"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp"
android:layout_marginEnd="0dp"
android:layout_marginRight="0dp"
android:layout_marginBottom="0dp"
 
<!--  内边距  -->
android:padding="0dp"
android:paddingStart="0dp"
android:paddingLeft="0dp"
android:paddingTop="0dp"
android:paddingEnd="0dp"
android:paddingRight="0dp"
android:paddingBottom="0dp" 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

GONE Margin

app:layout_goneMarginBottom="0dp"
app:layout_goneMarginEnd="0dp"
app:layout_goneMarginLeft="0dp"
app:layout_goneMarginRight="0dp"
app:layout_goneMarginStart="0dp"
app:layout_goneMarginTop="0dp"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

        该属性的使用场景主要是:如果A控件的布局依赖B控件,但是B组件隐藏了,这时候原本的margin会失效,这时候就要用到goneMargin。但是,当目标控件是显示的时候GONE Margin不会生效。

目前ConstraintLayout使用的不多,由于开发任务相对紧张,暂时更新到这,具体更详细的,请参照:史上最全ConstraintLayout使用详解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/270285
推荐阅读
相关标签
  

闽ICP备14008679号