Android基础篇-基本布局

Android布局是开发中必不可少的一部分,熟悉一些常用的布局和属性可以大大提高开发效率。

布局名称使用场景使用率
LinearLayout适合比较简单的布局场景,按照水平或垂直方向排列视图频繁
RelativeLayout适合复杂的布局,子布局需要相对于其他布局或父布局进行摆放。频繁
ConstraintLayout适合复杂的布局,通过约束条件轻松排列子视图的位置频繁
FrameLayout适合单一子视图简单布局。覆盖式布局,可以实现布局叠加一般
GridLayout适合展示类似于网格一样、大小相等的多个视图的布局单独用较少,通常用组件RecyclerView创建和管理
TableLayout适合展示表格结构布局较少

编写布局的时候,尽量扁平化布局,减少层级嵌套,因为布局层级越深,UI的加载速度越慢。
通常情况下,不同的布局是需要配合使用的。

设计布局中通用的一些属性如下:
  • layout_gravity 布局重心,将布局中的所有元素位于父元素的某个位置上
  • gravity 重心,把控件内的元素放在控件的某个位置,文本控件适用
  • textAllCaps 按钮英文默认全大写,设置该属性值false允许小写

1.线性布局(LinearLayout)

属性属性值作用
orientation
- vertical:垂直方向
- horizontal:水平方向
选择布局的排列方向
baselineAligned
- true
- false
设置布局子元素的基线对齐,默认是true。对子视图是TextView、Button等包含文本的组件才有效,用于文本对齐功能比较有用
baselineAlignedChildIndex子视图的索引,从0开始指定线性布局元素在垂直方向以指定子视图索引的基线对齐
divider资源文件通过引入资源设置布局中子视图之间的分割效果,需要搭配showDividers一起使用
showDividers
- middle 子视图之间显示
- beginning 第一个视图前显示
- end 最后一个视图后显示
- none 不显示
设置分割效果资源在布局子视图中的显示位置,可以组合使用,如在第一个视图前,最后一个视图后同时显示: android:showDividers=“beginning|end”
dividerPadding像素值设置分割资源的内边距,如果线性布局是垂直布局,表示设置分割资源左右内边距,否则为上下内边距
layout_weight整数如果多个元素设置这个属性,他们会根据权重大小将剩余空间按照比例进行划分空间,通常用来实现均分,按比例划分布局等

使用线性布局构造一个垂直布局,子元素之间需要有分割线,分割线左右不填满。
1.定义分割线的资源divider.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <size android:height="1dp" />
            <solid android:color="@android:color/black" />
        </shape>
    </item>
</layer-list>

2.主布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="@drawable/divider"
        android:dividerPadding="3dp"
        android:orientation="vertical"
        android:showDividers="middle">

        <Button
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_green_dark"
            android:text="Text 1" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_green_dark"
            android:text="Text 2" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_green_dark"
            android:text="Text 3" />
    </LinearLayout>
</LinearLayout>

最终结果是这个样子,对于一些简单的布局通过这种方式设置间隔还是挺好用的。
image.png

2.相对布局(RelativeLayout)

相对布局,顾名思义,就是需要有一个参照物,可以是父布局,也可以是同级的其他布局。
不建议使用left/right,等同于start/end,本文统一忽略left/right的属性定义

属性属性值作用
layout_alignParentTop布尔值置于父容器顶部
layout_alignParentBottom布尔值置于父容器底部
layout_alignParentStart布尔值置于父容器左边
layout_alignParentEnd布尔值置于父容器右边
layout_centerVertical布尔值置于父容器垂直方向居中
layout_centerHorizontal布尔值置于父容器水平方向居中
layout_centerInParent布尔值置于父容器水平垂直居中
layout_alignBaseline参照视图的id设置与参考布局基线对齐
layout_alignTop参照视图的id设置布局和参考布局顶部对齐
layout_alignBottom参照视图的id设置布局和参考布局底部对齐
layout_alignStart参照视图的id设置布局和参考布局左边缘对齐
layout_alignEnd参照视图的id设置布局和参考布局右边缘对齐
layout_below参照视图的id设置布局置于参考布局下方
layout_above参照视图的id设置布局置于参考布局上方
layout_toStartOf参照视图的id设置布局置于参考布局左边
layout_toEndOf参照视图的id设置布局置于参考布局右边

使用相对布局实现以下效果,从代码可以看到,相对布局只需要一层布局就可以定位整个布局元素,实现复杂布局。
image.png

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/music" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="40dp"
        android:layout_marginBottom="50dp"
        android:text="Confirm" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="40dp"
        android:layout_marginBottom="50dp"
        android:text="Cancel" />

    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_alignStart="@+id/tv_tip1"
        android:layout_alignTop="@+id/tv_name"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/iv_icon"
        android:layout_centerHorizontal="true"
        android:text="Welcome"
        android:textSize="27sp" />

    <TextView
        android:id="@+id/tv_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/iv_icon"
        android:layout_alignBaseline="@+id/tv_name"
        android:layout_marginStart="20dp"
        android:layout_toEndOf="@id/tv_name"
        android:text="music"
        android:textSize="17sp" />

    <TextView
        android:id="@+id/tv_tip1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv_name"
        android:layout_centerHorizontal="true"
        android:text="I am RelativeLayout demo"
        android:textSize="21sp" />
</RelativeLayout>

3.约束布局(ConstraintLayout)

约束布局也是一个强大的布局方式,使用简单,对于位置的摆放属性更加容易理解和使用。同时,约束布局还提供一个引导线的控件,其他元素可以相对于这条引导线(参考线,不显示在页面)进行定位,也比较实用,使定位元素更加清晰明确。

属性属性值作用
orientation
- vertical:垂直方向
- horizontal:水平方向
设置引导线的显示方向
layout_constraintGuide_begin像素值设置引导线的起始距离
layout_constraintGuide_end像素值设置引导线的结束距离
layout_constraintGuide_percent小数值0-1之间以比例方式设置引导线的起始距离
layout_constraintTop_toTopOf参照视图的id设置布局和参考布局顶部对齐
layout_constraintBottom_toBottomOf参照视图的id设置布局和参考布局底部对齐
layout_constraintTop_toBottomOf参照视图的id设置布局在参考布局下方
layout_constraintBottom_toTopOf参照视图的id设置布局在参考布局上方
layout_constraintStart_toStartOf参照视图的id设置布局和参考布局左边对齐
layout_constraintEnd_toEndOf参照视图的id设置布局和参考布局右边对齐
layout_constraintStart_toEndOf参照视图的id设置布局在参考布局右边
layout_constraintEnd_toStartOf参照视图的id设置布局在参考布局左边
layout_constraintBaseline_toTopOf参照视图的id设置布局的基线在参考布局上方
layout_constraintBaseline_toBottomOf参照视图的id设置布局的基线在参考布局下方
layout_constraintBaseline_toBaselineOf参照视图的id设置布局基线和参考布局基线对齐,常用于不同字体文本进行文字底部对齐

这里定义一个引导线,可以让多个尺寸不同的控件或视图在引导线上居中居中实现对齐效果。
image.png

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--定义引导线(参考线)-->
    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_end="40dp" />

    <ImageView
        android:id="@+id/iv_icon1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:src="@drawable/wifi"
        app:layout_constraintBottom_toBottomOf="@+id/guideline"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline" />

    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginStart="20dp"
        android:src="@drawable/music"
        app:layout_constraintBottom_toBottomOf="@+id/guideline"
        app:layout_constraintStart_toEndOf="@id/iv_icon1"
        app:layout_constraintTop_toTopOf="@+id/guideline"
        app:layout_constraintVertical_bias="0.1" />

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/music"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_year"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="130dp"
        android:text="2024"
        android:textSize="27sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/iv_icon" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:text="3/6 18:02"
        android:textSize="17sp"
        app:layout_constraintBaseline_toBaselineOf="@id/tv_year"
        app:layout_constraintStart_toEndOf="@+id/tv_year"
        app:layout_constraintTop_toBottomOf="@+id/iv_icon" />


</androidx.constraintlayout.widget.ConstraintLayout>

4.帧布局(FrameLayout)

可以叠加的布局,可以通过通用的定位属性,如margin,padding,layout_gravity等调整位置。
实现如下效果
image.png

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:background="@android:color/holo_green_dark" />

    <View
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        android:background="@android:color/holo_red_dark" />

    <View
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:background="@android:color/holo_blue_dark" />


</FrameLayout>

5.表格布局(TableLayout)

表格布局使用TableLayout父标签,设计一个表格数据,使用TableRow
如果表格的宽度需要改变适应页面宽度,在TableLayout标签中可以设置压缩或拉伸属性,可同时控制多列
注意:如果TableRow中设置TextView没有内容,依然会占据空间,当新增其他元素挤压的时候就会显示出来。

属性属性值作用
stretchColumns列的索引值,可多个,逗号隔开设置第指定列元素可拉伸(表格索引从0开始),自动将页面剩余空间拉伸
shrinkColumns列的索引值,可多个,逗号隔开压缩指定列元素
collapseColumns列的索引值,可多个,逗号隔开设置元素隐藏,从页面消失不占空间
layout_column列的索引值,单个设置当前View所在的列
layout_span列的数量值指定当前View所占的列数,列数跨度
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:stretchColumns="2">

    <!-- 表头 -->
    <TableRow>
        <TextView
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:gravity="center"
            android:text="name"
            android:textStyle="bold" />
        <TextView
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:gravity="center"
            android:text="age"
            android:textStyle="bold" />
        <TextView
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:gravity="center"
            android:text="hobby"
            android:textStyle="bold" />
    </TableRow>

    <!--表格数据行-->
    <TableRow>
        <TextView
            android:gravity="center"
            android:text="张三" />
        <TextView
            android:gravity="center"
            android:text="56" />
        <TextView
            android:gravity="center"
            android:text="下象棋" />
    </TableRow>

    <TableRow>
        <TextView
            android:gravity="center"
            android:text="李四" />
        <TextView
            android:gravity="center"
            android:text="18" />
        <TextView
            android:gravity="center"
            android:text="钓鱼" />
    </TableRow>

</TableLayout>

6.GridLayout网格布局(GridLayout)

网格布局更加灵活,在GridLayout标签要定义几行几列,元素按顺序从左到右,从上到下排列

属性属性值作用
columnCount整数值定义列数
rowCount整数值定义行数
android:layout_columnSpan整数值设置当前Viw所占的列数
layout_rowSpan整数值设置当前Viw所占的行数
layout_column整数值设置当前view所在的列
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:columnCount="4"
    android:rowCount="6">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnSpan="2"
        android:text="0"
        android:textSize="50sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_column="3"
        android:text="清除" />

    <Button
        android:text="1"
        android:textSize="26sp" />

    <Button
        android:text="2"
        android:textSize="26sp" />

    <Button
        android:text="3"
        android:textSize="26sp"/>

    <Button
        android:text="4"
        android:textSize="26sp" />

    <Button
        android:text="5"
        android:textSize="26sp" />

    <Button
        android:text="6"
        android:textSize="26sp" />

    <Button
        android:text="7"
        android:textSize="26sp" />

    <Button
        android:text="8"
        android:textSize="26sp" />
</GridLayout>

以上就是全部内容,欢迎交流补充或修正!

  • 35
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值